Какая формула используется для стандартного отклонения в R?

19

Какая формула используется в функции стандартного отклонения sdв R?

CodeGuy
источник
Как правило, вы можете прочитать код функции, просто вызвав ее без скобок, как это сделал Gschneider.
Owe Jessen
2
@ OweJessen Хотя это правда, это часто не так полезно, как можно подумать. Многие функции в R являются просто обертками, которые вызывают базовый C-код. Например, sd ведет вас к var, что приводит к .Call (C_cov, x, y, na.method, FALSE).
Эрик

Ответы:

31

Как указывает @Gschneider, он вычисляет стандартное отклонение выборки

Σязнак равно1N(Икся-Икс¯)2N-1

который вы можете легко проверить следующим образом:

> #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
ocram
источник
4
Если вы посмотрите на страницу справки (? Sd), там написано: «Как и var, здесь используется знаменатель n-1», если по какой-то причине вы не верите симуляции ocram :-)
Matt Krause
@ Мэтт: Может быть, они должны обновить этот файл справки и сказать что-то вроде "это возвращает sqrt из var"?
Owe Jessen
@ OweJessen, я думаю, что на самом деле это говорит о том, что "var возвращает свою площадь!"
Мэтт Краузе
См. Также: stackoverflow.com/questions/9508518/… чтобы узнать, почему это моделирование может дать разные результаты для обеих функций.
Тим
Еще один простой способ проверить, sd( c(-1,0,1) )что выводит 1.
kjetil b halvorsen
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))
}
Gschneider
источник