在R中,标准差似乎返回了错误的答案 - 我做错了什么吗?

27

计算标准差的简单示例:

d <- c(2,4,4,4,5,5,7,9)
sd(d)
产生
[1] 2.13809

但是当手工计算时,答案为2。我错在哪里了?


那正是问题所在。我想我应该假设sd正在计算样本标准差。感谢您的洞察力,我很感激。我将把这个添加到我的所有计算中:d <- c(2,4,4,4,5,5,7,9); n <- length(d); sd(d)*sqrt((n-1)/n); - Travis Rodman
在这个问题上,那么,在 R 中是什么命令可以生成样本标准差,使得分母中的 N-1 不需要被校正呢? - Travis Rodman
4个回答

38

试试这个

R> sd(c(2,4,4,4,5,5,7,9)) * sqrt(7/8)
[1] 2
R> 

请参阅Wikipedia文章,了解关于标准差估计的讨论。使用手动计算的公式会导致有偏估计,因此需要进行校正(sqrt((N-1)/N))。这里是一个重要引用:

样本标准差用于未校正的估计量(使用N),而修正后的估计量使用样本数N-1,此时分母为残差向量中的自由度数量。


1
阅读了进一步的文章和您的评论后,我明白为什么没有一个函数可以产生有偏见的结果。如果我想要它,我必须自己定义或计算。再次感谢,回答非常准确。 - Travis Rodman
如果你想要这样一个函数,很容易编写,因为你已经有了 sd() 函数,只需要将其结果乘以 sqrt((N-1)/N),其中 N 是你的向量长度 -- 就像我的答案一样,但是计算 N 时是 8。 - Dirk Eddelbuettel
1
值得注意的是,sd 函数也会给出偏差估计的标准差(参见例如这篇 Wikipedia 文章)。N-1 校正是为了确保 var 是无偏的。 - pete
每个标准差计算都是估计的这种想法似乎是错误的。我有很多应用程序,其中整个人口都在我面前,而在基本R中没有此函数作为标准选项似乎很奇怪。是的,编写自己的函数很容易,但没有理由“不会有一个产生有偏结果的函数”,因为结果本身并不是有偏的。有一种特定的估计器是有偏的,但不是使用该公式的所有计算都是使用该估计器的估计计算。 - randy

9

看起来 R 在分母中假设的是 (n-1) 而不是 n。


1
哎呀,你可能想删除那个最后的评论。 - Nick Sabbe
5
不是这样的。n-1 是样本标准差。除数n是总体标准差。方差将是sd^2,但同样地,因为R在var()sd()中使用除数n-1,所以这将是样本方差。R使用这个除数的文档可以在?sd中清楚地找到。 - Gavin Simpson

6

当我想要计算总体方差或标准差时(以n作为分母),我定义了这两个向量化函数。

  pop.var <- function(x) var(x) * (length(x)-1) / length(x)

  pop.sd <- function(x) sqrt(pop.var(x))

顺便提一下,可汗学院在这里对于样本和总体标准差有很好的讨论。


0
请注意运行以下命令:
?sd 

在R Studio中,显示函数的帮助页面。在详细信息部分中,它说明:

与var类似,此函数使用分母n-1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接