我试图找出如何计算一个数据集的标准差时,我有几个标准差。让我们看看这个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的评论,如果你知道群体的大小和群体的意义,计算是可能的,如图所示。