สูตรใดที่ใช้สำหรับค่าเบี่ยงเบนมาตรฐานใน R


19

สูตรใดที่ใช้ในฟังก์ชันเบี่ยงเบนมาตรฐานsdใน R


โดยทั่วไปคุณจะสามารถอ่านโค้ดของฟังก์ชันได้โดยเพียงแค่เรียกมันโดยไม่ต้องใส่วงเล็บอย่างที่ Gschneider ทำ
Owe Jessen

2
@OweJessen ในขณะที่เป็นจริงนี้มักจะไม่เป็นประโยชน์อย่างที่ใคร ๆ ก็คิดว่า ฟังก์ชั่นจำนวนมากใน R เป็นเพียงการห่อหุ้มที่เรียกรหัส C พื้นฐาน ตัวอย่างเช่น sd นำคุณไปสู่ ​​var ซึ่งนำคุณไปสู่. Call (C_cov, x, y, na.method, FALSE)
Erik

คำตอบ:


31

ดังที่ชี้แจงโดย @Gschneider จะคำนวณค่าเบี่ยงเบนมาตรฐานตัวอย่าง

Σผม=1n(xผม-x¯)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

4
(SD) ถ้าคุณดูที่หน้าความช่วยเหลือก็กล่าวว่า "ชอบ var, ใช้นี้หาร n-1" ถ้าด้วยเหตุผลบางอย่างที่คุณไม่เชื่อว่าการจำลอง ocram ของ :-)
แมตต์กรอ

@ Matt: บางทีพวกเขาควรปรับปรุงไฟล์ช่วยเหลือและพูดบางอย่างเช่น "ส่งคืน sqrt ของ var" หรือไม่?
Owe Jessen

@OweJessen ฉันคิดว่าจริง ๆ แล้วมันพูดว่า "var ส่งคืนสแควร์ของมัน!"
แมตต์ Krause

ดูเพิ่มเติมที่: 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))
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.