计算R中大型列表中变量的标准差

时间:2016-07-21 02:11:23

标签: r

我有一个包含1000个相同变量和相同长度列表的大型列表。

我的目标是计算大型列表中所有列表的平均值,标准差和标准误差。

我使用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

这是一个大型列表的过度简化版本,但我如何计算列表范围的标准差和标准错误,就像我为平均值所做的那样?

非常感谢你!

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

如果我可以提出替代方案,您可以将列表转换为3维矩阵,然后使用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

答案 2 :(得分:0)

这里是一个基于将列表重新整形为data.table的解决方案。我们基本上从每个子列表中提取索引i的值以创建单个向量。

post

然后所有的计算都是直截了当的:

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