R中的标准偏差使用什么公式?


19

sdR 中的标准偏差函数使用什么公式?


通常,您可以像Gschneider一样,通过不带括号的简单调用来读取函数的代码。
Owe Jessen

2
@OweJessen虽然为真,但这通常没有人们想象的有用。R中的许多函数仅仅是调用基础C代码的包装器。例如,sd会将您引导至var,这会将您引导至.Call(C_cov,x,y,na.method,FALSE)。
Erik

Answers:


31

正如@Gschneider指出的那样,它计算样本标准偏差

i=1n(xix¯)2n1

您可以轻松检查以下内容:

> #generate a random vector
> x <- rnorm(n=5, mean=3, sd=1.5)
> n <- length(x)
> 
> #sd in R
> sd1 <- sd(x)
> 
> #self-written sd
> sd2 <- sqrt(sum((x - mean(x))^2) / (n - 1))
>  
> #comparison
> c(sd1, sd2)   #:-)
[1] 0.6054196 0.6054196

4
如果您查看帮助页面(?sd),它会显示“像var,它使用分母n-1”,如果出于某种原因您不相信ocram的模拟结果,那么:-)
Matt Krause

@ Matt:也许他们应该更新该帮助文件,并说类似“这将返回var的sqrt”?
Owe Jessen

@OweJessen,我认为它实际上是在说“ var返回其平方!”
马特·克劳斯

另请参阅:stackoverflow.com/questions/9508518/…,以了解为什么该模拟可以为两个函数提供不同的结果。
蒂姆

另一种简单的方法来测试它是sd( c(-1,0,1) )其输出1
HALVORSEN谢蒂尔b

12

是。从技术上讲,它计算样本方差,然后取平方根:

> sd
function (x, na.rm = FALSE) 
{
if (is.matrix(x)) 
    apply(x, 2, sd, na.rm = na.rm)
else if (is.vector(x)) 
    sqrt(var(x, na.rm = na.rm))
else if (is.data.frame(x)) 
    sapply(x, sd, na.rm = na.rm)
else sqrt(var(as.vector(x), na.rm = na.rm))
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.