Как в R найти стандартную ошибку среднего?

89

Есть ли какая-нибудь команда, чтобы найти стандартную ошибку среднего в 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.
Tom
3
Это очень хороший момент. Обычно я использую se. Я изменил этот ответ, чтобы отразить это.
Джон
5
Том, НЕТ stderr, НЕ вычисляет стандартную ошибку, которую отображает,display aspects. of connection
прогнозист
15
@forecaster Том не сказал, что stderrвычисляет стандартную ошибку, он предупреждал, что это имя используется в базе, и Джон изначально назвал свою функцию stderr(проверьте историю редактирования ...).
Molx
60

Версия ответа Джона выше, которая удаляет надоедливые NA:

stderr <- function(x, na.rm=FALSE) {
  if (na.rm) x <- na.omit(x)
  sqrt(var(x)/length(x))
}
случайно выбранное имя
источник
Обратите внимание, что stderrв baseпакете есть функция, которая выполняет что-то еще, поэтому лучше выбрать для нее другое имя, напримерse
sparrow
5

В sciplot пакета есть встроенная функция se (x)

user2045554
источник
3

Поскольку я время от времени возвращаюсь к этому вопросу, и поскольку этот вопрос старый, я публикую тест для получения ответов с наибольшим количеством голосов.

Обратите внимание, что для ответов @ Ian и @ 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)

введите описание изображения здесь

DJV
источник
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 пакетом REPEX (v0.3.0)

Матифу
источник
-12
y <- mean(x, na.rm=TRUE)

sd(y)для стандартного отклонения var(y)для дисперсии.

Оба вывода используются n-1в знаменателе, поэтому они основаны на выборочных данных.

user2945838
источник