我有一个平均值,标准差和n的数据集。其中一个变量具有相同的样本大小,而另一个变量具有相同的样本大小。
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
和y
变量,并尝试找到一种代码保留方式来计算组合标准偏差,例如使用aggregate
函数。 The equation for combined standard deviation正在关注:
对于不相等的样本量(same source):
我的组合数据框应如下所示:
variable mean sd
x 2.95 sd_x
y 5.76 sd_y
如何在R中创建一个计算组合标准差的函数?或者,如果有一个为此设计的包,它也算作答案=)
答案 0 :(得分:1)
Rudmin (2010)指出汇总数据集的精确方差是方差的均值加上均值的方差。 flodel has already provided an answer and function给出了与Rudmin陈述相似的值。使用Rudmin的数据集和基于flodel's function的Wikipedia:
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).
然而,与function 5.38 from Headrick (2010)相比,此解决方案的值略有不同(除非某处出现错误):
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
答案 1 :(得分:1)
.[] | (.name, .author.email)
包中的sample.decomp
函数此类统计问题在 utilities
package 的 utilities
函数中自动处理。该函数可以从子组矩计算合并样本矩,或者从其他子组矩和合并矩计算缺失的子组矩。它适用于四阶分解——即样本大小、样本均值、样本方差/标准差、样本偏度和样本峰度的分解。
如何使用该函数:这里我们展示了如何为您的数据集实现该函数。
sample.decomp
此输出为您提供合并样本大小、样本均值和样本标准差(或等效的样本方差)。