R'de, ortalamanın standart hatası nasıl bulunur?


90

R'deki ortalamanın standart hatasını bulmak için herhangi bir komut var mı?

Yanıtlar:



168

Standart hata, sadece standart sapmanın örneklem büyüklüğünün kareköküne bölünmesidir. Böylece kendi işlevinizi kolayca yapabilirsiniz:

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

93

Standart hata (SE), örnekleme dağılımının sadece standart sapmasıdır. Örnekleme dağılımının varyansı, verilerin varyansının N'ye bölünmesidir ve SE, bunun kareköküdür. Bu anlayıştan hareketle, SE hesaplamasında varyansı kullanmanın daha verimli olduğu görülebilir. sdR fonksiyonu zaten bir kare kökü (kodunu yapar sdR ve sadece yazarak "sd" ile ortaya). Bu nedenle, aşağıdakiler en etkilidir.

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

İşlevi biraz daha karmaşık hale getirmek ve geçebileceğiniz tüm seçenekleri işlemek variçin bu değişikliği yapabilirsiniz.

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

Bu sözdizimini kullanarak var, eksik değerlerle nasıl başa çıkılacağı gibi şeylerden yararlanılabilir . varAdlandırılmış bir argüman olarak aktarılabilen her şey bu seçağrıda kullanılabilir .


4
İlginç bir şekilde, işleviniz ve Ian'ınki neredeyse aynı derecede hızlı. Her ikisini de 10 ^ 6 milyon rnorm çekişine karşı 1000 kez test ettim (onları bundan daha fazla zorlamak için yeterli güç yok). Tersine, plotrix'in işlevi her zaman bu iki işlevin en yavaş çalışmasından bile daha yavaştı - ama aynı zamanda kaputun altında çok daha fazlası var.
Matt Parker

6
İçinde stderrbir işlev adı olduğuna dikkat edin base.
Tom

3
Bu çok iyi bir nokta. Genelde se kullanırım. Bunu yansıtmak için bu cevabı değiştirdim.
John

5
Tom, HAYIR stderrgörüntülediği standart hatayı hesaplamazdisplay aspects. of connection
tahminci

15
@forecaster Tom stderrstandart hatayı hesapladığını söylemedi , bu adın temelde kullanıldığını söylüyordu ve John orijinal olarak işlevini adlandırdı stderr(düzenleme geçmişini kontrol edin ...).
Molx

60

John'un yukarıdaki yanıtının sinir bozucu NA'ları ortadan kaldıran bir versiyonu:

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

Pakette başka bir şey yapan mevcut bir işlevin stderrbulunduğuna dikkat edin base, bu nedenle bunun için başka bir ad seçmek daha iyi olabilir, örneğinse
serçe


3

Ara sıra bu soruya geri döndüğümde ve bu soru eski olduğu için, en çok oylanan cevaplar için bir kıyaslama yapıyorum.

@ Ian ve @ John'un yanıtları için başka bir sürüm oluşturduğuma dikkat edin. Bunun yerine kullanmanın length(x), kullandığım sum(!is.na(x))(Nas önlemek için). 1.000 tekrarlı 10 ^ 6'lık bir vektör kullandım.

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

Sonuçlar:

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)

görüntü açıklamasını buraya girin


0

daha genel olarak, diğer parametrelerdeki standart hatalar için, önyükleme simülasyonları için önyükleme paketini kullanabilirsiniz (veya bunları kendi başınıza yazabilirsiniz)



0

Ortalamanın doğrusal bir model kullanılarak elde edilebileceğini, değişkeni tek bir kesişme karşısında gerileyebileceğini hatırlayarak, bunun için lm(x~1)işlevi de kullanabilirsiniz !

Avantajlar:

  • İle anında güven aralıkları elde edersiniz confint()
  • Ortalama ile ilgili çeşitli hipotezler için testleri kullanabilirsiniz, örneğin car::linear.hypothesis()
  • Bazı heteroskedastisiteye, kümelenmiş veriye, uzamsal veriye vb. Sahipseniz, standart sapmanın daha karmaşık tahminlerini kullanabilirsiniz. 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 tarihinde reprex paketi tarafından oluşturuldu (v0.3.0)


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

sd(y)var(y)varyans için standart sapma için.

Her iki türetme n-1paydada kullanılır , bu nedenle örnek verilere dayanırlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.