¿Cómo obtener los valores p de los coeficientes de la regresión bootstrap?

10

Del Quick-R de Robert Kabacoff tengo

# Bootstrap 95% CI for regression coefficients 
library(boot)
# function to obtain regression weights 
bs <- function(formula, data, indices) {
  d <- data[indices,] # allows boot to select sample 
  fit <- lm(formula, data=d)
  return(coef(fit)) 
} 
# bootstrapping with 1000 replications 
results <- boot(data=mtcars, statistic=bs, 
     R=1000, formula=mpg~wt+disp)

# view results
results
plot(results, index=1) # intercept 
plot(results, index=2) # wt 
plot(results, index=3) # disp 

# get 95% confidence intervals 
boot.ci(results, type="bca", index=1) # intercept 
boot.ci(results, type="bca", index=2) # wt 
boot.ci(results, type="bca", index=3) # disp

¿Cómo puedo obtener los valores p de los coeficientes de regresión bootstrap?H0:bj=0

ECII
fuente
"los valores de p" significa qué? ¿Qué prueba específica con qué hipótesis nula?
Brian Diggs
Corrección H0: bj = 0
ECII
3
Ya obtiene / función de si el intervalo de confianza no incluye / incluye 0. No es posible obtener más detalles ya que la distribución del parámetro desde el bootstrap no es paramétrica (y, por lo tanto, no puede obtener una probabilidad que el valor es 0). p<0.05p>0.05
Brian Diggs
Si no puede asumir una distribución, ¿cómo sabe que p <0.05 si el IC no incluye 0? Esto es válido para las distribuciones z o t.
ECII
Entiendo eso, pero solo puede decir que p <0.05, no puede adjuntar un valor específico, ¿verdad?
ECII

Respuestas:

8

Solo otra variante que es algo simplista, pero creo que entregar el mensaje sin usar explícitamente la biblioteca bootque puede confundir a algunas personas con la sintaxis que usa.

Tenemos un modelo lineal: ,y=Xβ+ϵϵN(0,σ2)

La siguiente es una rutina de arranque paramétrica para ese modelo lineal, lo que significa que no volveremos a muestrear nuestros datos originales, pero en realidad generamos nuevos datos a partir de nuestro modelo ajustado. Además, suponemos que la distribución de arranque del coeficiente de regresión es simétrica y que la traducción es invariante. (Hablando en términos generales de que podemos mover su eje afectando sus propiedades) La idea detrás es que las fluctuaciones en los 's se deben a y, por lo tanto, con suficientes muestras deberían proporcionar una buena aproximación de la distribución real de 's. Como antes, probamos nuevamente y definimos nuestros valores p comoββϵβH0:0=βj"la probabilidad, dada una hipótesis nula para la distribución de probabilidad de los datos, de que el resultado sería tan extremo o más extremo que el resultado observado" (donde los resultados observados en este caso son los's que obtuvimos para nuestro modelo original). Entonces aquí va:β

# Sample Size
N           <- 2^12;
# Linear Model to Boostrap          
Model2Boot  <- lm( mpg ~ wt + disp, mtcars)
# Values of the model coefficients
Betas       <- coefficients(Model2Boot)
# Number of coefficents to test against
M           <- length(Betas)
# Matrix of M columns to hold Bootstraping results
BtStrpRes   <- matrix( rep(0,M*N), ncol=M)

for (i in 1:N) {
# Simulate data N times from the model we assume be true
# and save the resulting coefficient in the i-th row of BtStrpRes
BtStrpRes[i,] <-coefficients(lm(unlist(simulate(Model2Boot)) ~wt + disp, mtcars))
}

#Get the p-values for coefficient
P_val1 <-mean( abs(BtStrpRes[,1] - mean(BtStrpRes[,1]) )> abs( Betas[1]))
P_val2 <-mean( abs(BtStrpRes[,2] - mean(BtStrpRes[,2]) )> abs( Betas[2]))
P_val3 <-mean( abs(BtStrpRes[,3] - mean(BtStrpRes[,3]) )> abs( Betas[3]))

#and some parametric bootstrap confidence intervals (2.5%, 97.5%) 
ConfInt1 <- quantile(BtStrpRes[,1], c(.025, 0.975))
ConfInt2 <- quantile(BtStrpRes[,2], c(.025, 0.975))
ConfInt3 <- quantile(BtStrpRes[,3], c(.025, 0.975))

Como se mencionó, la idea es que la distribución de arranque de aproxima a la verdadera. (Claramente, este código está optimizado para la velocidad pero para la legibilidad. :))β

usεr11852
fuente
16

La comunidad y @BrianDiggs pueden corregirme si estoy equivocado, pero creo que puede obtener un valor p para su problema de la siguiente manera. Un valor p para una prueba de dos lados se define como

2min[P(Xx|H0),P(Xx|H0)]

Entonces, si ordena los coeficientes bootstrapped por tamaño y luego determina las proporciones mayores y menores de cero, la proporción mínima multiplicada por dos debería darle un valor p.

Normalmente uso la siguiente función en tal situación:

twosidep<-function(data){
  p1<-sum(data>0)/length(data)
  p2<-sum(data<0)/length(data)
  p<-min(p1,p2)*2
  return(p)
}
tomka
fuente
4

El bootstrap se puede usar para calcular los valores , pero necesitaría un cambio sustancial en su código. Como no estoy familiarizado con RI, solo puedo darle una referencia en la que puede buscar lo que necesitaría hacer: el capítulo 4 de (Davison y Hinkley 1997).p

Davison, AC y Hinkley, DV 1997. Métodos Bootstrap y su aplicación. Cambridge: Cambridge University Press.

Maarten Buis
fuente