Probabilidades de cobertura del intervalo de confianza básico de arranque

11

Tengo la siguiente pregunta para un curso en el que estoy trabajando:

Realice un estudio de Monte Carlo para estimar las probabilidades de cobertura del intervalo de confianza de arranque normal estándar y el intervalo de confianza de arranque básico. Muestra de una población normal y verifique las tasas de cobertura empírica para la media muestral.

Las probabilidades de cobertura para el CI de arranque normal estándar son fáciles:

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

Por lo que me han enseñado para este curso, el intervalo de confianza básico de arranque se puede calcular así:

# 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);

Eso tiene sentido. Lo que no entiendo es cómo calcular las probabilidades de cobertura para el CI básico de arranque. Entiendo que la probabilidad de cobertura representaría la cantidad de veces que el IC contiene el valor verdadero (en este caso mu). ¿Simplemente ejecuto la bootfunción muchas veces?

¿Cómo puedo abordar esta pregunta de manera diferente?

TheCloudlessSky
fuente
¿ size=100Eres un error tipográfico? No creo que esté obteniendo los límites superior e inferior correctos ya que el tamaño de muestra implícito parece ser 1000 cuando calcula sus CI en el ciclo (ya que los usa sqrt.nen el cálculo). Además, ¿por qué se compara muy no 0 directamente (siendo esta última la verdadera media)?
cardenal
Además, smpl = x[sample(1:n, size = 100, replace = TRUE)]; se puede simplificar a smpl = sample(x, size=100, replace=TRUE).
cardenal
@cardinal: Sí, fue un error tipográfico y fue igual a mu0. El CI normal funciona bien, es el CI básico de arranque con el que tengo dificultades.
TheCloudlessSky

Respuestas:

16

La terminología probablemente no se usa de manera consistente, por lo que lo siguiente es solo cómo entiendo la pregunta original. Según tengo entendido, los CI normales que calculó no son lo que se le pidió. Cada conjunto de réplicas de arranque le brinda un intervalo de confianza, no muchos. La forma de calcular diferentes tipos de CI a partir de los resultados de un conjunto de réplicas de arranque es la siguiente:

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

Como quiero comparar los cálculos con los resultados del paquete boot, primero defino una función que se llamará para cada réplica. Sus argumentos son la muestra original y un vector índice que especifica los casos para una sola réplica. Devuelve , la estimación del complemento para , así como , la estimación del complemento para la varianza de la media . Esto último solo será necesario para el bootstrap -CI. μ S 2 M σ 2 M tMμ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

Sin usar el paquete boot, simplemente puede usar replicate()para obtener un conjunto de réplicas de arranque.

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

Pero sigamos con los resultados boot.ci()para tener una referencia.

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

El básico, el percentil y el -CI dependen de la distribución empírica de las estimaciones de arranque. Para obtener los cuantiles y , encontramos los índices correspondientes al vector ordenado de las estimaciones de bootstrap (tenga en cuenta que hará una interpolación más complicada para encontrar los cuantiles empíricos cuando los índices no son números naturales) .α / 2 1 - α / 2tα/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

Para el -CI, necesitamos las estimaciones de arranque para calcular los valores críticos . Para el CI normal estándar, el valor crítico será solo el valor de la distribución normal estándar.t t ztttz

# 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

Para estimar las probabilidades de cobertura de estos tipos de CI, deberá ejecutar esta simulación muchas veces. Simplemente envuelva el código en una función, devuelva una lista con los resultados de CI y ejecútelo replicate()como se muestra en este resumen .

lince
fuente
¡Guauu! - Impresionante explicación de lo que estaba haciendo mal. Además, ¡gracias por los consejos de código! Esto funciona perfectamente!
TheCloudlessSky
Ok una última pregunta: cuando trato de replicar esta información, creé una función computeCIsy llamé results = replicate(500, computeCIs());. Al final computeCIsvuelve c(ciBasic, ciPerc). Para probar las probabilidades de cobertura, ¿no debería probar para mean(results[1, ] < 0 & results[2, ] > 0)probar todos los IC básicos que contienen la media real (la probabilidad de cobertura)? Cuando ejecuto esto, me sale 1cuando creo que debería hacerlo 0.95.
TheCloudlessSky
@TheCloudlessSky Para la función completa y la simulación completa con los resultados esperados en términos de frecuencias de cobertura, consulte pastebin.com/qKpNKK0D
caracal
Sí, soy un idiota:) ... cometí un error al copiar el código en R ... ¡gracias por toda su ayuda! :)
TheCloudlessSky
Gracias @caracal por una buena respuesta. El enlace pastebin.com/qKpNKK0Destá roto. Agradecería si lo actualiza y proporciona la función completa y la simulación completa. Gracias
MYaseen208