2013-07-04 7 views
14

Questa è la prima volta che pubblico questo forum e voglio dire fin dall'inizio che non sono un abile programmatore. Quindi, per favore fatemi sapere se la domanda o il codice non erano chiari!Come eseguire il bootstrap rispettando le informazioni interne?

Sto cercando di ottenere l'intervallo di confidenza del 95% (CI) per un'interazione (ovvero la statistica del test) eseguendo il bootstrap. Sto usando il pacchetto "boot". Il mio problema è che per ogni ricampionamento, vorrei che la randomizzazione fosse fatta all'interno dei soggetti, in modo che le osservazioni di soggetti diversi non venissero mischiate. Ecco il codice per generare un dataframe simile al mio. Come potete vedere, ho due fattori entro soggetti ("Num" e "Gram" e sono interessato nell'interazione tra entrambi):

Subject = rep(c("S1","S2","S3","S4"),4) 
Num  = rep(c("singular","plural"),8) 
Gram = rep(c("gram","gram","ungram","ungram"),4) 
RT  = c(657,775,678,895,887,235,645,916,930,768,890,1016,590,978,450,920) 
data = data.frame(Subject,Num,Gram,RT) 

Questo è il codice che ho usato per ottenere il valore dell'interazione empirica :

summary(lm(RT ~ Num*Gram, data=data)) 

Come si può vedere, l'interazione tra i miei due fattori è -348. Voglio ottenere un intervallo di confidenza di bootstrap per questa statistica, che posso generare utilizzando il "boot" pacchetto:

# You need the following packages 
install.packages("car") 
install.packages("MASS") 
install.packages("boot") 
library("car") 
library("MASS") 
library("boot") 

#Function to create the statistic to be boostrapped 
boot.huber <- function(data, indices) { 
data <- data[indices, ] #select obs. in bootstrap sample 
mod <- lm(RT ~ Num*Gram, data=data) 
coefficients(mod)  #return coefficient vector 
} 

#Generate bootstrap estimate 
data.boot <- boot(data, boot.huber, 1999) 

#Get confidence interval 
boot.ci(data.boot, index=4, type=c("norm", "perc", "bca"),conf=0.95) #4 gets the CI for the interaction 

mio problema è che credo che le ricampiona dovrebbero essere generati senza mescolare i singoli soggetti osservazioni: questo è , per generare i nuovi campioni, le osservazioni del soggetto 1 (S1) dovrebbero essere mescolate all'interno del soggetto 1, non mescolandole con le osservazioni dei soggetti 2, ecc ... Non so come "boot" sta facendo il ricampionamento (Ho letto la documentazione ma non capisco come funziona la funzione)

Qualcuno sa come posso verificare che la procedura di ricampionamento utilizzata da "boot" rispetti le informazioni a livello di soggetto?

Grazie mille per il vostro aiuto/consiglio!

+3

+1 per una prima domanda molto bella, ma è necessario eliminare anche l'altra versione che è stata [migrata da CrossValidated] (http://stackoverflow.com/questions/17473321/how-to-bootstrap-respecting-subject -level-informazione). – Thomas

+0

@Thomas. Ops, l'ho dimenticato! Adesso è cancellato :) – Sol

risposta

11

Basta modificare la chiamata a boot() in questo modo:

data.boot <- boot(data, boot.huber, 1999, strata=data$Subject) 

?boot fornisce questa descrizione dell'argomento strata=, che fa esattamente quello che stai chiedendo:

strati: Un vettore intero o fattore che specifica gli strati per i problemi a più campioni . Questo può essere specificato per qualsiasi simulazione , ma viene ignorato quando 'sim = "parametrico"'. Quando lo standard viene fornito per un bootstrap non parametrico, le simulazioni vengono eseguite all'interno degli strati specificati.


Nota aggiuntiva:

Per confermare che si tratta di lavorare come vuoi, è possibile chiamare debugonce(boot), eseguire la chiamata di cui sopra, e passo attraverso il debugger finché l'oggetto i (il cui le righe contengono gli indici utilizzati per ricampionare le righe di data per creare ogni resamp del bootstrap che è stato assegnato e quindi dare un'occhiata a esso.

debugonce(boot) 
data.boot <- boot(data, boot.huber, 1999, strata=data$Subject) 
# Browse[2]> 
## [Press return 34 times] 
# Browse[2]> head(i) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] 
# [1,] 9 10 11 16 9 14 15 16 9  2 15 16  1 10 
# [2,] 9 14 7 12 5 6 15 4 13  6 11 16 13  6 
# [3,] 5 10 15 16 9 6 3 4 1  2 15 12  5  6 
# [4,] 5 10 11 4 9 6 15 16 9 14 11 16  5  2 
# [5,] 5 10 3 4 1 10 15 16 9  6  3  8 13 14 
# [6,] 13 10 3 12 5 10 3 4 5 14  7 16  5 14 
#  [,15] [,16] 
# [1,]  7  8 
# [2,] 11 16 
# [3,]  3 16 
# [4,]  3  8 
# [5,]  7  8 
# [6,]  7 12 

(È possibile inserire Q di lasciare il debugger in qualsiasi momento.

+0

Grazie a Jo, è esattamente quello che stavo cercando! E il consiglio di debug è super utile! – Sol

+0

@SolLago - Felice di essere in grado di aiutare. Il bit di debug sembra quasi essenziale per me. Almeno non sono mai stato in grado di portarmi ad usare l'argomento "strata" senza dare una sbirciata "sotto il cofano" per rassicurarmi sul fatto che stia facendo quello che voglio. –

+1

Per la teoria, ho trovato i riferimenti qui utili: http://stats.stackexchange.com/questions/43185/proper-bootstrapping-technique-for-clustered-data –

Problemi correlati