Rudmin (2010)指出,合并数据集的精确方差是方差的均值加上均值的方差。flodel 已经提供了一个答案和函数,它给出了与 Rudmin 的声明相似的值。使用基于Wikipedia的Rudmin 的数据集和flodel 的函数:
df <- data.frame(mean = c(30.66667, 31.14286, 40.33333), variance = c(8.555555, 13.26531, 1.555555), n = c(6,7,3))
grand.sd <- function(S, M, N) {sqrt(weighted.mean(S^2 + M^2, N) -
weighted.mean(M, N)^2)}
grand.sd(sqrt(df$variance), df$mean, df$n)^2
#[1] 22.83983 = Dp variance in Rudmin (2010).
然而,与 Headrick (2010)中的函数 5.38 相比,此解决方案给出的值略有不同(除非某处有错误):
dat <- data.frame(variable = c(rep("x", 2), rep("y", 3)), replicate = c(1,2,1,2,3),
mean = c(3.4, 2.5, 6.5, 5.7, 5.1), sd = c(1.2, 0.7, 2.4, 4.0, 3.5),
n = c(3,3,5,4,6))
x <- subset(dat, variable == "x")
((x$n[1]^2)*(x$sd[1]^2)+
(x$n[2]^2)*(x$sd[2]^2)-
(x$n[2])*(x$sd[1]^2) -
(x$n[2])*(x$sd[2]^2) -
(x$n[1])*(x$sd[1]^2) -
(x$n[1])*(x$sd[2]^2) +
(x$n[1])*(x$n[2])*(x$sd[1]^2) +
(x$n[1])*(x$n[2])*(x$sd[2]^2) +
(x$n[1])*(x$n[2])*(x$mean[1] - x$mean[2])^2)/
((x$n[1] + x$n[2] - 1)*(x$n[1] + x$n[2]))
#[1] 1.015
grand.sd(x$sd, x$mean, x$n)^2
#[1] 1.1675
为了回答我自己的问题,data.frame
将获得以下所需的内容:
library(plyr)
ddply(dat, c("variable"), function(dat) c(mean=with(dat,weighted.mean(mean, n)), sd = with(dat, grand.sd(sd, mean, n))))
variable mean sd
1 x 2.950000 1.080509
2 y 5.726667 3.382793