Thấp hơn phạm vi bảo hiểm dự kiến ​​để lấy mẫu quan trọng với mô phỏng


9

Tôi đã cố gắng để trả lời câu hỏi Đánh giá không thể thiếu với Tầm quan trọng lấy mẫu phương pháp trong R . Về cơ bản, người dùng cần tính toán

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

sử dụng phân phối theo cấp số nhân làm phân phối quan trọng

q(x)=λ expλx

và tìm giá trị của , nó mang lại xấp xỉ tốt hơn cho tích phân (nó ). Tôi gọi lại vấn đề là đánh giá giá trị trung bình của trên : tích phân sau đó chỉ là . L f ( x ) [ 0 , π ] π Lλself-studyμf(x)[0,π]πμ

Do đó, đặt là pdf của và để : mục tiêu bây giờ là ước tínhX U ( 0 , π ) Y f ( X )p(x)XU(0,π)Yf(X)

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

sử dụng lấy mẫu quan trọng. Tôi đã thực hiện một mô phỏng trong 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

Mã về cơ bản là một triển khai đơn giản của việc lấy mẫu quan trọng, theo ký hiệu được sử dụng ở đây . Sau đó, việc lấy mẫu quan trọng được lặp lại lần để có nhiều ước tính và mỗi lần kiểm tra được thực hiện cho dù khoảng 95% có bao gồm giá trị trung bình thực tế hay không.μNμ

Như bạn có thể thấy, với , phạm vi bảo hiểm thực tế chỉ là 0,19. Và việc tăng lên các giá trị như không giúp ích gì (phạm vi bảo hiểm thậm chí còn nhỏ hơn, 0,15). Tại sao chuyện này đang xảy ra?B 10 6λ=20B106


1
Sử dụng hàm quan trọng hỗ trợ vô hạn cho tích phân hỗ trợ hữu hạn là không tối ưu vì một phần mô phỏng được sử dụng để mô phỏng các số không, có thể nói như vậy. Ít nhất là cắt bớt số mũ tại , rất dễ thực hiện và mô phỏng. π
Tây An

@ Xi'an chắc chắn, tôi đồng ý, nếu tôi phải đánh giá tích phân đó bằng Lấy mẫu quan trọng, tôi sẽ không sử dụng phân phối quan trọng đó, nhưng tôi đã cố gắng trả lời câu hỏi ban đầu, yêu cầu sử dụng phân phối theo cấp số nhân. Vấn đề của tôi là, ngay cả khi cách tiếp cận này không tối ưu, phạm vi bảo hiểm vẫn sẽ tăng (trung bình) là . Và đó là những gì Greenparker đã thể hiện. B
DeltaIV

Câu trả lời:


3

Lấy mẫu quan trọng là khá nhạy cảm với sự lựa chọn phân phối quan trọng. Vì bạn đã chọn , các mẫu mà bạn vẽ sử dụng sẽ có giá trị trung bình là với phương sai . Đây là bản phân phối bạn nhận được1 / 20 1 / 400λ=20rexp1/201/400

nhập mô tả hình ảnh ở đây

Tuy nhiên, tích phân bạn muốn đánh giá đi từ 0 đến . Vì vậy, bạn muốn sử dụng một cung cấp cho bạn một phạm vi như vậy. Tôi sử dụng .π=3.14λλ=1

nhập mô tả hình ảnh ở đây

Sử dụng Tôi sẽ có thể khám phá toàn bộ không gian tích phân từ 0 đến và dường như chỉ một vài lần rút qua sẽ bị lãng phí. Bây giờ tôi chạy lại mã của bạn và chỉ thay đổi .λ=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

Nếu bạn chơi xung quanh với , bạn sẽ thấy rằng nếu bạn làm cho nó thực sự nhỏ (0,00001) hoặc lớn, xác suất bảo hiểm sẽ rất tệ.λ

BIÊN TẬP-------

Về xác suất bảo hiểm giảm khi bạn đi từ xuống , đó chỉ là một sự xuất hiện ngẫu nhiên, dựa trên thực tế là bạn sử dụng lặp. Khoảng tin cậy cho xác suất bảo hiểm tại là, B=104B=106N=100B=104

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

Vì vậy, bạn thực sự không thể nói rằng việc tăng làm giảm đáng kể xác suất bảo hiểm.B=106

Trong thực tế, trong mã của bạn cho cùng một hạt giống, thay đổi thành , sau đó với , xác suất bảo hiểm là 0,123 và với xác suất bảo hiểm là .N = 1000 B = 10 4 B = 10 6 .158N=100N=1000B=104B=106.158

Bây giờ, khoảng tin cậy xung quanh .123 là

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

Do đó, bây giờ với lặp lại, bạn sẽ thấy rằng độ chính xác bảo hiểm tăng lên đáng kể.N=1000


Có, tôi biết rằng thay đổi phạm vi bảo hiểm với : đặc biệt là phạm vi bảo hiểm tốt nhất thu được cho . Bây giờ, tôi hiểu rằng vì CI cho giá trị trung bình mẫu dựa trên CLT, nên đó là kết quả không có triệu chứng. Do đó, có thể là việc thay đổi ảnh hưởng đến số lượng mẫu cần thiết để tiếp cận "chế độ tiệm cận", có thể nói như vậy. Nhưng vấn đề là, tại sao với , phạm vi bảo hiểm giảm từ cỡ mẫu xuống cỡ mẫu ? Chắc chắn nó sẽ tăng lên, nếu phạm vi bảo hiểm kém chỉ do giá trị cao? 0,1 < λ < 2 λ λ = 20 10 4 10 6 λλ0.1<λ<2λλ=20104106λ
DeltaIV

1
@DeltaIV Tôi đã thực hiện một chỉnh sửa để trả lời câu hỏi này. Ý chính là, không đủ bản sao để nói bất cứ điều gì một cách chắc chắn. N=100
Greenparker

1
ah rực rỡ! Tôi đã không nghĩ đến việc hình thành khoảng tin cậy cho chính tỷ lệ bảo hiểm , thay vì chỉ cho trung bình. Cũng giống như một nitlog, tôi sẽ không sử dụng khoảng tin cậy Wald cho khoảng tin cậy của một tỷ lệ. Tuy nhiên, vì tỷ lệ cách xa 0 và 1 và số lần lặp lại là (trong trường hợp thứ hai của bạn, ) tương đối lớn, có lẽ sử dụng khoảng Wilson hoặc Jeffreys sẽ không có sự khác biệt nào. Tôi sẽ đợi một chút để xem có câu trả lời nào khác không, nhưng tôi muốn nói rằng bạn hoàn toàn xứng đáng với +100 :)N=1000
DeltaIV
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.