ใน R จะหาข้อผิดพลาดมาตรฐานของค่าเฉลี่ยได้อย่างไร?


คำตอบ:



167

ข้อผิดพลาดมาตรฐานเป็นเพียงค่าเบี่ยงเบนมาตรฐานหารด้วยรากที่สองของขนาดตัวอย่าง คุณจึงสามารถสร้างฟังก์ชันของคุณเองได้อย่างง่ายดาย:

> std <- function(x) sd(x)/sqrt(length(x))
> std(c(1,2,3,4))
[1] 0.6454972

93

ข้อผิดพลาดมาตรฐาน (SE) เป็นเพียงค่าเบี่ยงเบนมาตรฐานของการแจกแจงการสุ่มตัวอย่าง ความแปรปรวนของการแจกแจงการสุ่มตัวอย่างคือความแปรปรวนของข้อมูลหารด้วย N และ SE คือรากที่สองของสิ่งนั้น จากความเข้าใจนั้นเราจะเห็นได้ว่าการใช้ความแปรปรวนในการคำนวณ SE มีประสิทธิภาพมากกว่า sdฟังก์ชั่นใน R แล้วไม่หนึ่งราก (สำหรับsdเป็นในการวิจัยและเปิดเผยโดยเพียงแค่พิมพ์ "SD") ดังนั้นสิ่งต่อไปนี้จะมีประสิทธิภาพสูงสุด

se <- function(x) sqrt(var(x)/length(x))

เพื่อให้ฟังก์ชันซับซ้อนขึ้นเล็กน้อยและจัดการกับตัวเลือกทั้งหมดที่คุณสามารถส่งผ่านไปvarได้คุณสามารถทำการปรับเปลี่ยนนี้ได้

se <- function(x, ...) sqrt(var(x, ...)/length(x))

การใช้ไวยากรณ์นี้เราสามารถใช้ประโยชน์จากสิ่งต่างๆเช่นวิธีvarจัดการกับค่าที่ขาดหายไป สิ่งที่สามารถส่งผ่านไปvarเป็นอาร์กิวเมนต์ที่ตั้งชื่อสามารถใช้ในการseเรียกนี้


4
ที่น่าสนใจคือฟังก์ชั่นของคุณและเอียนนั้นเร็วเกือบเท่ากัน ฉันทดสอบพวกเขาทั้ง 1,000 ครั้งกับการดึง 10 ^ 6 ล้าน rnorm (พลังไม่เพียงพอที่จะผลักมันให้หนักกว่านั้น) ในทางกลับกันฟังก์ชั่นของ plotrix นั้นช้ากว่าการทำงานที่ช้าที่สุดของทั้งสองฟังก์ชันนี้เสมอ - แต่มันก็มีอะไรเกิดขึ้นมากมาย
Matt Parker

6
สังเกตว่าstderrเป็นชื่อฟังก์ชันในbase.
ทอม

3
นั่นเป็นจุดที่ดีมาก ฉันมักจะใช้ se ฉันได้เปลี่ยนคำตอบนี้เพื่อสะท้อนให้เห็นว่า
John

5
ทอมstderrไม่คำนวณข้อผิดพลาดมาตรฐานที่แสดงdisplay aspects. of connection
นักพยากรณ์

15
@forecaster ทอมไม่ได้บอกว่าstderrคำนวณข้อผิดพลาดมาตรฐานเขาเตือนว่าชื่อนี้ถูกใช้ในฐานและจอห์นตั้งชื่อฟังก์ชั่นของเขาstderr(ตรวจสอบประวัติการแก้ไข ... )
Molx

60

คำตอบของ John ข้างต้นที่ลบ NA ที่น่ารำคาญ:

stderr <- function(x, na.rm=FALSE) {
  if (na.rm) x <- na.omit(x)
  sqrt(var(x)/length(x))
}

โปรดทราบว่ามีการเรียกใช้ฟังก์ชันที่มีอยู่แล้วstderrในbaseแพ็กเกจที่ทำอย่างอื่นดังนั้นจึงควรเลือกชื่ออื่นสำหรับชื่อนี้เช่นse
sparrow


3

เมื่อฉันย้อนกลับไปที่คำถามนี้ทุกครั้งและเนื่องจากคำถามนี้เก่าแล้วฉันจึงโพสต์เกณฑ์มาตรฐานสำหรับคำตอบที่ได้รับการโหวตมากที่สุด

