Ich habe versucht, die Frage Integral mit Wichtigkeit Stichprobenmethode in R bewerten zu beantworten . Grundsätzlich muss der Benutzer berechnen
Verwenden der Exponentialverteilung als Wichtigkeitsverteilung
und finde den Wert von der die bessere Annäherung an das Integral (es ist ) ergibt . Ich formuliere das Problem als die Bewertung des Mittelwerts von über : Das Integral ist dann nur . self-study
Sei also das PDF von und sei : Das Ziel ist nun die Schätzung
unter Verwendung von Wichtigkeitsstichproben. Ich habe eine Simulation in R durchgeführt:
# 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
Der Code ist im Grunde eine einfache Implementierung der Wichtigkeitsabtastung gemäß der hier verwendeten Notation . Die Wichtigkeitsabtastung wird dann mal wiederholt , um mehrere Schätzungen von , und jedes Mal wird überprüft, ob das 95% -Intervall den tatsächlichen Mittelwert abdeckt oder nicht.
Wie Sie sehen können, beträgt die tatsächliche Abdeckung für nur 0,19. Und das Erhöhen von auf Werte wie hilft nicht (die Abdeckung ist mit 0,15 sogar noch kleiner). Warum passiert dies?