У R, як знайти стандартну помилку середнього?


90

Чи існує якась команда для пошуку стандартної помилки середнього значення в R?

Відповіді:



165

Стандартна помилка - це просто середньоквадратичне відхилення, поділене на квадратний корінь розміру вибірки. Тож ви можете легко створити власну функцію:

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

92

Стандартна помилка (SE) - це лише стандартне відхилення розподілу вибірки. Дисперсія розподілу вибірки - це дисперсія даних, поділена на N, а SE - квадратний корінь з них. Виходячи з цього розуміння, можна зрозуміти, що ефективніше використовувати дисперсію в розрахунку SE. sdФункція R вже робить один квадратний корінь (код sdзнаходиться в R і розкривається, просто набравши «сд»). Тому наступне є найбільш ефективним.

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

для того, щоб зробити функцію лише трохи складнішою та обробити всі параметри, до яких ви могли перейти var, ви можете внести цю модифікацію.

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

Використовуючи цей синтаксис, можна скористатися такими речами, як порядок роботи varз відсутніми значеннями. У varцьому seвиклику може бути використано все, що може бути передано як іменований аргумент .


4
Цікаво, що ваша функція та функція Яна майже однаково швидкі. Я протестував їх обох 1000 разів проти 10 ^ 6 мільйонів ринорм (не вистачає сили, щоб підштовхнути їх сильніше, ніж це). І навпаки, функція plotrix завжди була повільнішою, ніж навіть найповільніші запуски цих двох функцій - але вона також має набагато більше подій під капотом.
Метт Паркер,

6
Зверніть увагу, що stderrце назва функції в base.
Том

3
Це дуже хороший момент. Я зазвичай використовую se. Я змінив цю відповідь, щоб відобразити це.
Джон

5
Томе, НІ stderrНЕ обчислює стандартну помилку, яку він відображаєdisplay aspects. of connection
синоптик

15
@forecaster Том не сказав, що stderrобчислює стандартну помилку, він попереджав, що це ім'я використовується в основі, і Джон спочатку назвав свою функцію stderr(перевірте історію редагування ...).
Molx

60

Версія відповіді Джона вище, яка усуває настирливі НС:

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

Зверніть увагу, що stderrв baseпакеті існує функція, що викликається іншим способом, тому, можливо, буде краще вибрати іншу назву для цієї, наприкладse
воробей


3

Оскільки я періодично повертаюся до цього питання, і оскільки це питання застаріле, я публікую орієнтир для найбільш голосованих відповідей.

Зауважте, що для відповідей @ Ian's та @ John я створив іншу версію. Замість того, щоб використовувати length(x), я використовував sum(!is.na(x))(щоб уникнути НС). Я використав вектор 10 ^ 6 з 1000 повторень.

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

загальніше, для стандартних помилок за будь-яким іншим параметром ви можете використовувати завантажувальний пакет для імітацій завантажувального програмного забезпечення (або написати їх самостійно)



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

Створено 06.10.2020 пакетом reprex (v0.3.0)


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

sd(y)для стандартного відхилення var(y)для дисперсії.

Обидва виведення використовують n-1у знаменнику, тому вони базуються на даних вибірки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.