In R, come trovare l'errore standard della media?


89

Esiste un comando per trovare l'errore standard della media in R?

Risposte:



165

L'errore standard è solo la deviazione standard divisa per la radice quadrata della dimensione del campione. Quindi puoi facilmente creare la tua funzione:

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

92

L'errore standard (SE) è solo la deviazione standard della distribuzione campionaria. La varianza della distribuzione campionaria è la varianza dei dati divisa per N e SE è la radice quadrata di quella. Partendo da questa comprensione si può vedere che è più efficiente utilizzare la varianza nel calcolo SE. La sdfunzione in R fa già una radice quadrata (il codice per sdè in R e viene rivelato semplicemente digitando "sd"). Pertanto, quanto segue è più efficiente.

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

per rendere la funzione solo un po 'più complessa e gestire tutte le opzioni a cui potresti passare var, potresti fare questa modifica.

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

Usando questa sintassi si può trarre vantaggio da cose come il modo in cui vartratta i valori mancanti. Tutto ciò che può essere passato varcome argomento con nome può essere utilizzato in questa sechiamata.


4
È interessante notare che la tua funzione e quella di Ian sono quasi identicamente veloci. Li ho testati entrambi 1000 volte contro 10 ^ 6 milioni di tiri rnorm (non abbastanza potenza per spingerli più forte di così). Al contrario, la funzione di plotrix è sempre stata più lenta anche delle esecuzioni più lente di queste due funzioni, ma ha anche molto di più da fare sotto il cofano.
Matt Parker

6
Nota che stderrè un nome di funzione in base.
Tom

3
Questo è un ottimo punto. Di solito uso se. Ho cambiato questa risposta per riflettere questo.
John

5
Tom, NO stderrNON calcola l'errore standard visualizzatodisplay aspects. of connection
meteorologo

15
@forecaster Tom non ha detto stderrcalcola l'errore standard, stava avvertendo che questo nome è usato in base e John originariamente ha chiamato la sua funzione stderr(controlla la cronologia delle modifiche ...).
Molx

60

Una versione della risposta di John sopra che rimuove le fastidiose NA:

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

Nota che esiste una funzione esistente chiamata stderrnel basepacchetto che fa qualcos'altro, quindi potrebbe essere meglio scegliere un altro nome per questa, ad esempiose
sparrow


3

Mentre torno su questa domanda ogni tanto e poiché questa domanda è vecchia, pubblico un punto di riferimento per le risposte più votate.

Nota che per le risposte di @ Ian e @ John ho creato un'altra versione. Invece di usare length(x), ho usato sum(!is.na(x))(per evitare NA). Ho usato un vettore di 10 ^ 6, con 1.000 ripetizioni.

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

Risultati:

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)

inserisci qui la descrizione dell'immagine


0

più in generale, per errori standard su qualsiasi altro parametro, è possibile utilizzare il pacchetto di avvio per simulazioni bootstrap (o scriverle da soli)



0

Ricordando che la media può essere ottenuta anche utilizzando un modello lineare, facendo regredire la variabile contro una singola intercetta, puoi utilizzare la lm(x~1)funzione anche per questo!

I vantaggi sono:

  • Ottieni immediatamente intervalli di confidenza con confint()
  • Puoi usare test per varie ipotesi sulla media, usando ad esempio car::linear.hypothesis()
  • È possibile utilizzare stime più sofisticate della deviazione standard, nel caso in cui si disponga di eteroschedasticità, dati raggruppati, dati spaziali ecc., Vedere il pacchetto 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

Creato il 06/10/2020 dal pacchetto reprex (v0.3.0)


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

sd(y)per la deviazione standard var(y)per la varianza.

Entrambe le derivazioni usano n-1nel denominatore, quindi sono basate su dati campione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.