0

我有一个包含平均值、标准差和 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))

我需要组合xy变量,并试图找到一种节省代码的方法来计算组合标准偏差,例如使用aggregate函数。组合标准差的公式如下:

在此处输入图像描述

对于不等的样本量(相同的来源):

在此处输入图像描述

我的组合数据框应如下所示:

variable    mean    sd
x           2.95    sd_x
y           5.76    sd_y

如何在 R 中创建一个计算组合标准差的函数?或者,如果有为此设计的包,它也算作答案=)

4

2 回答 2

1

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
于 2012-11-28T10:16:20.083 回答
1

使用包sample.decomp中的函数utilities

这类统计问题在sample.decomp中的函数中是自动化的。此函数可以从子组矩计算池样本矩,或从其他子组矩和池矩计算缺失的子组矩。它适用于高达四阶的分解——即样本大小、样本均值、样本方差/标准偏差、样本偏度和样本峰度的分解。utilities


如何使用该函数:这里我们展示了如何为您的数据集实现该函数。

#Input sample statistics for subgroups
SIZE <- c(3, 3, 5, 4, 6)
MEAN <- c(3.4, 2.5, 6.5, 5.7, 5.1)
SD   <- c(1.2, 0.7, 2.4, 4.0, 3.5)

#Compute sample decomposition
library(utilities)
sample.decomp(n = SIZE, sample.mean = MEAN, sample.sd = SD, include.sd = TRUE)

            n sample.mean sample.sd sample.var
1           3    3.400000  1.200000   1.440000
2           3    2.500000  0.700000   0.490000
3           5    6.500000  2.400000   5.760000
4           4    5.700000  4.000000  16.000000
5           6    5.100000  3.500000  12.250000
--pooled-- 21    4.933333  2.964428   8.787833

此输出为您提供合并样本量、样本均值和样本标准差(或等效的样本方差)。

于 2021-02-06T04:42:28.443 回答