Нижче, ніж очікувалося, охоплення вибірки важливості за допомогою моделювання


9

Я намагався відповісти на питання Оцінка інтеграла Важливість методу відбору проб в R . В основному користувачеві потрібно провести розрахунок

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

використання експоненціального розподілу як розподілу важливості

q(x)=λ expλx

і знайдіть значення що дає кращу наближення до інтегралу (це ). Я переробка проблеми в якості оцінки середнього значення з над : інтеграл потім просто . λ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
Використання функції нескінченної важливості підтримки для інтеграла кінцевої підтримки не є оптимальним, оскільки частина моделювання використовується для імітації нулів, так би мовити. Принаймні, усічіть експоненцію на , що легко зробити та імітувати. π
Сіань

@ Xi'an впевнений, я згоден, якби мені довелося оцінити цей інтеграл за допомогою вибірки важливості, я б не використовував це розподіл важливості, але я намагався відповісти на початкове запитання, яке вимагало використання експоненціального розподілу. Моя проблема полягала в тому, що навіть якщо такий підхід є далеко не оптимальним, покриття все одно повинно зростати (в середньому) як . І це показав Грінпаркер. B
DeltaIV

Відповіді:


3

Вибірка важливості досить чутлива до вибору розподілу важливості. Оскільки ви вибрали , для зразків, які ви малюєте, будете мати середнє значення з відхиленням . Це розподіл, який ви отримуєтеλ=20rexp1/201/400

введіть тут опис зображення

Однак інтеграл, який ви хочете оцінити, переходить від 0 до . Отже, ви хочете використовувати який дає вам такий діапазон. Я використовую .π=3.14λλ=1

введіть тут опис зображення

Використовуючи я зможу дослідити повний інтегральний простір від 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


Так, я знаю, що покриття змінюється на : зокрема, найкраще покриття виходить для . Тепер я розумію, що оскільки значення ІС для вибірки базується на CLT, це асимптотичний результат. Таким чином, цілком може бути, що зміна впливає на кількість зразків, необхідних для наближення до "асимптотичного режиму", так би мовити. Але справа в тому, чому при покриття зменшується від розміру вибірки до розміру вибірки ? Безумовно, він повинен збільшитися, якщо поганий покрив був обумовлений лише високим значенням ? λ0.1<λ<2λλ=20104106λ
DeltaIV

1
@DeltaIV Я змінив відповідь на це запитання. Суть полягає в тому, що - недостатньо реплікацій, щоб сказати щось із впевненістю. N=100
Greenparker

1
ах блискучий! Я не думав формувати інтервал довіри для самої пропорції покриття , а не просто для середнього. Так само, як нітпік, я б не використовував довірчий інтервал Wald для довірчого інтервалу пропорції. Однак, оскільки пропорція відмінна від 0 і 1, а кількість повторень (у вашому другому випадку ) відносно велика, ймовірно, використовуючи інтервал Вільсона або Джеффріса, це не мало би значного значення. Я зачекаю трохи, щоб побачити, чи є інші відповіді, але я б сказав, що ви повністю заслуговуєте на +100 :)N=1000
DeltaIV
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.