1.- Escribir el código necesario para generar, por el método de inversión, una muestra de n observaciones de una distribución de Cauchy.
#Usando el método de inversión
rcauchy <- function(){
U <- runif(1)
return(tan(pi*(U-0.5)))
}
# Simulación n valores
rcauchyn <- function(n = 1000) {
x <- numeric(n)
for(i in 1:n) x[i]<-rcauchy()
return(x)
}
set.seed(54321)
system.time(x <- rcauchyn(10^4))
## user system elapsed
## 0.16 0.04 0.28
hist(x, breaks = "FD", xlim = c(-10,10), freq = FALSE)
curve(dcauchy(x),col='red', lwd=2, add = TRUE)
Notemos que parece que sigue una distribucion de Cauchy.
plot(1:10^4, cumsum(x)/(1:10^4),lwd=2, type="l", ylab="Media muestral", xlab="Nº de simulaciones")
Notemos que mientras mas simulaciones la variable converge a 0.
2.- El tiempo de respuesta (en centésimas de segundo) de un servidor de bases de datos es una variable con función de densidad: \[
f(x) = x e^{-x}, \text{ si } x \geq 0
\]
Escribir el código necesario para generar, por el método de aceptación-rechazo, una muestra de n observaciones de esta distribución empleando como densidad auxiliar una exponencial: \[ g(x) = \lambda e^{-\lambda x}, \text{ si } x \geq 0 \] a) Aproximar numericamente el parámetro optimo \(\lambda_{opt}<1\) y la cota óptima \(c_{opt}\) de la densidad auxiliar y compararlos con los valores teoricos: \(\lambda_{opt} = \frac{1}{2}\) y \(c_{opt}=\frac{4}{e}\)
#Funcion de densidad
fun_ejer_2 <- function(x){
ifelse((x>=0),x*exp(-x),0)
}
#Valores c y lambda óptimos
fopt <- function(lambda) {
# Fijamos lambda
optimize(f = function(x){fun_ejer_2(x)/dexp(x,lambda)},
maximum=TRUE, interval=c(0,10))$objective
}
# Encontar lambda
res <- optimize(f=function(x){fopt(x)}, interval=c(0,10))
lambda.opt <- res$minimum
c.opt <- res$objective
cat("\n c óptimo = ", c.opt)
##
## c óptimo = 1.471518
#que es proximo a 4/exp(1)
cat("Lambda óptimo = ", lambda.opt)
## Lambda óptimo = 0.5000085
#que es proximo a 1/2
rfun <- function() {
# Simulación por aceptación-rechazo
while (TRUE) {
U <- runif(1)
X <- rexp(1,lambda.opt)
n <<- n+1
if (c.opt * U * dexp(X,lambda.opt) <= fun_ejer_2(X)) return(X)
}
}
rfunn <- function(n=1000) {
# Simulación n valores
x <- numeric(n)
for(i in 1:n) x[i]<-rfun()
return(x)
}
#fijamos la semilla
set.seed(500)
n<-0
system.time(x <- rfunn(1000))
## user system elapsed
## 0.08 0.00 0.15
cat("Nº de generaciones = ", n)
## Nº de generaciones = 1471
cat("\nNº medio de generaciones = ", n/1000)
##
## Nº medio de generaciones = 1.471
cat("\nProporción de rechazos = ", 1-n/1000, "\n")
##
## Proporción de rechazos = -0.471
hist(x, breaks="FD", freq=FALSE)
curve(fun_ejer_2(x), col='red',lwd=2,add=TRUE)