Está en la página 1de 6

Tarea3_MLG

Emilio Camargo

20/2/2024

Pregunta 1

1. Calcular el estimador de Monte Carlo de la integral

Z π/3
sin(t)dt
0

y comparar el estimador con el valor exacto de la integral.

n <- 20000 # máximo tamaño de muestra


h <- function(x)sin(x)
u <- runif(n,0,pi/3)
x <- h(u) # Genera una muestra grande de observaciones
I_n <- cumsum(x)/(1:n) # estimadores de la integral para diferentes n
vn <- sqrt(cumsum((x - I_n)ˆ2))/(1:n) #error estándar estimado para cada n
plot(I_n,
type = "l",
ylim = c(0.45,.55), # mean(theta_n) + c(-1,1)*20*vn[n],
ylab = expression(I[n]),
xlab = "n")
# Agrega lineas correspondientes a nivel de confianza del 95% para cada n
points(I_n + c(-1,1)*2*vn, col = "red", cex = 0.3)
abline(h = -cos(pi/3)+cos(0)) # valor de la integral

1
0.54
0.52
0.50
In

0.48
0.46

0 5000 10000 15000 20000

Respuesta
El valor exacto de la integral es 0.5. Después de 20,000 simulaciones, el valor aproximado es .4772364. Como
podemos observar, el error es de aproximadamente +/-.2
Pregunta 2
Escribir una función para calcular el estimador de Monte Carlo de la función de distribución Be (3, 3) y usar
la función para estimar F(x) para x = 0.1, . . . , 0.9. Comparar los estimados con los valores obtenidos con
la función pbeta de R.

a <- 3 ; b <- 3 #valores iniciales


nsim <- 10000 #número de simulaciones
X <- rep(runif(1),nsim) #inicializa la cadena de Markov
for(i in 2:nsim){
y <- runif(1) #genera y con la distribución q(y|x)
alpha <- min(1,dbeta(y,a,b)/dbeta(X[i-1],a,b)) # Calcula la probabilidad de aceptación M-H
X[i] <- ifelse(runif(1) < alpha, y, X[i-1])
}

layout(matrix(c(1,3,2,3),2,2,byrow=T))
plot(X, type = "l")
plot(max(1, nsim-100):nsim, X[max(1,nsim-100):nsim], type = "l", main = "Muestra de la Cadena X", xlab =
hist(X, probability = T, main = "", ylab="densidad")
lines(seq(0,1,0.01), dbeta(seq(0,1,0.01),a,b), col = "red")

2
0.6
X

1.5
0.0

0 2000 6000 10000

densidad
Index

1.0
Muestra de la Cadena X

0.5
0.8
0.2

0.0
9900 9940 9980 0.0 0.2 0.4 0.6 0.8 1.0

i X

A<-sort(X)
cuantil1<-list()
lista_percentil<-c(.1,.2,.3,.4,.5,.6,.7,.8,.9)
for( i in lista_percentil){
posicion<-which(A<=i)
b<-tail(posicion, n=1)
cuantil<-b/length(A)
cuantil1=c(cuantil1,cuantil)
}

lista_correcta<-list()
for(i in lista_percentil){
a<-pbeta(i,3,3)
lista_correcta<-c(lista_correcta,a)

}
plot(lista_percentil,lista_correcta, type = "o", col = "blue", pch = 16, xlab = "X1", ylab = "Y")
points(lista_percentil,cuantil1, type = "o", col = "red", pch = 16, xlab = "X1", ylab = "Y")

3
1.0
0.8
0.6
Y

0.4
0.2
0.0

0.2 0.4 0.6 0.8

X1

x1<-do.call(rbind.data.frame,lista_correcta)
x2<-do.call(rbind.data.frame,cuantil1)
x3<-cbind(lista_percentil,x1,x2)
colnames(x3)<-c("percentiles","valores_correctos", "valores_estimados")

x3<-x3%>%mutate(diferencia=x3$valores_correctos-x3$valores_estimados)
x3

## percentiles valores_correctos valores_estimados diferencia


## 1 0.1 0.00856 0.0080 0.00056
## 2 0.2 0.05792 0.0545 0.00342
## 3 0.3 0.16308 0.1625 0.00058
## 4 0.4 0.31744 0.3208 -0.00336
## 5 0.5 0.50000 0.5063 -0.00630
## 6 0.6 0.68256 0.6922 -0.00964
## 7 0.7 0.83692 0.8431 -0.00618
## 8 0.8 0.94208 0.9410 0.00108
## 9 0.9 0.99144 0.9900 0.00144

R
Como puede observarse al compararse los valores correctos con los estimados (así como viendo la gráfica) la
diferencia es minima.
Pregunta_3

3. Usar integración Monte Carlo para estimar:

4
1
e−x
Z
dx
0 1 + x2

y calcular el tamaño de muestra necesario para obtener un error de estimación máximo de ±0.001.

n <- 30000 # máximo tamaño de muestra


h <- function(x)(exp(-x)/(1+xˆ2))
u <- runif(n,0,1)
x <- h(u) # Genera una muestra grande de observaciones
I_n <- cumsum(x)/(1:n) # estimadores de la integral para diferentes n
vn <- sqrt(cumsum((x - I_n)ˆ2))/(1:n) #error estándar estimado para cada n
plot(I_n,
type = "l",
ylim = c(0.49,.56), # mean(theta_n) + c(-1,1)*20*vn[n],
ylab = expression(I[n]),
xlab = "n")
# Agrega lineas correspondientes a nivel de confianza del 95% para cada n
points(I_n + c(-1,1)*2*vn, col = "red", cex = 0.3)
0.55
0.53
In

0.51
0.49

0 5000 10000 15000 20000 25000 30000

# error I - I_n
Error_n <- numeric(n)
I <- integrate(h, 0, 1)$value
Error_n<- I_n - I

5
plot(Error_n, ylim = c(-0.01, 0.01), type = "l")
grid()
abline(h = 0, lty = 2, col = "red")
abline(h = c(-0.001, 0.001), lty = 3, col = "blue")
0.010
0.005
Error_n

0.000
−0.010

0 5000 10000 15000 20000 25000 30000

Index

R
Como puede observarse, a partir de n =22000, el valor estimado esta en el rango solicitado. Esto puede
variar al correr de nuevo la simulación

También podría gustarte