Lec 10 Comp
Lec 10 Comp
X Una variable aleatoria continua es aquella cuyo rango de valores es cualquier intervalo de la recta real, entre las ms conocidas estn: la uniforme, la exponencial, la gamma, la JiCuadrado, la Beta, la Normal, la t de Student, la Cauchy, la Weibull,etc. Si la variable aleatoria continua X tiene rango de valores RX entonces existe una funcin no-negativa
t
f(x)
tal
que
P(a<X<b)= f ( x)dx .
a
Asimismo.
la
funcin
F(t)=P[Xt]=
f ( x)dx
Existen varios mtodos generales y varios mtodos particulares para generar valores de una variable aleatoria con una distribucin dada. Muchos de ellos basados en relaciones que existen entre diversas variables aleatorias. Solo veremos el mtodo de la transformacin inversa y el mtodo de aceptacin y rechazo. Por otro lado, solo discutiremos la generacin de la distribucin exponencial y normal.
2.5.1.1 Mtodo de la Transformacion Inversa
Si X es una funcin de densidad continua con funcin de distribucin acumulativa F(x) entonces Y=F(X) se distribuye uniformemente en el intervalo (0,1) En efecto, la distribucin acumulativa de Y est dado por G(y)=P[Yy]=P[F(X)y]=P[XF-(y)]=F(F-(y))=y para 0y1, la cual corresponde a una acumulativa de una U(0,1). En consecuencia para generar un valor de la variable aleatoria X con acumulada F(X) se sigue los siguientes pasos: 1. Generar U= U(0,1) usando la funcin runif en R o rand en Matlab. 2. Tomar x=F-1(U)
98
Ejemplo (Generacin de una variable aleatoria Exponencial) Sea X una variable aleatoria exponencial con parmetro >0, entonces su funcin de densidad es f(x)=e-x para x>0 y su funcin de distribucin acumulativa es F(x)=1- e-x para x>0. Luego, U=1- e-x
En consecuencia, Log(U-1)= -x X=
log(U 1)
distribuye uniformemente en (0,1). As, x=-log(U)/ sera la exponencial generada. La siguiente funcin exporand en R genera m valores exponenciales con exporand=function(lambda,n) {if (lambda<=0){ stop(lambda debe ser positivo)} else {x=-log(runif(n))/lambda} x} > #generando 10 valores exponenciales com lambda=3.5 >exporand(3.5,10) [1] 0.2748450 0.3956703 0.6047322 0.4420424 0.3177109 0.1501418 0.7154897 [8] 0.1226956 0.3752534 0.2857398 > #haciendo um histograma de 1000 exponenciales com lambda=.5 >hist(exporand(0.5,1000),col=3) > La funcin rexp de R genera valores de una variable aleatoria exponencial.
99
10 exporand(0.5, 1000)
15
En Matlab. function e = exporand(lambda,m,n); % % % % % E=EXPORAND(U,m,n) genera una matriz m por n con valores de una distribucion exponencial E = EXOPRAND(lambda) genera un solo valor, un vector o una matriz de valores exponenciales dependiendo de las dimensiones del parametro lambda
%Cotejando que la funcion tenga los argumentos correctos if nargin < 1, error('Se requiere al menos un argumento de entrada.'); end if nargin == 1 [errorcode rows columns] = rndcheck(1,1,lambda);
100
end if nargin == 2 [errorcode rows columns] = rndcheck(2,1,lambda,m); end if nargin == 3 [errorcode rows columns] = rndcheck(3,1,lambda,m,n); end if errorcode > 0 error('El tamao de la informacion es inconsistente.'); end %Initializar la matriz e como cero. e = zeros(rows, columns); % Generando los valores usando la transformacion inversa u = rand(rows,columns); e = - log(u)./lambda; % Retornando NaN si el lambda no es positivo. if any(any(lambda <= 0)); tmp = NaN; if prod(size(lambda) == 1) r = tmp(ones(rows,columns)); else k = find(lambda <= 0); r(k) = tmp(ones(size(k))); end end
A continuacin se presentan algunos ejemplos del uso de la funcin. exporand(2) ans = 0.2828
exporand(2.5,4,5) ans = 0.1996 0.3181 1.7414 1.3371 1.6453 0.1849 1.2504 0.3829 0.1962 0.6641
101 0.3972 1.4420 0.1524 0.1987 0.2131 0.2213 0.4650 0.9507 1.6601 1.1418 X=[4 6 2.5 8 9 1.5]' X= 4.0000 6.0000 2.5000 8.0000 9.0000 1.5000
La idea aqu es que se tiene una variable aleatoria Y con funcin de densidad g(y), la cual puede ser generada fcilmente. Se desea generar otra variable X con funcin de densidad f(x), para ello se genera un valor de Y con densidad g(y) y se toma x=Y con probabilidad proporcional a f(y)/g(y). Esto es, P[X=y]=k f(y)/g(y), donde k es la constante de proporcionalidad. Si c es una constante tal que f(y)/g(y)c para todo y, entonces el siguiente seria el algoritmo de aceptacin y rechazo para generar una variable aleatoria X con funcin de densidad f(x). Paso 1: Generar Y con densidad g Paso 2: Generar una variable aleatoria uniforme U(0,1) Paso 3: Si Uf(Y)/cg(Y) entonces X=Y de lo contrario volver al paso 1. Mientras ms cerca se encuentre f de g ms rpidamente se obtendr la cantidad deseada de valores aleatorios de X. Usualmente se toma la densidad uniforme como la densidad g(y) y en ese caso el mtodo de aceptacin y rechazo es llamado hit and miss.
102
Ejemplo. Usar el mtodo de aceptacin y rechazo para generar valores de una variable aleatoria con funcin de densidad
f(x)=20x(1-x)3 ,
0<x<1
Solucin: Tomaremos como g a la densidad uniforme, esto es g(y)=1, 0<y<1. As que lo hay que determinar es la constante c tal que f(y)c para todo 0<y<1. Derivando f(x) se obtiene: f(x)=20(1-x)3-60x(1-x)2=20(1-x)2[1-x-3x]= 20(1-x)2[1-4x] f(x)=0 implica x=1 o x=1/4. Claramente, f(1/4)=5(3/4)3=135/64 es el mximo de f en (0,1). En consecuencia, f(x)135/64 para todo 0 x 1 .Luego, para generar valores de la variable con densidad anterior se siguen los siguientes pasos: 1. Generar valores de una variable aleatoria U1. 2. Generar valores de una variable aleatoria U2. 3. Si U220U1(1-U1)3/(135/64)=(256/27) U1(1-U1)3 entonces X=U1, de lo contrario volver al paso 1.
La siguiente funcion en R, genera valores aleatorios de la densidad del ejemplo anterior Beta24=function(n) { X=NULL count=1 while(count<=n) {U1=runif(1) U2=runif(1) if(U2<=(256/27)*U1*(1-U1)^3) {X=c(X,U1) count=count+1} } X } El siguiente script en MATLAB genera valores aleatorios de la densidad del ejemplo % Generando un vector de valores para el ejemplo 1 usando % el metodo de aceptacion y rechazo rand1 = rand(10,1) rand2 = rand(10,1) k=find(rand2<=(256/27)*rand1.*(1-rand1).^3) b24=rand1(k)
2.5.1.3 Generacin de valores de una distribucin normal La distribucin Normal o Gaussiana es la ms conocida de las distribuciones y la ms aplicada en estadstica. Tiene dos parmetros y y su funcin de densidad est dada por
103
( x ) 2 2 2
f ( x) =
e 2
donde - < x < , - < < y >0. Cuando =0 y =1 se obtiene la distribucin normal estndar. Existen varios mtodos de generar valores de una distribucin normal: a) Aplicando el Teorema del Limite central a una suma de uniformes.
U i N (0,1 / 12)
i =1
b) El Mtodo Polar (o Transformacin de Box-Miller , 1958) c) El Mtodo Polar de Marsaglia (1962) d) El Mtodo de Mezclas (kinderman y Ramage, 1976) e) El Mtodo de Rechazo de Forsythe (1972) A continuacin se aplicar el mtodo de aceptacin y rechazo para generar una normal. Antes que nada hay que notar que si Z es N(0,1), entonces X=| Z | tiene funcin de densidad
2 x2 f ( x) = e 2
donde x>0.. Podemos considerar la funcin de densidad de una exponencial con =1, esto es g(x)=e-x para x>0. Luego,
f ( x) = 2 / e x x / 2 g ( x)
2
cuyo mximo ocurrir cuando x-x2/2 sea mximo y eso ocurre cuando x=1. En consecuencia c=max(f(x)/g(x))=
2e / .
2
El procedimiento anterior generar X=|Z|. Para llegar a Z simplemente se le asigna signo positivo o negativo a X dependiendo de si una variable aleatoria uniforme U2 es o no mayor que .
104
El siguiente sera pues el algoritmo para generar una normal Paso 1. Generar Y una exponencial con parmetro 1. Paso 2. Generar dos variables aleatorias uniformes U1 y U2. Paso 3 Si U1 exp(-(Y-1)2/2) y U2>1/2 hacer Z=Y. Si U1 exp(-(Y-1)2/2) y U21/2 hacer Z=-Y. Hacer Z=-Y . En otro caso volver al paso 1. La siguiente funcin en R genera valores de una distribucin normal y hace su histograma rnormar=function(n) {norm1=NULL count=1 while(count<=n) {y=rexp(1) U1=runif(1) U2=runif(1) if(U1<=exp(-.5*(y-1)^2) && U2<=.5) { norm1=c(norm1,-y) count=count+1 } if(U1<=exp(-.5*(y-1)^2) && U2>.5) { norm1=c(norm1,y) count=count+1} } norm1 } > rnormar(10) [1] 0.44065050 -2.64843957 -1.92816070 0.26199993 -0.94323696 -0.90815978 [7] -0.52152141 -0.46480357 0.02584946 -0.28069635 > hist(rnormar(1000)) > hist(rnormar(1000),col=4) >
105
Histogram of rnormar(1000)
Frequency
50
100
150
-3
-2
-1
0 rnormar(1000)
En R, hay la funcin rnorm , que genera valores de una normal con una media y una desviacin estndar dadas.
En Matlab % Generando un vector de valores de una normal usando % el mtodo de aceptacion y rechazo y=exporand(1,10000,1); rand1 = rand(10000,1); rand2 = rand(10000,1); k1=find(rand1<=exp(-.5.*(y-1).^2)& rand2<=.5); k2=find(rand1<=exp(-.5.*(y-1).^2)& rand2>.5); nor1=-y(k1); nor2=y(k2); nor=[nor1' nor2']' hist(nor)
106 MATLAB tiene una funcin RANDN que genera valores de una normal estndar
2.5.2 Generacin de variables aleatorias discretas. Nuevamente aqui veremos solamente el mtodo de la transformacin inversa y el mtodo de aceptacin y rechazo. 2.5.2.1 Mtodo de la transformacin Inversa Hay que recordar que si X es una variable aleatoria discreta con valores x1, x2, Entonces su funcin de probabilidad P(x=xj)=pj para j=1,2,., satisface
pj=F(xj)-F(xj-1) donde F representa la acumulada de X. Como la acumulada se puede considerar como una variable aleatoria U uniforme en (0,1) se tendra que X=xj si F(xj-1) U <F(xj) En consecuencia el algoritmo quedara como sigue: Paso 1. Generar una uniforme U Paso 2. Hacer Si U<p1 hacer X=x1 y parar. Paso 3. Si U<p1+p2 hacer X=x2 y parar. Paso 4. Si U <p1+p2+p3 hacer X=x3 y parar y as sucesivamente.
2.5.2.2 Generacin de variables aleatorias binomiales Recordar que una variable aleatoria binomial con parmetros n y p tiene funcin de probabilidad
n P ( X = k ) = p k (1 p ) nk k
para k=0,1,2, .n Desarrollando la combinacin y trabajando algebraicamente la razn P(X=k+1)/P(X=k), se puede establecer que
P ( X = k + 1) =
nk p P( X = k ) k +11 p
Aplicando el mtodo de la transformacin Inversa y la identidad anterior se obtiene el siguiente procedimiento para generar una Binomial, B(n,p) Paso1: Generar un nmero aleatorio U Paso 2 Hacer c=p/(1-p) , k=0, prob=(1-p)n y F=prob Paso 3. Si U<F, hacer X=k y parar Paso 4. Hacer Prob=[c(n-k)/(k+1)]Prob, F=F+prob, k=k+1 Paso 5. Ir al paso 3.
107
A siguiente funcin escrita en R genera valores de una binomial > ranbin function(N,p,n) { X=rep(0,N) for(count in 1:N) X[count]=ranbin1(p,n) X } > ranbin1 function(p,n) { c1=p/(1-p) k=0 prob=(1-p)^n F=prob U=runif(1) while(U>=F) {prob=(c1*(n-k)/(k+1))*prob F=F+prob #print(F) k=k+1 } X=k X } > a=rbinom(10,6,.2) >a [1] 1 1 1 1 0 3 2 2 1 1 > hist(rbinom(10000,6,.2),col=3) >
108
rbinom(10000, 6, 0.2)
En R, hay la funcin rbinom que genera valores de una variable aleatoria binomial.
2.5.2.3. Mtodo de Aceptacin y Rechazo
Supongamos que tenemos una variable discreta Y fcil de generar y que tiene una funcin de probabilidad qj=P[Y=yj] . Consideremos otra variable aleatoria X con funcin de probabilidad pj=P]X=j] la cual deseamos generar. La idea aqui es usar Y para generar X, parar ello hay que encontrar una constante c tal que pj/qjc para todo j y luego aplicar el siguiente procedimiento: Paso 1. Generar la variable aleatoria Y Paso 2. Generar una variable aleatoria Uniforme U Paso 3. Si U<pj/cqj hacer X=Y y parar. De lo contrario ir al paso 1.