Starałem się odpowiedzieć na pytanie Ocenić integralny z Znaczenie metody pobierania próbek na badania . Zasadniczo użytkownik musi obliczyć
wykorzystanie rozkładu wykładniczego jako rozkładu ważności
i znajdź wartość co daje lepsze przybliżenie całki (jej self-study
). Przekształcam problem jako ocenę wartości średniej z nad : całka jest wtedy sprawiedliwa .
Niech więc być pdf z , i pozwól : celem jest teraz oszacowanie
przy użyciu próbkowania ważności. Przeprowadziłem symulację w języku 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
Kod jest w zasadzie prostą implementacją ważności próbkowania, zgodnie z zastosowaną tutaj notacją . Próbkowanie według ważności jest następnie powtarzane razy, aby uzyskać wiele oszacowań , i za każdym razem sprawdza się, czy przedział 95% obejmuje rzeczywistą średnią, czy nie.
Jak widać, dla faktyczny zasięg wynosi zaledwie 0,19. I rośnie do wartości takich jak nie pomaga (zasięg jest jeszcze mniejszy, 0,15). Dlaczego to się dzieje?
źródło
Odpowiedzi:
Ważność próbkowania jest dość wrażliwa na wybór rozkładu ważności. Ponieważ wybrałeśλ=20 , próbki, które narysujesz, 1/20 z wariancją 1/400 . To jest dystrybucja, którą otrzymujesz
rexp
będą miały średniąJednak całka, którą chcesz ocenić, zmienia się od 0 doπ=3.14 . Więc chcesz użyćλ co daje ci taki zasięg. używamλ=1 .
Za pomocąλ=1 Będę w stanie zbadać pełną przestrzeń całkowitą od 0 do π i wydaje się, że tylko kilka losowań π zostaną zmarnowane. Teraz ponownie uruchamiam kod i zmieniam tylkoλ=1 .
Jeśli bawisz się zλ , zobaczysz, że jeśli zrobisz to naprawdę małe (.00001) lub duże, prawdopodobieństwo pokrycia będzie złe.
EDYTOWAĆ-------
Jeśli chodzi o prawdopodobieństwo pokrycia, maleje ono po przejściuB=104 do B=106 , to tylko przypadkowe zdarzenie, na podstawie tego, którego używasz N=100 replikacje. Przedział ufności dla prawdopodobieństwa pokrycia wB=104 jest,
Więc nie można tak naprawdę powiedzieć, że rośnieB=106 znacznie obniża prawdopodobieństwo pokrycia.
W rzeczywistości w swoim kodzie dla tego samego materiału siewnego zmieńN=100 do N=1000 , a następnie z B=104 , prawdopodobieństwo pokrycia wynosi .123 i przy B=106 prawdopodobieństwo pokrycia wynosi .158 .
Teraz przedział ufności w okolicach .123 wynosi
Tak więc teraz zN=1000 replikacje, otrzymujesz, że prawdopodobieństwo pokrycia znacznie wzrasta.
źródło