结合R中标准偏差的现有功能?

时间:2012-02-10 02:47:36

标签: r aggregate standard-deviation

我有4个已知手段和标准差的人群。我想知道伟大的意思和伟大的sd。平均值显然很容易计算,但R有一个方便的效用函数weighted.mean()。是否存在组合标准差的类似函数?

The calculation is not complicated,但现有的功能会使我的代码更清晰,更容易理解。

奖金问题,你用什么工具来搜索这样的功能?我知道它必须在那里,但我已经做了很多搜索而无法找到它。谢谢!

3 个答案:

答案 0 :(得分:5)

人口是否不重叠?

library(fishmethods)
combinevar

例如,维基百科中的示例可以这样工作:

xbar <- c(70,65)
s<-c(3,2)
n <- c(1,1)
combinevar(xbar,s,n)

和标准差将是sqrt(combinevar(xbar,s,n)[2])

如果您不想下载库,则函数如下:

combinevar <- 
function (xbar = NULL, s_squared = NULL, n = NULL) 
{
    if (length(xbar) != length(s_squared) | length(xbar) != length(n) | 
        length(s_squared) != length(n)) 
        stop("Vector lengths are different.")
    sum_of_squares <- sum((n - 1) * s_squared + n * xbar^2)
    grand_mean <- sum(n * xbar)/sum(n)
    combined_var <- (sum_of_squares - sum(n) * grand_mean^2)/(sum(n) - 
        1)
    return(c(grand_mean, combined_var))
}

答案 1 :(得分:5)

我不知道具体的包或函数名称,但似乎很容易从维基百科的页面推出自己的函数。假设人口没有重叠:

## N: vector of sizes
## M: vector of means
## S: vector of standard deviations

grand.mean <- function(M, N) {weighted.mean(M, N)}
grand.sd   <- function(S, M, N) {sqrt(weighted.mean(S^2 + M^2, N) -
                                      weighted.mean(M, N)^2)}

答案 2 :(得分:2)

使用sample.decomp包中的utilities函数

此类统计问题现已在 utilities packagesample.decomp 函数中自动处理。该函数可以从子组矩计算合并样本矩,或者从其他子组矩和合并矩计算缺失的子组矩。它适用于四阶分解——即样本大小、样本均值、样本方差/标准差、样本偏度和样本峰度的分解。


函数使用方法:这里我们举一个例子,我们使用函数来计算一个由四个子组组成的合并样本的样本矩。为此,我们首先生成一个包含四个大小不等的子组的模拟数据集 DATA,并将它们合并为单个数据集 POOL。可以使用同一个包中的moments函数获得子组和合并样本的矩。

#Create some subgroups of mock data and a pooled dataset
set.seed(1)
N    <- c(28, 44, 51, 102)
SUB1 <- rnorm(N[1])
SUB2 <- rnorm(N[2])
SUB3 <- rnorm(N[3])
SUB4 <- rnorm(N[4])
DATA <- list(SUB1 = SUB1, SUB2 = SUB2, SUB3 = SUB3, SUB4 = SUB4)
POOL <- c(SUB1, SUB2, SUB3, SUB4)

#Show sample statistics for the subgroups
library(utilities)
moments(DATA)

       n sample.mean sample.var sample.skew sample.kurt NAs
SUB1  28  0.09049834  0.9013829  -0.7648008    3.174128   0
SUB2  44  0.18637936  0.8246700   0.3653918    3.112901   0
SUB3  51  0.05986594  0.6856030   0.3076281    2.306243   0
SUB4 102 -0.05135660  1.0526184   0.3348429    2.741974   0

#Show sample statistics for the pooled sample
moments(POOL)

       n sample.mean sample.var sample.skew sample.kurt NAs
POOL 225  0.03799749  0.9030244   0.1705622    2.828833   0

现在我们有了子组的矩集合,我们可以使用 sample.decomp 函数从子组样本矩中获得合并的样本矩。作为此函数的输入,您可以使用子组的 moments 输出,也可以分别输入样本大小和样本矩作为向量(这里我们将使用后者)。如您所见,这为合并样本提供了与从基础数据直接计算相同的样本矩。

#Compute sample statistics for subgroups
library(utilities)
MEAN   <- c(mean(SUB1), mean(SUB2), mean(SUB3), mean(SUB4))
VAR    <- c( var(SUB1),  var(SUB2),  var(SUB3),  var(SUB4))

#Compute sample decomposition
sample.decomp(n = N, sample.mean = MEAN, sample.var  = VAR, names = names(DATA))

             n sample.mean sample.var
SUB1        28  0.09049834  0.9013829
SUB2        44  0.18637936  0.8246700
SUB3        51  0.05986594  0.6856030
SUB4       102 -0.05135660  1.0526184
--pooled-- 225  0.03799749  0.9030244

如您所见,sample.decomp 函数允许计算合并样本方差。您可以在 package documentation 中阅读有关此函数的信息。