R 组合数据的标准差
我有一个数据集,包含平均值、标准差和n。其中一个变量的样本大小相等,而另一个变量的样本大小不同R 组合数据的标准差,r,variance,propagation,standard-deviation,R,Variance,Propagation,Standard Deviation,我有一个数据集,包含平均值、标准差和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)) 如何在R中建立一个计算组合标准偏差的函数?或者,如果有一
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))
如何在R中建立一个计算组合标准偏差的函数?或者,如果有一个为此设计的包,它也算作一个答案=)说明汇总数据集的精确方差是方差的平均值加上均值的方差。这与Rudmin的陈述给出了类似的值。使用Rudmin的数据集并基于:
使用实用程序
包中的sample.decomp
函数
在中的sample.decomp
函数中自动处理此类统计问题。此函数可以从子组矩计算合并样本矩,或从其他子组矩和合并矩计算缺少的子组矩。它适用于高达四阶的分解,即样本大小、样本均值、样本方差/标准差、样本偏度和样本峰度的分解
如何使用该函数:这里我们展示如何为您的数据集实现该函数
#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
#输入子组的样本统计信息
大小听起来你真的在要求人们为你编写一个函数来实现这个公式。@joran,如果是这样的话,我很抱歉。那真的不是我的意思。整个晚上我都在苦苦挣扎,想问问,因为根本没有解决这个问题的办法。我想,如果我要求的话,这会对其他人有利。我先问了一个较长的问题,解释了我所做的事情,但删除了它,因为它太长,很难理解。我想有几种方法可以做到这一点。这里给出的方法()给出的值与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).
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
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
#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