【问题标题】:existing function to combine standard deviations in R?现有函数来组合 R 中的标准差?
【发布时间】:2022-01-01 02:52:32
【问题描述】:

我有 4 个具有已知均值和标准差的总体。我想知道大均值和大标准差。总均值显然很容易计算,但 R 有一个方便的实用函数 weighted.mean()。是否存在用于组合标准差的类似函数?

The calculation is not complicated,但现有的函数将使我的代码更清晰、更易于理解。

额外的问题,你用什么工具来搜索这样的功能?我知道它一定在那里,但我已经做了很多搜索,但找不到它。谢谢!

【问题讨论】:

标签: r aggregate standard-deviation


【解决方案1】:

人口是否不重叠?

library(fishmethods)
combinevar

例如,wikipedia 中的示例会这样工作:

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))
}

【讨论】:

    【解决方案2】:

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

    ## 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)}
    

    【讨论】:

    • 非常感谢弗洛德尔的回答。在查看 wikipedia 上的公式时,我认为我无法让计算看起来像您所做的那样简单。事实上,我可能只是使用它,但 AndresT 的回答对于其他发现这个问题的人来说更全面一些。谢谢!
    【解决方案3】:

    使用utilities包中的sample.decomp函数

    此类统计问题现已在 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 阅读有关此功能的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2017-11-07
      相关资源
      最近更新 更多