Come ottenere i valori p dei coefficienti dalla regressione bootstrap?


10

Dalla Quick-R di Robert Kabacoff che ho

# 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

Come posso ottenere i valori p dei coefficienti di regressione bootstrap?H0:bj=0


"i valori p" significa cosa? Quale test specifico con quale ipotesi nulla?
Brian Diggs,

Correzione H0: bj = 0
ECII

3
Si ottiene già / base al fatto che l'intervallo di confidenza non includa / non includa 0. Non sono possibili ulteriori dettagli poiché la distribuzione del parametro dal bootstrap non è parametrica (e quindi non è possibile ottenere una probabilità che il valore è 0). p > 0,05p<0.05p>0.05
Brian Diggs,

Se non puoi assumere una distribuzione, come fai a sapere che p <0,05 se l'IC non include 0? Questo vale per le distrubzioni z o t.
ECII

Ho capito, ma puoi solo dire che p <0,05, non puoi allegare un valore specifico giusto?
ECII

Risposte:


8

Solo un'altra variante che è in qualche modo semplicistica ma penso che recapiti il ​​messaggio senza usare esplicitamente la libreria bootche potrebbe confondere alcune persone con la sintassi che utilizza.

Abbiamo un modello lineare: ,y=Xβ+ϵϵN(0,σ2)

Quello che segue è un bootstrap parametrico per quel modello lineare, ciò significa che non ricampioniamo i nostri dati originali ma in realtà generiamo nuovi dati dal nostro modello adattato. Inoltre supponiamo che la distribuzione bootstrap del coefficiente di regressione sia simmetrica e che sia invariante per la traduzione. (Molto approssimativamente parlando che possiamo spostarne l'asse influenzandone le proprietà) L'idea alla base è che le fluttuazioni negli sono dovute a e quindi con abbastanza campioni dovrebbero fornire una buona approssimazione della vera distribuzione di 's. Come prima nuovo e nostri valori p comeββϵβH0:0=βj"la probabilità, data un'ipotesi nulla per la distribuzione di probabilità dei dati, che il risultato sarebbe estremo come, o più estremo di, il risultato osservato" (dove i risultati osservati in questo caso sono iche abbiamo ottenuto per il nostro modello originale). Quindi ecco qui:β

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

Come accennato, l'idea è che hai la distribuzione bootstrap di quella approssimativa di quella vera. (Chiaramente questo codice è ottimizzato per la velocità ma per la leggibilità. :))β


16

La community e @BrianDiggs potrebbero correggermi se sbaglio, ma credo che tu possa ottenere un valore p per il tuo problema come segue. Un valore p per un test su due lati è definito come

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

Quindi, se ordini i coefficienti di bootstrap in base alla dimensione e quindi determini le proporzioni sempre più grandi, la proporzione minima per due dovrebbe darti un valore p.

Normalmente utilizzo la seguente funzione in una situazione del genere:

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

4

Il bootstrap può essere usato per calcolare i valori- , ma avrebbe bisogno di una modifica sostanziale al tuo codice. Dato che non ho familiarità con il RI, posso solo darti un riferimento in cui puoi cercare quello che dovresti fare: il capitolo 4 di (Davison e Hinkley 1997).p

Davison, AC e Hinkley, DV 1997. Metodi Bootstrap e loro applicazione. Cambridge: Cambridge University Press.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.