Yo estaba tratando de responder a la pregunta Evaluar solidario de Importancia método de muestreo en I . Básicamente, el usuario necesita calcular
usando la distribución exponencial como la distribución de importancia
y encuentre el valor de que da la mejor aproximación a la integral (es ). Reformé el problema como la evaluación del valor medio de sobre : la integral es entonces solo . self-study
Por lo tanto, sea el pdf de , y sea : el objetivo ahora es estimar
utilizando muestreo de importancia. Realicé una simulación en R:
# clear the environment and set the seed for reproducibility
rm(list=ls())
gc()
graphics.off()
set.seed(1)
# function to be integrated
f <- function(x){
1 / (cos(x)^2+x^2)
}
# importance sampling
importance.sampling <- function(lambda, f, B){
x <- rexp(B, lambda)
f(x) / dexp(x, lambda)*dunif(x, 0, pi)
}
# mean value of f
mu.num <- integrate(f,0,pi)$value/pi
# initialize code
means <- 0
sigmas <- 0
error <- 0
CI.min <- 0
CI.max <- 0
CI.covers.parameter <- FALSE
# set a value for lambda: we will repeat importance sampling N times to verify
# coverage
N <- 100
lambda <- rep(20,N)
# set the sample size for importance sampling
B <- 10^4
# - estimate the mean value of f using importance sampling, N times
# - compute a confidence interval for the mean each time
# - CI.covers.parameter is set to TRUE if the estimated confidence
# interval contains the mean value computed by integrate, otherwise
# is set to FALSE
j <- 0
for(i in lambda){
I <- importance.sampling(i, f, B)
j <- j + 1
mu <- mean(I)
std <- sd(I)
lower.CB <- mu - 1.96*std/sqrt(B)
upper.CB <- mu + 1.96*std/sqrt(B)
means[j] <- mu
sigmas[j] <- std
error[j] <- abs(mu-mu.num)
CI.min[j] <- lower.CB
CI.max[j] <- upper.CB
CI.covers.parameter[j] <- lower.CB < mu.num & mu.num < upper.CB
}
# build a dataframe in case you want to have a look at the results for each run
df <- data.frame(lambda, means, sigmas, error, CI.min, CI.max, CI.covers.parameter)
# so, what's the coverage?
mean(CI.covers.parameter)
# [1] 0.19
El código es básicamente una implementación directa de muestreo de importancia, siguiendo la notación utilizada aquí . La muestra de importancia se repite veces para obtener estimaciones múltiples de , y cada vez que se realiza una comprobación sobre si el intervalo del 95% cubre la media real o no.μ
Como puede ver, para la cobertura real es de solo 0.19. Y aumentar a valores como no ayuda (la cobertura es aún menor, 0,15). ¿Por qué está pasando esto?B 10 6
fuente
Respuestas:
El muestreo de importancia es bastante sensible a la elección de la distribución de importancia. Como eligió , las muestras que extraiga tendrán una media de con una varianza de . Esta es la distribución que obtienes1 / 20 1 / 400λ=20 1/20 1/400
rexp
Sin embargo, la integral que desea evaluar va de 0 a . Por lo tanto, desea utilizar un que le brinde ese rango. Yo uso .λ λ = 1π=3.14 λ λ=1
Usando podré explorar el espacio integral completo de 0 a , y parece que solo se desperdiciarán algunos sorteos sobre . Ahora vuelvo a ejecutar su código y solo cambio .π π λ = 1λ=1 π π λ=1
Si juegas con , verás que si lo haces realmente pequeño (.00001) o grande, las probabilidades de cobertura serán malas.λ
EDITAR-------
En cuanto a la probabilidad de cobertura que disminuye una vez que pasa de a , eso es solo una ocurrencia aleatoria, basada en el hecho de que usa repeticiones. El intervalo de confianza para la probabilidad de cobertura en es, B = 10 6 N = 100 B = 10 4 .19 ± 1.96 ∗ √B=104 B=106 N=100 B=104
Por lo tanto, no se puede decir que aumentar reduce significativamente la probabilidad de cobertura.B=106
De hecho, en su código para la misma semilla, cambie a , luego con , la probabilidad de cobertura es .123 y con probabilidad de cobertura es .N = 1000 B = 10 4 B = 10 6 .158N=100 N=1000 B=104 B=106 .158
Ahora, el intervalo de confianza alrededor de .123 es
Por lo tanto, ahora con repeticiones, obtienes que la probabilidad de cobertura aumenta significativamente.N=1000
fuente