\(f(x)=20x(1-x)^3 .....0<x<1\) Funcion objetivo
\(g(x)=1 .....0<x<1\).funcion auxiliar
Genere numeros aleatorios de la función auxiliar y tambien genere de una uniforme continua entre cero y uno \(Y \sim g\) ; \(U\sim U_{(0,1)}\)
acepte \(x=y\), si \(u<=f(Y)/C*g(Y)\); $ C=máx{f(x)/g(x)}$
En caso contrario, regrese al paso 1.
| Recoredemos: |
| Si tenemos que \(g(x)=1\) \(0<x<1\) Funcion de densidad de probabilidad. Y si queremos generar numeros aleatorios de ella por el metodo de la inversion debemos conocer su \(G(x)\) que en este caso es X, y evaluar su inversa en una uniforme \(u{(0,1)}\). Por tanto para este caso, X=U donde U es una \(u{(0,1)}\) |
f=function(x){20*x*(1-x)^3} ##función objetivo
g=function(x){1} ###funcion auxiliar
fg=function(x){(20*x*(1-x)^3)/1} #cociente entre las 2 funciones
Veamos la grafica de la funcion objetivo.
curve(f(x),from=0,to=1) #curva de la funcion de densidad de beta desde o hasta 1
Ahora aplicamos el algoritmo:
x1<-0
Y<-runif(n=1,min = 0,max = 1) #genere de una uniforme#de la auxiliar, en este caso coincide
U<-runif(n=1,min = 0,max = 1)#genere de una uniforme
c1=optimize(fg,interval = c(0,1),maximum = TRUE)$objective ##Calculamos el C maximo
##criterio de decicion:
if(U<=(1/c1)*fg(U)){x1=Y}
x1
## [1] 0.1481245
Lo anterior solo esta corriedo una vez, Hagamoslo para muchas:
x<-0
nsim<-5000
k<-0 #es un contador
j<-0 # es un contador
X<- numeric(nsim) #donde guardara la información, o puede ir en vacio
c1=optimize(fg,interval = c(0,1),maximum = TRUE)$objective
while(k<nsim){ #para un control de que va a terminar en algun momento
U<-runif(1)
j<-j+1 #para ver cuantas veces ingresa en k<nsim
Y<-runif(1) #de la funcion auxiliar g(x)
#citerio de decision:
if(U<=(1/c1)*fg(Y)){
k<-k+1
x[k]=Y
}
}
#x por comodidad no los mostrare
j #cuantos entran al while
## [1] 10592
k
## [1] 5000
hist(x,freq = FALSE)
curve(f(x),from=0,to=1,add = TRUE) #curva de la funcion de densidad de beta desde o hasta 1
Conclusion: Graficamente notamos que los datos simulados si probienen de la funcion f(x); los datos simulados se ajuastan a la curva teorica.
x<-0
nsim<-10000
k<-0 #es un contador
j<-0 # es un contador
X<- numeric(nsim) #donde guardara la información, o puede ir en vacio
c1=optimize(fg,interval = c(0,1),maximum = TRUE)$objective
while(k<nsim){ #para un control de que va a terminar en algun momento
U<-runif(1)
j<-j+1 #para ver cuantas veces ingresa en k<nsim
Y<-runif(1) #de la funcion auxiliar g(x)
#citerio de decision:
if(U<=(1/c1)*fg(Y)){
k<-k+1
x[k]=Y
}
}
#x por comodidad no los mostrare
j #cuantos entran al while
## [1] 21246
k
## [1] 10000
hist(x,freq = FALSE)
curve(f(x),from=0,to=1,add = TRUE) #curva de la funcion de densidad de beta desde o hasta 1
n <- 5000
p <- 0.4 # pongamos par esta probabilidad en particular
u <- runif(n)
x <- as.integer(u >1-p) #(u > 0.6) is a logical vector
#x #estos son los x generadps pero no los mostrare en pantalla
plot(factor(x))
mean(x) #para ver que la media estimada coincide con la teorica
## [1] 0.4028
var(x)
## [1] 0.2406003
ks.test(x,dbinom(x= 5000, size = 1, prob = 0.4)) ##prueba de bondad de aguste, como el p>0.05 lus datos si se ajustan a la distribucion bernulli
## Warning in ks.test(x, dbinom(x = 5000, size = 1, prob = 0.4)): cannot compute
## exact p-value with ties
##
## Two-sample Kolmogorov-Smirnov test
##
## data: x and dbinom(x = 5000, size = 1, prob = 0.4)
## D = 0.4028, p-value = 0.9969
## alternative hypothesis: two-sided
n <- 10000
p <- 0.4 # pongamos par esta probabilidad en particular
u <- runif(n)
x <- as.integer(u >1-p) #(u > 0.6) is a logical vector
#x
plot(factor(x))
mean(x) #para ver que la media estimada coincide con la teorica
## [1] 0.3941
var(x)
## [1] 0.2388091
ks.test(x,dbinom(x= 10000, size = 1, prob = 0.4)) ##prueba de bondad de aguste, como el p>0.05 lus datos si se ajustan a la distribucion bernulli
## Warning in ks.test(x, dbinom(x = 10000, size = 1, prob = 0.4)): p-value will be
## approximate in the presence of ties
##
## Two-sample Kolmogorov-Smirnov test
##
## data: x and dbinom(x = 10000, size = 1, prob = 0.4)
## D = 0.3941, p-value = 0.9977
## alternative hypothesis: two-sided
para dar solución, pensemos en el metodo de la inversión.
rPoisson <- function(lambda = 1){
U <- runif(1)
i <- 0
p <- exp(-lambda)
f <- p
while(U >= f){
p <- lambda * p / (i + 1)
f <- f + p
i <- i + 1
}
i
}
sim5000<- replicate(5000,rPoisson())
sim10000<-replicate(1000,rPoisson())
plot(factor(sim5000))
plot(factor(sim10000))
Veamos la grafica para los numeros aleatorios “teoricos” generados con R, y veamos que gráficamente son igules.
x<-rpois(5000,1)
plot(factor(x))
x<-rpois(10000,1)
plot(factor(x))
Prueba de bondad de ajuste: para n=5000 y n=10000
ks.test(sim5000,dpois(5000,1))
## Warning in ks.test(sim5000, dpois(5000, 1)): cannot compute exact p-value with
## ties
##
## Two-sample Kolmogorov-Smirnov test
##
## data: sim5000 and dpois(5000, 1)
## D = 0.6292, p-value = 0.8235
## alternative hypothesis: two-sided
ks.test(sim10000,dpois(10000,1))
## Warning in ks.test(sim10000, dpois(10000, 1)): cannot compute exact p-value with
## ties
##
## Two-sample Kolmogorov-Smirnov test
##
## data: sim10000 and dpois(10000, 1)
## D = 0.637, p-value = 0.8123
## alternative hypothesis: two-sided
Luego los datos generados si se ajustan a una distribución Poisson, por que el p>0.05