我有一个包含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
这是一个大型列表的过度简化版本,但我如何计算列表范围的标准差和标准错误,就像我为平均值所做的那样?
非常感谢你!
答案 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)])