2016-07-21 3 views
1

У меня есть большой список, содержащий 1000 списков переменных и одинаковой длины.Вычисление стандартного отклонения переменных в большом списке в R

Моя цель - рассчитать среднее, стандартное отклонение и стандартную ошибку всех списков в большом списке.

Я вычислил среднее значение переменных, используя Reduce(), но я не мог понять, как сделать то же самое для стандартного отклонения.

Мой список выглядит примерно так:

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  

Для расчета среднего, я:

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

list.mean 

    V1 V2 
1 1 3 
2 2 4 

Это слишком упрощенная версия большого списка, но как я могу вычислить список шириной стандартное отклонение и стандартная ошибка, как я сделал для обозначения?

спасибо, что заблаговременно!

+0

Это возможный дубликат вопроса [R дана списка одинаковых таблиц размерности данных, получения резюме с помощью каждой ячейки] (HTTP : //stackoverflow.com/q/38475103/3817004). – Uwe

+0

Спасибо за информацию.У меня уже было решение вычислить среднее значение в списке, что совпадает с ответом mtoto в предложенном вами сообщении. Моя основная проблема заключалась в том, чтобы рассчитать широко распространенный SD-список, в котором сообщения разрешены. Еще раз спасибо! – dictdic

ответ

0

Если вы остаетесь с Reduce(), вы должны сделать немного статистики:

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

Обратите внимание, что вы уже получили E(x) в list.mean. Чтобы получить E(x^2), он также прост:

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

Тогда дисперсия:

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

Стандартное отклонение только

list.sd <- sqrt(list.variance) 

Однако гораздо более эффективным решением является использование tapply()

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

Спасибо вам большое! Второе решение было действительно намного более эффективным. Одним из недостатков было то, что имена строк и имена столбцов были удалены. Я добавил функции rownames и colnames для решения проблемы. Еще раз спасибо! – dictdic

0

Если я могу предложить альтернативу, вы можете преобразовать список в трехмерную матрицу, а затем использовать apply() для получения результата.

Вот как преобразовать список (в предположении, одномерную регулярности):

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

А вот как использовать apply() на матрице:

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

здесь решение на основе изменения формы списка в данный .Таблица. мы в основном извлекаем значение индекса i из каждого под-списка для создания одного вектора.

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

тогда все вычисления являются прямо вперед:

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