2013-07-04 27 views
14

To jest mój pierwszy wpis na tym forum i chcę powiedzieć od samego początku, że nie jestem wprawnym programistą. Więc daj mi znać, jeśli pytanie lub kod były niejasne!Jak rozpocząć ładowanie w odniesieniu do informacji wewnątrz podmiotu?

Próbuję uzyskać przedział ufności 95% (CI) dla interakcji (to jest moja statystyka testu), wykonując ładowanie początkowe. Używam pakietu "boot". Mój problem polega na tym, że dla każdego resample, chciałbym, aby randomizacja była wykonywana w obrębie przedmiotów, tak aby obserwacje z różnych przedmiotów nie były mieszane. Oto kod generujący ramkę danych podobną do mojej. Jak widać, mam dwa wewnątrz-poddaje czynników („num” i „gram” i jestem zainteresowany interakcji między obu):

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) 

Jest to kod użyłem, aby uzyskać empiryczną wartość interakcji :

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

Jak widać, interakcja między moimi dwoma czynnikami wynosi -348. Chcę uzyskać bootstrap przedział ufności dla tej statystyki, które można wygenerować za pomocą „rozruchu” pakiet:

# 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 

Moim problemem jest to, że myślę, że resamples powinny być generowane bez mieszania poszczególnych przedmiotów obserwacje: To , aby wygenerować nowe próbki, obserwacje z tematu 1 (S1) powinny zostać przetasowane w obrębie tematu 1, nie mieszając ich z obserwacjami z tematów 2 itd. ... Nie wiem jak "boot" robi resampling (Przeczytałem dokumentację, ale nie rozumiem, jak działa ta funkcja)

Czy ktoś wie, w jaki sposób mogę upewnić się, że procedura resampling używana przez "boot" uwzględnia informacje na poziomie przedmiotu?

Bardzo dziękuję za pomoc/radę!

+3

+1 za bardzo ładne pierwsze pytanie, ale należy również usunąć inną wersję, która została [poddana migracji z CrossValidated] (http://stackoverflow.com/questions/17473321/how-to-bootstrap-respecting-subject -level-information). – Thomas

+0

@Thomas. Ups, zapomniałem o tym! Został usunięty :) – Sol

Odpowiedz

11

Wystarczy zmodyfikować wywołanie boot() tak:

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

?boot zapewnia ten opis strata= argumentu, który robi dokładnie to, o co prosicie przez:

warstw: Liczba całkowita wektora lub czynnik określający warstwy dla wielu próbek problemów. Może to być określone dla dowolnej symulacji , ale jest ignorowane, gdy "sim =" parametryczne "". Gdy dostarczono "warstwy" dla nieparametrycznego ładowania początkowego, symulacje są wykonywane w obrębie określonych warstw.


Dodatkowa uwaga:

Aby potwierdzić, że to działa, jak chcesz, możesz zadzwonić debugonce(boot) uruchomić powyższy apel, i krok po kroku debugera do obiektu i (którego wiersze zawierają indeksy używane do ponownego próbkowania wierszy data w celu utworzenia ponownego próbkowania bootstrap), które zostały przypisane, a następnie spójrz na nie.

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 

(Można wpisać Q, aby opuścić debuger w dowolnym momencie.)

+0

Dzięki @Josh, właśnie tego szukałem! A wskazówka do debugowania jest bardzo przydatna! – Sol

+0

@SolLago - Cieszę się, że mogę Ci pomóc. Debugowanie wydaje mi się prawie niezbędne. Ja przynajmniej nigdy nie byłem w stanie zmusić się do użycia argumentu "warstwowego" bez podglądania "pod maską", by upewnić się, że robi to, co chcę. –

+1

Dla teorii, odniesienia tutaj przydatne: http://stats.stackexchange.com/questions/43185/proper-bootstrapping-technique-for-clustered-data –