En R, ¿cómo encontrar el error estándar de la media?

89

¿Existe algún comando para encontrar el error estándar de la media en R?

alex
fuente

Respuestas:

165

El error estándar es solo la desviación estándar dividida por la raíz cuadrada del tamaño de la muestra. Para que pueda crear fácilmente su propia función:

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

El error estándar (SE) es solo la desviación estándar de la distribución muestral. La varianza de la distribución muestral es la varianza de los datos dividida por N y el SE es la raíz cuadrada de eso. Partiendo de esa comprensión, se puede ver que es más eficiente usar la varianza en el cálculo de EE. La sdfunción en R ya tiene una raíz cuadrada (el código para sdestá en R y se revela simplemente escribiendo "sd"). Por tanto, lo siguiente es más eficaz.

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

Para hacer la función un poco más compleja y manejar todas las opciones a las que podría pasar var, podría hacer esta modificación.

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

Usando esta sintaxis, uno puede aprovechar cosas como cómo se varocupa de los valores perdidos. Todo lo que se pueda pasar varcomo un argumento con nombre se puede utilizar en esta sellamada.

Juan
fuente
4
Curiosamente, su función y la de Ian son casi idénticamente rápidas. Los probé 1000 veces contra 10 ^ 6 millones de extracciones normales (no hay suficiente poder para presionarlos más fuerte que eso). Por el contrario, la función de plotrix siempre fue más lenta que incluso las ejecuciones más lentas de esas dos funciones, pero también tiene muchas más cosas bajo el capó.
Matt Parker
6
Tenga en cuenta que stderres un nombre de función en base.
Tom
3
Ese es un buen punto. Normalmente uso se. He cambiado esta respuesta para reflejar eso.
John
5
Tom, NO stderrNO calcula el error estándar que muestradisplay aspects. of connection
pronosticador
15
@forecaster Tom no dijo que stderrcalcula el error estándar, estaba advirtiendo que este nombre se usa en base, y John originalmente nombró su función stderr(verifique el historial de edición ...).
Molx
60

Una versión de la respuesta de John anterior que elimina los molestos NA:

stderr <- function(x, na.rm=FALSE) {
  if (na.rm) x <- na.omit(x)
  sqrt(var(x)/length(x))
}
nombre elegido al azar
fuente
Tenga en cuenta que existe una función llamada stderren el basepaquete que hace otra cosa, por lo que podría ser mejor elegir otro nombre para este, por ejemplose
gorrión
5

El paquete sciplot tiene la función incorporada se (x)

user2045554
fuente
3

Como vuelvo a esta pregunta de vez en cuando y porque esta pregunta es antigua, estoy publicando un punto de referencia para las respuestas más votadas.

Tenga en cuenta que para las respuestas de @ Ian y @ John creé otra versión. En lugar de usar length(x), usé sum(!is.na(x))(para evitar NA). Usé un vector de 10 ^ 6, con 1,000 repeticiones.

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

Resultados:

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)

ingrese la descripción de la imagen aquí

DJV
fuente
0

de manera más general, para errores estándar en cualquier otro parámetro, puede usar el paquete de arranque para simulaciones de arranque (o escribirlos usted mismo)

Owen
fuente
0

Recordando que la media también se puede obtener usando un modelo lineal, haciendo una regresión de la variable contra una única intersección, ¡también puede usar la lm(x~1)función para esto!

Las ventajas son:

  • Obtienes inmediatamente intervalos de confianza con confint()
  • Puede usar pruebas para varias hipótesis sobre la media, usando por ejemplo car::linear.hypothesis()
  • Puede utilizar estimaciones más sofisticadas de la desviación estándar, en caso de que tenga alguna heterocedasticidad, datos agrupados, datos espaciales, etc., consulte el paquete 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

Creado el 2020-10-06 por el paquete reprex (v0.3.0)

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

sd(y) para desviación estándar var(y) para varianza.

Ambas derivaciones se utilizan n-1en el denominador, por lo que se basan en datos de muestra.

usuario2945838
fuente