Formula apa yang digunakan untuk standar deviasi dalam R?

19

Formula apa yang digunakan dalam fungsi standar deviasi sddalam R?

CodeGuy
sumber
Secara umum, Anda dapat membaca kode fungsi hanya dengan memanggilnya tanpa tanda kurung, seperti yang dilakukan Gschneider.
Owe Jessen
2
@ OweJessen Meskipun benar, ini seringkali tidak membantu seperti yang diperkirakan orang. Banyak fungsi dalam R hanya pembungkus yang memanggil kode C yang mendasarinya. Misalnya, sd mengarahkan Anda ke var, yang mengarahkan Anda ke .Call (C_cov, x, y, na.method, FALSE).
Erik

Jawaban:

31

Seperti yang ditunjukkan oleh @Gschneider, itu menghitung standar deviasi sampel

saya=1n(xsaya-x¯)2n-1

yang dapat Anda periksa dengan mudah sebagai berikut:

> #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
okram
sumber
4
Jika Anda melihat halaman bantuan (? Sd), ia mengatakan "Seperti var, ini menggunakan penyebut n-1", jika karena alasan tertentu Anda tidak percaya simulasi ocram :-)
Matt Krause
@ Matt: Mungkin mereka harus memperbarui file bantuan itu dan mengatakan sesuatu seperti "ini mengembalikan sqrt of var"?
Owe Jessen
@ OweJessen, saya pikir itu sebenarnya mengatakan bahwa "var mengembalikan kuadratnya!"
Matt Krause
Lihat juga: stackoverflow.com/questions/9508518/… untuk mempelajari mengapa simulasi ini dapat memberikan hasil yang berbeda untuk kedua fungsi.
Tim
Cara sederhana lain untuk mengujinya adalah sd( c(-1,0,1) )yang keluaran 1.
kjetil b halvorsen
12

Iya. Secara teknis, ini menghitung varians sampel, dan kemudian mengambil akar kuadrat:

> 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
sumber