Simülasyon ile önem örneklemesi için beklenenden daha düşük kapsama alanı


9

R'deki Önemsel örnekleme yöntemi ile integrali değerlendirin sorusunu cevaplamaya çalışıyordum . Temel olarak, kullanıcının hesaplaması gerekir

0πf(x)dx=0π1marul(x)2+x2dx

üstel dağılımın önem dağılımı olarak kullanılması

q(x)=λ tecrübe-λx

ve integrale daha iyi yaklaşımı veren değerini bulun . Ben ortalama değeri değerlendirilmesi olarak sorun yeniden düzenleme ve boyunca yekpare sonra sadece bir: . λself-studyμf(x)[0,π]πμ

Bu nedenle, nin sağlayın ve bırakın : şimdi hedef tahmin etmektirp(x)X~U(0,π)Y~f(X)

μ=E[Y]=E[f(X)]=R,f(x)p(x)dx=0π1marul(x)2+x21πdx

önemi örnekleme kullanarak. R'de bir simülasyon yaptım:

# 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 temel olarak, burada kullanılan gösterimi izleyerek önem örneklemesinin basit bir uygulamasıdır . Daha sonra çoklu tahminleri elde etmek için örnekleme önemi kez tekrarlanır ve her defasında% 95 aralığının gerçek ortalamayı kapsayıp kapsamadığını kontrol eder.N-μ

Gördüğünüz gibi, için gerçek kapsam sadece 0.19'dur. Ve gibi değerlere yükseltmek yardımcı olmaz (kapsam daha da küçüktür, 0.15). Bu neden oluyor?λ=20B106


1
Sonlu destek integrali için sonsuz destek önem fonksiyonu kullanmak, simülasyonların bir parçası sıfırları simüle etmek için kullanıldığından, optimal değildir. En azından yapmak ve taklit etmek kolay olan üssü kısaltın. π
Xi'an

@ Xi'an elbette, katılıyorum, eğer bu integrali Önem Örneklemesi ile değerlendirmek zorunda olsaydım, o önem dağılımını kullanmazdım, ama üstel dağılımın kullanılmasını gerektiren orijinal soruyu cevaplamaya çalışıyordum. Benim sorunum, bu yaklaşım optimal olmaktan uzak olsa bile, kapsamın (ortalama olarak)B. İşte Greenparker bunu gösterdi.
DeltaIV

Yanıtlar:


3

Önem örneklemesi, önem dağılımı seçimine oldukça duyarlıdır. Seçtiğinizden beriλ=20kullanarak çizdiğiniz örneklerin rexpbir ortalaması olacaktır.1/20 varyans ile 1/400. Aldığınız dağıtım bu

resim açıklamasını buraya girin

Ancak, değerlendirmek istediğiniz integral 0'dan π=3.14. Yani birλsize böyle bir menzil veriyor. kullanırımλ=1.

resim açıklamasını buraya girin

kullanma λ=1 0'ın tam integral alanını keşfedebileceğim πve sadece birkaç kişinin πisraf edilecek. Şimdi kodunuzu tekrar çalıştırıyorum ve sadece değiştiriyorumλ=1.

# 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(1,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] .95

İle oynarsan λ, gerçekten küçük (.00001) veya büyük yaparsanız, kapsam olasılıklarının kötü olacağını göreceksiniz.

DÜZENLE-------

Kapsama olasılığına ilişkin olarak, B=104 için B=106, bu, kullandığınız gerçeğe dayanarak, rastgele bir durumdur. N-=100tekrarlamalı. Kapsama olasılığı için güven aralığıB=104 dır-dir,

0,19±1.96*0,19*(1-0,19)100=0,19±0,0769=(0,1131,0,2669).

Bu yüzden, B=106 kapsama olasılığını önemli ölçüde azaltır.

Aslında aynı tohum kodunda, N-=100 için N-=1000, sonra ile B=104, kapsama olasılığı 0,123 ve B=106 kapsama olasılığı 0,158.

Şimdi, .123 civarındaki güven aralığı

.123±1.96.123*(1-.123)1000=.123±0,0203=(0,102,0,143).

Böylece, şimdi ile N-=1000 replikasyonlar, kapsama olasılığının önemli ölçüde arttığını göreceksiniz.


Evet, kapsamın λ: özellikle en iyi kapsama alanı 0.1<λ<2. Şimdi anlıyorum ki, örnek ortalamanın CI değeri CLT'ye dayandığından, bu asimptotik bir sonuçtur. Bu nedenle,λtabiri caizse, "asimtotik rejime" yaklaşmak için gereken örnek sayısını etkiler. Ama asıl mesele, nedenλ=20kapsama alanı numune boyutundan azalır104 örneklem büyüklüğüne 106? Şüphesiz, kapsama alanı yalnızca yüksekλdeğeri?
DeltaIV

1
@DeltaIV Bu soruyu cevaplamak için bir düzenleme yaptım. Buradaki öz,N-=100kesin bir şey söylemek için yeterli çoğaltma değildir.
Greenparker

1
ah parlak! Ben sadece ortalama için değil , kapsama oranı kendisi için güven aralığı oluşturmayı düşünmüyordu . Tıpkı bir nitpick gibi, Wald güven aralığını bir oranın güven aralığı için kullanmazdım. Bununla birlikte, oran 0 ve 1'den uzak olduğundan ve kopyaların sayısı (ikinci durumda,N-=1000) nispeten büyük, muhtemelen Wilson veya Jeffreys aralığını kullanmak herhangi bir fark yaratmazdı. Başka cevaplar olup olmadığını görmek için biraz bekleyeceğim, ama +100 :) 'i tamamen hak ettiğinizi söyleyebilirim
DeltaIV
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.