Trong R, làm thế nào để tìm sai số chuẩn của giá trị trung bình?


89

Có lệnh nào để tìm sai số chuẩn của giá trị trung bình trong R không?

Câu trả lời:



165

Sai số chuẩn chỉ là độ lệch chuẩn chia cho căn bậc hai của kích thước mẫu. Vì vậy, bạn có thể dễ dàng tạo chức năng của riêng mình:

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

92

Sai số chuẩn (SE) chỉ là độ lệch chuẩn của phân phối lấy mẫu. Phương sai của phân phối lấy mẫu là phương sai của dữ liệu chia cho N và SE là căn bậc hai của phân bố đó. Từ sự hiểu biết đó, người ta có thể thấy rằng sử dụng phương sai trong tính toán SE sẽ hiệu quả hơn. Các sdchức năng trong R đã làm một căn bậc hai (mã cho sdlà trong R và tiết lộ bằng cách chỉ cần gõ "sd"). Do đó, cách sau là hiệu quả nhất.

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

để làm cho hàm phức tạp hơn một chút và xử lý tất cả các tùy chọn mà bạn có thể chuyển đến var, bạn có thể thực hiện sửa đổi này.

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

Sử dụng cú pháp này, người ta có thể tận dụng những thứ như cách varxử lý các giá trị bị thiếu. Bất kỳ thứ gì có thể được chuyển tới vardưới dạng đối số được đặt tên đều có thể được sử dụng trong selệnh gọi này .


4
Điều thú vị là chức năng của bạn và Ian gần như nhanh giống nhau. Tôi đã thử nghiệm chúng cả 1000 lần với 10 ^ 6 triệu rnorm rút ra (không đủ sức để đẩy chúng khó hơn thế). Ngược lại, chức năng của plotrix luôn chậm hơn so với ngay cả những lần chạy chậm nhất trong số hai chức năng đó - nhưng nó còn có nhiều điều hơn thế nữa.
Matt Parker

6
Lưu ý rằng đó stderrlà một tên chức năng trong base.
Tom

3
Đó là một điểm rất tốt. Tôi thường sử dụng se. Tôi đã thay đổi câu trả lời này để phản ánh điều đó.
John

5
Tom, NO stderrKHÔNG tính toán sai số chuẩn nó sẽ hiển thịdisplay aspects. of connection
dự báo

15
@forecaster Tom không nói là stderrtính toán lỗi tiêu chuẩn, anh ấy đã cảnh báo rằng tên này được sử dụng trong cơ sở và John ban đầu đã đặt tên cho hàm của mình stderr(kiểm tra lịch sử chỉnh sửa ...).
Molx

60

Một phiên bản của câu trả lời của John ở trên loại bỏ NA phiền phức:

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

Lưu ý rằng có một chức năng hiện có được gọi stderrtrong basegói thực hiện một cái gì đó khác, vì vậy có thể tốt hơn nếu chọn một tên khác cho chức năng này, ví dụse
sparrow


3

Khi tôi quay lại câu hỏi này thỉnh thoảng và vì câu hỏi này đã cũ, tôi đang đăng một điểm chuẩn cho các câu trả lời được bình chọn nhiều nhất.

Lưu ý rằng đối với câu trả lời của @ Ian và @ John, tôi đã tạo một phiên bản khác. Thay vì sử dụng length(x), tôi đã sử dụng sum(!is.na(x))(để tránh NAs). Tôi đã sử dụng một vector 10 ^ 6, với 1.000 lần lặp lại.

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

Các kết quả:

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)

nhập mô tả hình ảnh ở đây


0

nói chung hơn, đối với các lỗi tiêu chuẩn trên bất kỳ tham số nào khác, bạn có thể sử dụng gói khởi động để mô phỏng bootstrap (hoặc tự viết chúng)



0

Hãy nhớ rằng giá trị trung bình cũng có thể thu được bằng cách sử dụng mô hình tuyến tính, hồi quy biến theo một điểm chặn duy nhất, bạn cũng có thể sử dụng lm(x~1)hàm cho điều này!

Ưu điểm là:

  • Bạn nhận được khoảng tin cậy ngay lập tức với confint()
  • Bạn có thể sử dụng các bài kiểm tra cho các giả thuyết khác nhau về giá trị trung bình, ví dụ: car::linear.hypothesis()
  • Bạn có thể sử dụng các ước tính phức tạp hơn về độ lệch chuẩn, trong trường hợp bạn có một số phương sai thay đổi, dữ liệu nhóm, dữ liệu không gian, v.v., hãy xem gói 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

Được tạo vào 2020-10-06 bởi gói reprex (v0.3.0)


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

sd(y)cho độ lệch chuẩn var(y)đối với phương sai.

Cả hai phép chiết xuất đều sử dụng n-1ở mẫu số nên chúng đều dựa trên dữ liệu mẫu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.