2016-07-21 19 views
1

Ich habe eine große Liste, die 1000 Listen der gleichen Variablen und gleicher Länge enthält.Berechnung der Standardabweichung von Variablen in einer großen Liste in R

Mein Ziel ist es, Mittelwert, Standardabweichung und Standardfehler aller Listen innerhalb der großen Liste zu berechnen.

Ich habe Mittelwert der Variablen mit Reduce() berechnet, aber ich konnte nicht herausfinden, wie das gleiche für die Standardabweichung zu tun.

Meine Liste etwas wie folgt aussieht:

large.list <- vector('list', 1000) 

for (i in 1:1000) { 
    large.list[[i]] <- as.data.frame(matrix(c(1:4), ncol=2)) 
} 

large.list 

[[1]] 
    V1 V2 
1 1 3 
2 2 4 

[[2]] 
    V1 V2 
1 1 3 
2 2 4 

[[3]] 
    V1 V2 
1 1 3 
2 2 4 

...... 

[[1000]] 
    V1 V2 
1 1 3 
2 2 4  

Mittelwert zu berechnen, ich mache:

list.mean <- Reduce("+", large.list)/length(large.list) 

list.mean 

    V1 V2 
1 1 3 
2 2 4 

Dies ist übermäßig vereinfachte Version einer großen Liste, aber wie kann ich berechnen Liste weit Standardabweichung und Standardfehler wie ich für den Mittelwert?

Vielen Dank im Voraus!

+0

Dies ist eine mögliche Duplikat Frage [R einer Liste der gleichen Dimension Datentabellen gegeben, erzeugt eine Zusammenfassung der Mittel jeder Zelle] (http : //stackoverflow.com/q/38475103/3817004). – Uwe

+0

Danke für die Information.Ich hatte bereits eine Lösung, um listenweiten Mittelwert zu berechnen, der mit der Antwort von mtoto in Ihrem vorgeschlagenen Beitrag identisch ist. Mein Hauptproblem bestand darin, eine listenweite SD zu berechnen, die unterhalb der aufgelösten Beiträge veröffentlicht wird. Danke noch einmal! – dictdic

Antwort

0

Wenn Sie mit Reduce() bleiben, haben Sie ein wenig Statistik zu tun:

var(x) = E(x^2) - (E(x))^2 

Beachten Sie, dass Sie bereits E(x) als list.mean bekam. Um E(x^2) ist es auch einfach:

list.squared.mean <- Reduce("+", lapply(large.list, "^", 2))/length(large.list) 

Dann Varianz:

list.variance <- list.squared.mean - list.mean^2 

Standardabweichung ist nur

list.sd <- sqrt(list.variance) 

jedoch eine viel effizientere Lösung ist tapply() zu verwenden

vec <- unlist(large.list, use.names = FALSE) 
DIM <- dim(large.list[[1]]) 
n <- length(large.list) 

list.mean <- tapply(vec, rep(1:prod(DIM),times = n), mean) 
attr(list.mean, "dim") <- DIM 
list.mean <- as.data.frame(list.mean) 

list.sd <- tapply(vec, rep(1:prod(DIM),times = n), sd) 
attr(list.sd, "dim") <- DIM 
list.sd <- as.data.frame(list.sd) 
+0

Vielen Dank! Die zweite Lösung war tatsächlich viel effizienter. Ein Nachteil war, dass die Zeilen- und Spaltennamen entfernt wurden. Ich habe rownames und colnames Funktionen hinzugefügt, um das Problem zu lösen. Danke noch einmal! – dictdic

0

Wenn ich eine Alternative vorschlagen könnte, könnten Sie die Liste in eine 3-dimensionale Matrix umwandeln und dann apply() verwenden, um die Ausgabe zu erzeugen.

Hier ist, wie die Liste zu transformieren (dimensionale Regelmäßigkeit vorausgesetzt):

m <- do.call(cbind,lapply(large.list,as.matrix)); 
m <- array(m,c(nrow(m),ncol(m)/length(large.list),length(large.list))); 

Und hier ist, wie apply() auf der Matrix zu verwenden:

apply(m,1:2,mean); 
##  [,1] [,2] 
## [1,] 1 3 
## [2,] 2 4 
apply(m,1:2,sd); 
##  [,1] [,2] 
## [1,] 0 0 
## [2,] 0 0 
0

hier eine Lösung, die auf die Liste in Daten Umformen .Tabelle. Wir extrahieren grundsätzlich den Wert des Index i aus jeder Unterliste, um einen einzelnen Vektor zu erzeugen.

ll <- unlist(large.list) 
DX <- data.table(V1= ll[c(T,F,F,F)], 
       V2= ll[c(F,T,F,F)], 
       V3= ll[c(F,F,T,F)], 
       V4= ll[c(F,F,F,T)]) 

dann alle Berechnung ist einfach:

mm <- DX[,lapply(.SD,mean)] 
sdd <- DX[,lapply(.SD,sd)] 
Verwandte Themen