โปรดทราบว่าสำหรับคำตอบของ @ Ian และ @ John ฉันได้สร้างเวอร์ชันอื่น แทนที่จะใช้length(x)ฉันใช้sum(!is.na(x))(เพื่อหลีกเลี่ยง NAs) ฉันใช้เวกเตอร์ 10 ^ 6 โดยมีการทำซ้ำ 1,000 ครั้ง

library(microbenchmark)

set.seed(123)
myVec <- rnorm(10^6)

IanStd <- function(x) sd(x)/sqrt(length(x))

JohnSe <- function(x) sqrt(var(x)/length(x))

IanStdisNA <- function(x) sd(x)/sqrt(sum(!is.na(x)))

JohnSeisNA <- function(x) sqrt(var(x)/sum(!is.na(x)))

AranStderr <- function(x, na.rm=FALSE) {
  if (na.rm) x <- na.omit(x)
  sqrt(var(x)/length(x))
}

mbm <- microbenchmark(
  "plotrix" = {plotrix::std.error(myVec)},
  "IanStd" = {IanStd(myVec)},
  "JohnSe" = {JohnSe(myVec)},
  "IanStdisNA" = {IanStdisNA(myVec)},
  "JohnSeisNA" = {JohnSeisNA(myVec)},
  "AranStderr" = {AranStderr(myVec)}, 
  times = 1000)

mbm

ผล:

Unit: milliseconds
       expr     min       lq      mean   median       uq      max neval cld
    plotrix 10.3033 10.89360 13.869947 11.36050 15.89165 125.8733  1000   c
     IanStd  4.3132  4.41730  4.618690  4.47425  4.63185   8.4388  1000 a  
     JohnSe  4.3324  4.41875  4.640725  4.48330  4.64935   9.4435  1000 a  
 IanStdisNA  8.4976  8.99980 11.278352  9.34315 12.62075 120.8937  1000  b 
 JohnSeisNA  8.5138  8.96600 11.127796  9.35725 12.63630 118.4796  1000  b 
 AranStderr  4.3324  4.41995  4.634949  4.47440  4.62620  14.3511  1000 a  


library(ggplot2)
autoplot(mbm)

ป้อนคำอธิบายภาพที่นี่


0

โดยทั่วไปสำหรับข้อผิดพลาดมาตรฐานในพารามิเตอร์อื่น ๆ คุณสามารถใช้แพคเกจการบูตสำหรับการจำลอง bootstrap (หรือเขียนด้วยตัวคุณเอง)



0

โปรดจำไว้ว่าค่าเฉลี่ยสามารถทำได้โดยใช้แบบจำลองเชิงเส้นการถอยหลังตัวแปรเทียบกับการสกัดกั้นเดียวคุณสามารถใช้lm(x~1)ฟังก์ชันนี้ได้เช่นกัน!

ข้อดีคือ:

  • คุณจะได้รับช่วงความมั่นใจทันทีด้วย confint()
  • คุณสามารถใช้การทดสอบสำหรับสมมติฐานต่างๆเกี่ยวกับค่าเฉลี่ยโดยใช้ตัวอย่างเช่น car::linear.hypothesis()
  • คุณสามารถใช้การประมาณค่าเบี่ยงเบนมาตรฐานที่ซับซ้อนมากขึ้นได้ในกรณีที่คุณมีความยืดหยุ่นต่างกันข้อมูลคลัสเตอร์ข้อมูลเชิงพื้นที่ ฯลฯ ดูแพ็กเกจ sandwich
## generate data
x <- rnorm(1000)

## estimate reg
reg <- lm(x~1)
coef(summary(reg))[,"Std. Error"]
#> [1] 0.03237811

## conpare with simple formula
all.equal(sd(x)/sqrt(length(x)),
          coef(summary(reg))[,"Std. Error"])
#> [1] TRUE

## extract confidence interval
confint(reg)
#>                   2.5 %    97.5 %
#> (Intercept) -0.06457031 0.0625035

สร้างเมื่อ 2020-10-06 โดยแพ็คเกจ reprex (v0.3.0)


-12
y <- mean(x, na.rm=TRUE)

sd(y)สำหรับค่าเบี่ยงเบนมาตรฐานvar(y)สำหรับความแปรปรวน

อนุพันธ์ทั้งสองใช้n-1ในตัวส่วนเพื่อให้เป็นไปตามข้อมูลตัวอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.