如何计算R中多个标准差的平均值?



我试图找出如何计算一个数据集的标准差时,我有几个标准差。让我们看看这个MWE:

set.seed(1234)
dummy_data <- data.frame(
"col_1" = sample(1:7, size = 10, replace = TRUE),
"col_2" = sample(1:7, size = 10, replace = TRUE),
"col_3" = sample(1:7, size = 10, replace = TRUE),  
"col_4" = sample(1:7, size = 10, replace = TRUE)
)

既然我知道所有的数据点,我可以计算总标准差如下:

> sd(as.matrix(dummy_data))
[1] 1.727604

但我手头的真实数据如下:

> dplyr::summarise_all(dummy_data, sd)
col_1    col_2   col_3    col_4
1 1.837873 1.873796 1.37032 1.888562

如果我遵循通常的方法计算具有相似样本量的多个标准偏差的平均值,我将应用以下内容:

sds <- dplyr::summarise_all(dummy_data, sd)
vars <- sds^2
mean_sd <- sqrt(sum(vars) / (length(vars) - 1))
> mean_sd
[1] 2.027588

是不一样的!现在我试着不加- 1:

> sqrt(sum(vars) / (length(vars)))
[1] 1.755942

不能解决问题。我试着定义一个自己的标准差函数,像这样:

own_sd <- function(x) {
sqrt(sum((x - mean(x))^2) / length(x))
}

消去dplyr::summarise_all()步骤中的x - 1,然后按上述步骤平均:

> sqrt(sum(dplyr::summarise_all(dummy_data, own_sd)^2) / 3)
[1] 1.923538
> sqrt(sum(dplyr::summarise_all(dummy_data, own_sd)^2) / 4)
[1] 1.665833

但似乎都给出了不同于sd(as.matrix())方法的结果。这里出了什么问题?

你不能只知道群体SD就计算出全局SD。例如:

x1 = 1:5
x2 = 11:15
x3 = 101:105
## all the SDs are equal
(sd1 = sd(x1))
#[1] 1.581139
(sd2 = sd(x2))
#[1] 1.581139
(sd3 = sd(x3))
#[1] 1.581139
## however, combining the groups in pairs give very different results
sd(c(x1, x2))
# [1] 5.477226
sd(c(x1, x3))
# [1] 52.72571

这表明,即使样本量相同,知道两组的标准差并不能帮助你计算这两组的标准差。

根据Merijn van Tilborg的评论,如果你知道群体的大小和群体的意义,计算是可能的,如图所示。

最新更新