2013-07-04 9 views
14

Dies ist das erste Mal, dass ich in diesem Forum posten, und ich möchte von Anfang an sagen, dass ich kein geschickter Programmierer bin. Also lass es mich wissen, wenn die Frage oder der Code unklar sind!Wie man die Informationen innerhalb des Subjekts bootstrapst?

Ich versuche, das 95% Konfidenzintervall (CI) für eine Interaktion (das ist meine Teststatistik) durch Bootstrapping zu erhalten. Ich benutze das Paket "boot". Mein Problem ist, dass ich für jede Resample die Randomisierung innerhalb von Subjekten möchte, so dass die Beobachtungen von verschiedenen Subjekten nicht gemischt werden. Hier ist der Code, um einen ähnlichen Datenrahmen zu generieren. Wie Sie sehen können, habe ich zwei Faktoren innerhalb Subjekt („Num“ und „Gram“ und ich bin in der Interaktion zwischen den beiden interessiert):

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) 

Dies ist der Code, den ich verwendet, um die empirische Interaktion Wert zu erhalten :

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

Wie Sie sehen können, ist die Interaktion zwischen meinen beiden Faktoren -348. Ich mag einen Bootstrap-Konfidenzintervall für diese Statistik erhalten, die wir generieren kann das „boot“ Paket mit:

# 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 

Mein Problem ist, dass ich das Resampling denken soll, ohne das Mischen der einzelnen Fächer Beobachtungen erzeugt werden: dh Um die neuen Resamples zu generieren, sollten die Beobachtungen von Subjekt 1 (S1) innerhalb von Subjekt 1 gemischt werden, nicht mit den Beobachtungen von Subjekt 2, etc ... Ich weiß nicht, wie "boot" das Resampling durchführt (Ich lese die Dokumentation, aber verstehe nicht, wie die Funktion es tut)

Weiß jemand, wie ich sicherstellen konnte, dass das von "boot" verwendete Resampling-Verfahren die Informationen auf der Fachebene berücksichtigt?

Vielen Dank für Ihre Hilfe/Beratung!

+3

+1 für eine sehr schöne erste Frage, aber Sie sollten auch die andere Version löschen, die [von CrossValidated migriert wurde] (http://stackoverflow.com/questions/17473321/how-to-bootstrap-respecting-subject -level-Information). – Thomas

+0

@Thomas. Ups, ich habe es vergessen! Es ist jetzt gelöscht :) – Sol

Antwort

11

einfach Ihren Anruf boot() wie dies ändern:

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

?boot stellt diese Beschreibung des strata= Argument, das ist genau das tut, was Sie fordern:

Schichten: Ein Integer-Vektor oder Faktor, der die Schichten für Multi-Sample-Probleme angibt. Dies kann für jede Simulation angegeben werden, wird aber ignoriert, wenn 'sim = "parametrisch"'. Wenn 'strata' für einen nichtparametrischen Bootstrap bereitgestellt wird, werden die Simulationen innerhalb der angegebenen Schichten durchgeführt.


Zusätzliche Anmerkung:

Um zu bestätigen, dass es, wie Sie funktioniert möchten, Sie debugonce(boot) anrufen können, um den Anruf über laufen und i bis das Objekt durch den Debugger Schritt (dessen Zeilen enthalten die Indizes, die für die Neuabtastung der Zeilen von data verwendet werden, um jedes Bootstrap-Resample zu erstellen), das zugewiesen wurde, und schauen es sich dann an.

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 

(Sie können Q geben Sie den Debugger jederzeit zu verlassen.)

+0

Dank @Josh, das ist genau das, was ich gesucht habe! Und der Debugging-Tipp ist super nützlich! – Sol

+0

@SolLago - Froh, helfen zu können. Das Debugging-Bit scheint für mich fast essentiell zu sein. Ich war zumindest nie in der Lage, mich dazu zu überreden, das "Strata" -Argument zu verwenden, ohne einen Blick "unter die Haube" zu werfen, um mir selbst zu versichern, dass es tut, was ich will. –

+1

Für die Theorie fand ich die Referenzen hier nützlich: http://stats.stackexchange.com/questions/43185/proper-bootstrapping-technique-for-clustered-data –

Verwandte Themen