시뮬레이션을 통한 중요도 샘플링의 예상 범위보다 낮음


9

나는 R의 중요도 샘플링 방법과 통합 평가 라는 질문에 대답하려고했습니다 . 기본적으로 사용자는 계산해야합니다

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

지수 분포를 중요도 분포로 사용

q(x)=λ expλx

적분에 더 나은 근사값을 제공하는 값을 찾으십시오 . I는 평균값으로 평가 문제를 고쳐 의 통해 적분 후 그냥 : . λself-studyμf(x)[0,π]πμ

따라서 를 의 pdf로 설정 하고 . 이제 목표는 추정하는 것입니다.p(x)XU(0,π)Yf(X)

μ=E[Y]=E[f(X)]=Rf(x)p(x)dx=0π1cos(x)2+x21πdx

중요도 샘플링 사용. 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

이 코드는 기본적으로 여기에 사용 된 표기법에 따라 중요도 샘플링의 간단한 구현입니다 . 그런 다음 중요도 샘플링을 번 반복하여 의 여러 추정값을 얻고 95 % 간격이 실제 평균을 포함하는지 여부를 확인할 때마다 확인합니다.Nμ

보다시피, 경우 실제 적용 범위는 0.19입니다. 를 과 같은 값으로 늘리 더라도 도움이되지 않습니다 (커버리지가 0.15보다 훨씬 작음). 왜 이런 일이 발생합니까?λ=20B106


1
유한지지 적분에 대해 무한지지 중요도 기능을 사용하는 것은 시뮬레이션의 일부를 사용하여 0을 시뮬레이션하는 데 사용되므로 최적이 아닙니다. 적어도 에서 지수를 자르십시오 . 이는 수행하고 시뮬레이션하기 쉽습니다. π
시안

@ Xi'an, Importance Sampling에 의해 적분을 평가해야한다면 중요도 분포를 사용하지는 않지만 지수 분포를 사용해야하는 원래 질문에 대답하려고했습니다. 내 문제는이 방법이 최적이 아니더라도 적용 범위가 여전히 평균으로 증가해야한다는 것 입니다. 이것이 바로 Greenparker가 보여준 것입니다. B
DeltaIV

답변:


3

중요도 샘플링은 중요도 분포 선택에 매우 민감합니다. 을 선택 했으므로 사용하는 표본 의 평균은 분산이 이고 평균 입니다 . 이것은 당신이 얻는 분포입니다λ=20rexp1/201/400

여기에 이미지 설명을 입력하십시오

그러나 평가하려는 적분은 0에서 됩니다. 따라서 그러한 범위를 제공 하는 를 사용하고 싶습니다 . 내가 사용하는 .π=3.14λλ=1

여기에 이미지 설명을 입력하십시오

사용 I가 0의 전체 통합 공간을 탐험 할 수있을 것 , 단지 몇 이상 그리는 것 같아 낭비됩니다. 이제 코드를 다시 실행하고 만 변경하십시오 .λ=1ππλ=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

를 가지고 놀면 실제로 작거나 (.00001) 크게하면 적용 확률이 나빠질 것입니다.λ

편집하다-------

에서 이동하면 적용 범위 확률이 감소하는 것과 관련하여 복제 를 사용한다는 사실에 따라 이는 임의의 발생 입니다. 에서 적용 확률의 신뢰 구간 은 B=104B=106N=100B=104

.19±1.96.19(1.19)100=.19±.0769=(.1131,.2669).

따라서 을 늘리면 범위 확률이 크게 낮아진다 고 말할 수 없습니다 .B=106

실제로 동일한 시드에 대한 코드에서 을 으로 변경 한 다음 이면 적용 확률은 .123이고 적용 범위 확률은 입니다.N=100N=1000B=104B=106.158

이제 .123 주위의 신뢰 구간은

.123±1.96.123(1.123)1000=.123±.0203=(.102,.143).

따라서 이제 복제를 수행하면 적용 범위 확률이 크게 증가합니다.N=1000


예, 를 사용하여 적용 범위가 변경된다는 것을 알고 있습니다 . 특히 대해 최상의 적용 범위를 얻습니다 . 이제 표본 평균의 CI가 CLT를 기반으로하므로 점근적인 결과라는 것을 알고 있습니다. 따라서 를 변경 하면 "점근 법"에 접근하는 데 필요한 샘플 수에 영향을 줄 수 있습니다. 그러나 왜 점에있다 커버리지 감소 샘플 크기에서 샘플 크기 ? 커버리지가 열악한 경우에만 높은 값 으로 인해 증가해야 합니까? λ0.1<λ<2λλ=20104106λ
DeltaIV

1
@DeltaIV이 질문에 대한 답변을 편집했습니다. 요점은, 은 확실하게 아무 말도하기에 충분한 복제가 아니다. N=100
Greenparker

1
아 훌륭해! 나는 평균이 아닌 적용 범위 자체에 대한 신뢰 구간 형성하는 것을 생각하지 않았습니다 . 이쑤시개처럼, 나는 비율의 신뢰 구간에 Wald 신뢰 구간을 사용하지 않았을 것입니다. 그러나 비율이 0과 1에서 멀고 반복 횟수가 (두 번째 경우 ) 상대적으로 크기 때문에 Wilson 또는 Jeffreys 간격을 사용하면 아무런 차이가 없었습니다. 다른 답변이 있는지 조금만 기다리 N=1000
겠습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.