En R, comment trouver l'erreur standard de la moyenne?


89

Existe-t-il une commande pour trouver l'erreur standard de la moyenne dans R?

Réponses:



165

L'erreur standard est simplement l'écart type divisé par la racine carrée de la taille de l'échantillon. Ainsi, vous pouvez facilement créer votre propre fonction:

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

92

L'erreur standard (SE) n'est que l'écart type de la distribution d'échantillonnage. La variance de la distribution d'échantillonnage est la variance des données divisée par N et l'ES en est la racine carrée. Partant de cette compréhension, on peut voir qu'il est plus efficace d'utiliser la variance dans le calcul SE. La sdfonction dans R fait déjà une racine carrée (le code pour sdest dans R et révélé en tapant simplement "sd"). Par conséquent, ce qui suit est le plus efficace.

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

afin de rendre la fonction un peu plus complexe et de gérer toutes les options auxquelles vous pourriez passer var, vous pouvez effectuer cette modification.

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

En utilisant cette syntaxe, on peut tirer parti de choses comme la façon dont vartraite les valeurs manquantes. Tout ce qui peut être passé en vartant qu'argument nommé peut être utilisé dans cet seappel.


4
Fait intéressant, votre fonction et celle d'Ian sont presque identiques. Je les ai testés tous les deux 1000 fois contre 10 ^ 6 millions de tirages normaux (pas assez de puissance pour les pousser plus fort que ça). Inversement, la fonction de plotrix a toujours été plus lente que même les exécutions les plus lentes de ces deux fonctions - mais il y a aussi beaucoup plus de choses sous le capot.
Matt Parker

6
Notez qu'il stderrs'agit d'un nom de fonction dans base.
Tom

3
C'est un très bon point. J'utilise généralement se. J'ai changé cette réponse pour refléter cela.
John

5
Tom, NON stderrne calcule PAS l'erreur standard qu'il affichedisplay aspects. of connection
prévisionniste

15
@forecaster Tom n'a pas dit qu'il stderrcalcule l'erreur standard, il avertissait que ce nom est utilisé dans la base, et John a initialement nommé sa fonction stderr(vérifiez l'historique des modifications ...).
Molx

60

Une version de la réponse de John ci-dessus qui supprime les ennuyeux NA:

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

Notez qu'il existe une fonction existante appelée stderrdans le basepackage qui fait autre chose, il serait donc préférable de choisir un autre nom pour celle-ci, par exemplese
sparrow


3

Comme je reviens sur cette question de temps en temps et parce que cette question est ancienne, je poste un repère pour les réponses les plus votées.

Notez que pour les réponses de @ Ian et @ John, j'ai créé une autre version. Au lieu d'utiliser length(x), j'ai utilisé sum(!is.na(x))(pour éviter les NA). J'ai utilisé un vecteur de 10 ^ 6, avec 1000 répétitions.

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

Résultats:

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)

entrez la description de l'image ici


0

plus généralement, pour les erreurs standard sur tout autre paramètre, vous pouvez utiliser le package de démarrage pour les simulations de bootstrap (ou les écrire vous-même)



0

En vous rappelant que la moyenne peut également être obtenue en utilisant un modèle linéaire, en régressant la variable par rapport à une seule intersection, vous pouvez également utiliser la lm(x~1) fonction pour cela!

Les avantages sont:

  • Vous obtenez immédiatement des intervalles de confiance avec confint()
  • Vous pouvez utiliser des tests pour diverses hypothèses sur la moyenne, en utilisant par exemple car::linear.hypothesis()
  • Vous pouvez utiliser des estimations plus sophistiquées de l'écart type, au cas où vous auriez une certaine hétéroscédasticité, des données en cluster, des données spatiales, etc., voir le package 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

Créé le 2020-10-06 par le package reprex (v0.3.0)


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

sd(y)pour l'écart type var(y)de la variance.

Les deux dérivations sont utilisées n-1dans le dénominateur et sont donc basées sur des échantillons de données.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.