Вероятности охвата базовой начальной загрузки Интервал

11

У меня есть следующий вопрос для курса, над которым я работаю:

Проведите исследование методом Монте-Карло, чтобы оценить вероятности охвата стандартного нормального доверительного интервала начальной загрузки и базового доверительного интервала начальной загрузки. Выборка из нормальной популяции и проверка эмпирических показателей охвата для выборки среднего.

Вероятности покрытия для стандартного нормального загрузочного CI просты:

n = 1000;
alpha = c(0.025, 0.975);
x = rnorm(n, 0, 1);
mu = mean(x);
sqrt.n = sqrt(n);

LNorm = numeric(B);
UNorm = numeric(B);

for(j in 1:B)
{
    smpl = x[sample(1:n, size = n, replace = TRUE)];
    xbar = mean(smpl);
    s = sd(smpl);

    LNorm[j] = xbar + qnorm(alpha[1]) * (s / sqrt.n);
    UNorm[j] = xbar + qnorm(alpha[2]) * (s / sqrt.n);
}

mean(LNorm < 0 & UNorm > 0); # Approximates to 0.95
# NOTE: it is not good enough to look at overall coverage
# Must compute separately for each tail

Из того, чему меня учили в этом курсе, базовый доверительный интервал начальной загрузки может быть рассчитан так:

# Using x from previous...
R = boot(data = x, R=1000, statistic = function(x, i){ mean(x[i]); });
result = 2 * mu - quantile(R$t, alpha, type=1);

Это имеет смысл. Что я не понимаю, так это как рассчитать вероятности покрытия для базового CI начальной загрузки. Я понимаю, что вероятность покрытия будет представлять количество раз, которое CI содержит истинное значение (в этом случае mu). Я просто запускаю bootфункцию много раз?

Как я могу подойти к этому вопросу по-другому?

TheCloudlessSky
источник
Является ли ваша size=100опечатка? Я не верю, что вы получаете правильные верхние и нижние границы, поскольку неявный размер выборки равен 1000, когда вы вычисляете свои КИ в цикле (так как вы используете sqrt.nв расчете). Кроме того, почему вы сравниваете с mu0, а не с 0 (последнее является истинным средним)?
кардинал
Кроме того, smpl = x[sample(1:n, size = 100, replace = TRUE)]; может быть упрощено до smpl = sample(x, size=100, replace=TRUE).
кардинал
@cardinal - Да, это была опечатка и то же самое, muчто было 0. Нормальный CI работает нормально, это базовый CI начальной загрузки, с которым у меня возникают трудности.
TheCloudlessSky

Ответы:

16

Терминология, вероятно, не используется последовательно, поэтому следующее - только то, как я понимаю исходный вопрос. Насколько я понимаю, нормальные КИ, которые вы вычислили, не соответствуют требованиям. Каждый набор копий начальной загрузки дает вам один доверительный интервал, а не много. Способ вычисления различных CI-типов по результатам набора репликаций начальной загрузки заключается в следующем:

B    <- 999                  # number of replicates
muH0 <- 100                  # for generating data: true mean
sdH0 <- 40                   # for generating data: true sd
N    <- 200                  # sample size
DV   <- rnorm(N, muH0, sdH0) # simulated data: original sample

bootMμSM2σM2t

> getM <- function(orgDV, idx) {
+     bsM   <- mean(orgDV[idx])                       # M*
+     bsS2M <- (((N-1) / N) * var(orgDV[idx])) / N    # S^2*(M)
+     c(bsM, bsS2M)
+ }

> library(boot)                                       # for boot(), boot.ci()
> bOut <- boot(DV, statistic=getM, R=B)
> boot.ci(bOut, conf=0.95, type=c("basic", "perc", "norm", "stud"))
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 999 bootstrap replicates
CALL : 
boot.ci(boot.out = bOut, conf = 0.95, type = c("basic", "perc", "norm", "stud"))

Intervals : 
Level      Normal            Basic         Studentized        Percentile    
95%   ( 95.6, 106.0 )   ( 95.7, 106.2 )  ( 95.4, 106.2 )   ( 95.4, 106.0 )  
Calculations and Intervals on Original Scale

Без использования пакета bootвы можете просто использовать, replicate()чтобы получить набор загрузочных копий.

boots <- t(replicate(B, getM(DV, sample(seq(along=DV), replace=TRUE))))

Но давайте придерживаться результатов, boot.ci()чтобы иметь ссылку.

boots   <- bOut$t                     # estimates from all replicates
M       <- mean(DV)                   # M from original sample
S2M     <- (((N-1)/N) * var(DV)) / N  # S^2(M) from original sample
Mstar   <- boots[ , 1]                # M* for each replicate
S2Mstar <- boots[ , 2]                # S^2*(M) for each replicate
biasM   <- mean(Mstar) - M            # bias of estimator M

tα/21α/2boot.ci()

(idx <- trunc((B + 1) * c(0.05/2, 1 - 0.05/2)) # indices for sorted vector of estimates
[1] 25 975

> (ciBasic <- 2*M - sort(Mstar)[idx])          # basic CI
[1] 106.21826  95.65911

> (ciPerc <- sort(Mstar)[idx])                 # percentile CI
[1] 95.42188 105.98103

tttz

# standard normal CI with bias correction
> zCrit   <- qnorm(c(0.025, 0.975))   # z-quantiles from std-normal distribution
> (ciNorm <- M - biasM + zCrit * sqrt(var(Mstar)))
[1] 95.5566 106.0043

> tStar <- (Mstar-M) / sqrt(S2Mstar)  # t*
> tCrit <- sort(tStar)[idx]           # t-quantiles from empirical t* distribution
> (ciT  <- M - tCrit * sqrt(S2M))     # studentized t-CI
[1] 106.20690  95.44878

Чтобы оценить вероятности покрытия этих типов CI, вам придется многократно запускать это моделирование. Просто оберните код в функцию, верните список с CI-результатами и запустите его, replicate()как показано в этом разделе .

каракал
источник
Вау! - Потрясающее объяснение того, что я делал не так. Также - спасибо за подсказки кода! Это работает отлично!
TheCloudlessSky
Хорошо, последний вопрос: когда я пытаюсь воспроизвести эту информацию, я создал функцию computeCIsи вызвал ее results = replicate(500, computeCIs());. В конце computeCIsэто возвращается c(ciBasic, ciPerc). Чтобы проверить вероятности покрытия, разве я не должен проверять, mean(results[1, ] < 0 & results[2, ] > 0)чтобы проверить все базовые элементы конфигурации, содержащие истинное среднее значение (вероятность покрытия)? Когда я запускаю это, я получаю, 1когда думаю, что должен получить 0.95.
TheCloudlessSky
@TheCloudlessSky Для полной функции и полного моделирования с ожидаемыми результатами с точки зрения частот покрытия, смотрите pastebin.com/qKpNKK0D
caracal
Да, я идиот :) Я сделал опечатку при копировании кода в R ... спасибо за вашу помощь! :)
TheCloudlessSky
Спасибо @caracal за хороший ответ. Ссылка не pastebin.com/qKpNKK0Dработает. Был бы признателен, если вы обновите его и предоставите полную функцию и полное моделирование. Спасибо
MYaseen208