Comment obtenir les valeurs de p des coefficients à partir de la régression bootstrap?

10

Du Quick-R de Robert Kabacoff, j'ai

# 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

Comment puis-je obtenir les valeurs de p des coefficients de régression bootstrap?H0:bj=0

ECII
la source
"les valeurs p" signifie quoi? Quel test spécifique avec quelle hypothèse nulle?
Brian Diggs
Correction H0: bj = 0
ECII
3
Vous obtenez déjà / selon que l'intervalle de confiance n'inclut pas / inclut 0. Plus de détails ne sont pas possibles car la distribution du paramètre à partir du bootstrap n'est pas paramétrique (et donc vous ne pouvez pas obtenir une probabilité que la valeur est 0). p > 0,05p<0.05p>0,05
Brian Diggs
Si vous ne pouvez pas supposer une distribution, comment savez-vous que p <0,05 si l'IC n'inclut pas 0? Cela est vrai pour les distrubutions z ou t.
ECII
Je comprends cela, mais vous pouvez seulement dire que p <0,05, vous ne pouvez pas attacher une valeur spécifique à droite?
ECII

Réponses:

8

Juste une autre variante qui est quelque peu simpliste mais je pense délivrer le message sans utiliser explicitement la bibliothèque bootqui peut confondre certaines personnes avec la syntaxe qu'elle utilise.

Nous avons un modèle linéaire: ,y=Xβ+ϵϵN(0,σ2)

Ce qui suit est un bootstrap paramétrique pour ce modèle linéaire, cela signifie que nous ne rééchantillonnons pas nos données d'origine mais en réalité nous générons de nouvelles données à partir de notre modèle ajusté. De plus, nous supposons que la distribution bootstrapée du coefficient de régression est symétrique et qu'elle est invariante par translation. (Très grossièrement, nous pouvons en déplacer l'axe en affectant ses propriétés) L'idée derrière est que les fluctuations des sont dues à et donc avec suffisamment d'échantillons, elles devraient fournir une bonne approximation de la vraie distribution des . Comme avant, nous testons à nouveau et nous définissons nos valeurs p commeβ ϵ β H 0 : 0 = β j βββϵβH0:0=βj"la probabilité, étant donné une hypothèse nulle pour la distribution de probabilité des données, que le résultat serait aussi extrême ou plus extrême que le résultat observé" (où les résultats observés dans ce cas sont lesnous avons obtenus pour notre modèle d'origine). Alors voilà:β

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

Comme mentionné, l'idée générale est que la distribution bootstrapée des est approximativement leur vraie. (Clairement, ce code est optimisé pour la vitesse mais pour la lisibilité. :))β

usεr11852
la source
16

La communauté et @BrianDiggs peuvent me corriger si je me trompe, mais je pense que vous pouvez obtenir une valeur p pour votre problème comme suit. Une valeur de p pour un test bilatéral est définie comme

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

Donc, si vous commandez les coefficients bootstrap par taille, puis déterminez les proportions zéro plus grand et plus petit, la proportion minimale multipliée par deux devrait vous donner une valeur p.

J'utilise normalement la fonction suivante dans une telle situation:

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

Le bootstrap peut être utilisé pour calculer les valeurs , mais il nécessiterait une modification substantielle de votre code. Comme je ne connais pas RI, je ne peux que vous donner une référence dans laquelle vous pouvez rechercher ce que vous devez faire: le chapitre 4 de (Davison et Hinkley 1997).p

Davison, AC et Hinkley, DV 1997. Méthodes de bootstrap et leur application. Cambridge: Cambridge University Press.

Maarten Buis
la source