%% Práctica 5. Generación y transformación de números aleatorios
% Métodos Matemáticos para Telecomunicaciones.
% Copyright (c) 2023 G.T.A.S. (Grupo Tratamiento Avanzado de Señal). Universidad de Cantabria.
%
% Práctica sobre los conceptos de probabilidad, variable aleatoria y función de variable aleatoria vistos en el aula en los temas 1, 2 y 3 de Métodos Matemáticos para Telecomunicaciones.
%% Apartado 1. Números aleatorios
% Este apartado ilustra la generación de números aleatorios de una variable aleatoria uniforme en [0,1] y el análisis estadístico de los mismos.
%% Generación de realizaciones de v.a. uniforme
% Utilizamos la función rand de Matlab para generar N=100000 realizaciones de una v.a. uniforme

N = 100000;     % Número de realizaciones
x = rand(1,N);  % N Realizaciones de v.a. uniforme en [0,1]

%% Análisis estadístico de las realizaciones
% Para caracterizar completamente una variable aleatoria usamos su fdp o su función distribución. Por otro lado, el rango, la media y la varianza, por citar algunos, nos aportan información importante, pero parcial, sobre la variable aleatoria en cuestión.
% Sin embargo, en ocasiones disponemos únicamente de una serie de realizaciones de una variable aleatoria, como por ejemplo el vector x que acabamos de generar y que contiene N=100000 realizaciones de una v.a. (que, en este caso, es uniforme en [0,1])
% A partir de dichas realizaciones sólo podemos aspirar a representar su histograma para intentar estimar la fdp teórica, o a calcular frecuencias relativas que aproximan a la probabilidad teórica, o a obtener la media muestral como estimación de la verdadera media, etc.
%% Histogramas
% Representamos el histograma de las realizaciones usando la función histogram de Matlab.
% En primer lugar se emplea un histograma en el que en el eje vertical se representa el número de realizaciones que resultan en cada uno de los intervalos del histograma. Para ello basta con ejecutar la función histogram pasándo como argumento el vector (o matriz) con las realizaciones generadas:

histogram(x);xlabel('x');ylabel('Nº de realizaciones')

% Otra opción es representar el histograma de manera que el área de cada barra sea igual a la frecuencia relativa de cada intervalo del histograma. Dicho de otra manera, que la altura del histograma sea igual a la frecuencia relativa de cada intervalo del histograma dividido por la anchura del intervalo, es decir, barras de anchura \Delta x y de altura \frac{n_x}{N \Delta x}, donde N es el número de realizaciones de la v.a. X y n_x el número de resultados pertenecientes a un intervalo de longitud \Delta x. En resumen:
% Área la barra del histograma =  \frac{n_x}{N} \simeq P(x < X \leq x+\Delta x)
% Altura la barra del histograma =\frac{n_x}{N\Delta x} \simeq \frac{P(x < X \leq x+\Delta x)}{\Delta x} \simeq f_X(x)
% En definitiva, un histograma así construido (con este escalado)  será una aproximación de (nos permite estimar) la función densidad de probabilidad de la variable aleatoria subyacente. Para hacerlo con Matlab basta con asignar a la propiedad 'Normalization' el valor 'pdf' cuando se ejecuta la función histogram:

histogram(x,'Normalization','pdf');xlabel('x');ylabel('frec. relativa/anchura intervalo')

% El alumno deberá comprobar que el histograma así normalizado se aproxima a la función densidad de probabilidad teórica de la variable aleatoria considerada (en el caso inicial una v.a. uniforme en [0,1]).
% Otra opción interesante de la función histogram es incluir un argumento en forma de vector que indique los extremos de los intervalos en los cuales se quiere que se evalúe el histograma. En el siguiente ejemplo se usa el vector -2:0.5:2 para que se evalúe el histograma entre -2 y 2 usando intervalos de anchura 0.5. El alumno puede/debe modificar dicho vector para una representación adecuada y significativa del histograma.

histogram(x,-2:0.05:2,'Normalization','pdf');xlabel('x');ylabel('frec. relativa/anchura intervalo')

%
%% Estadísticos: Media y Varianza
% La media y la varianza son, por ese orden, los estadísticos de una variable aleatoria más importantes y usados. En nuestro caso simplemente disponemos de N realizaciones de la v.a: los N valores del vector x. Por ello únicamente podremos calcular la denominada media muestral (y la varianza muestral) usando la función mean (y var):

fprintf('Media muestral = %f\n',mean(x));
fprintf('Varianza muestral: %f\n',var(x));

% Estos valores son una aproximación (una estimación) de los verdaderos valores de media y varianza de la variable aleatoria subyacente (en el caso inicial una v.a. uniforme en [0,1], cuya media y varianza teórica son ¿?). Compruebeló.
%
%% Ejercicios a realizar
%
% A partir del vector de realizaciones, x, ¿cómo podría estimar con Matlab la probabilidad de que, por ejemplo, X>0.8?
% Ejecute el Live Script varias veces para observar la variabilidad estadística en los resultados (tanto en los histogramas como en  las medias y varianzas estimadas). Observe el impacto de reducir el número, N, de realizaciones.
% Pruebe con otro tipo de variable aleatoria. Por ejemplo use randn(1,N) (realizaciones de v.a. Gaussiana) o exprnd(1/2,1,N) (realizaciones de v.a. exponencial de parámetro c=2) en lugar de rand(1,N).
% Intente estimar, a la vista del histograma, cuál sería el rango de cada una de las variables aleatorias generadas y dónde estaría el valor máximo de la f.d.p.(a dicho valor de x se le conoce como moda de la v.a.)
%
%% Apartado 2. Transformación de v.a.
% Este ejercicio ilustra cómo se transforman variables aleatorias (sus realizaciones) y cómo analizar estadísticamente los resultados de dicha transformación.
%% Transformación de realizaciones de una v.a.
% Utilizamos la función rand de Matlab para generar N=100000 realizaciones de X, una v.a. uniforme en [0,1].

N = 100000;     % Número de realizaciones
x = rand(1,N);  % N Realizaciones de v.a. uniforme en [0,1]

% Se aplica la transformación Y=g(X). Inicialmente realizaremos una transformación sencilla (lineal, en este caso) del tipo Y=aX+b, por ejemplo

y = 10*x+20;

%% Análisis estadístico de las realizaciones resultantes
% Antes de continuar, piense cúal sería el rango de la variable aleatoria resultante, Y.
% Represente el histograma y analice cómo es la v.a. resultante

% histogram(...

% Estime la media y la varianza resultantes:

fprintf('Media muestral = %f\n',mean(y));
fprintf('Varianza muestral: %f\n',var(y));

% Dada la transformación que ha realizado, ¿cree que sería posible conocer la media de la variable aleatoria resultante sin tener que hacer la transformación, es decir, sin disponer del vector y?, ¿cómo?. ¿Podría hacer algo similar para conocer la varianza?
%
%% Ejercicios a realizar
%
% Pruebe con otro tipo de transformación. Utilice otros valores de a y b en Y=aX+b. Aplique otros tipos de transformaciones sencillas, como por ejemplo Y=X^2 , Y=cos(\pi X), etc.
% Pruebe con otro tipo de variable aleatoria de partida, por ejemplo Gaussiana o exponencial.
% Si sólo dispone de los vectores de Matlab  x (realizaciones de la v.a. original) e y (realizaciones de la v.a. resultado de la transformación Y=g(X) ) , ¿se le ocurre alguna forma de inferir o representar la función de transformación y=g(x)?