Esiste un comando per trovare l'errore standard della media in R?
Risposte:
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
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 sd
funzione 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 var
tratta i valori mancanti. Tutto ciò che può essere passato var
come argomento con nome può essere utilizzato in questa se
chiamata.
stderr
è un nome di funzione in base
.
stderr
NON calcola l'errore standard visualizzatodisplay aspects. of connection
stderr
calcola 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 ...).
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))
}
stderr
nel base
pacchetto che fa qualcos'altro, quindi potrebbe essere meglio scegliere un altro nome per questa, ad esempiose
Il pacchetto sciplot ha la funzione incorporata se (x)
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)
È possibile utilizzare la funzione stat.desc dal pacchetto pastec.
library(pastec)
stat.desc(x, BASIC =TRUE, NORMAL =TRUE)
puoi trovare ulteriori informazioni a riguardo da qui: https://www.rdocumentation.org/packages/pastecs/versions/1.3.21/topics/stat.desc
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:
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
Creato il 06/10/2020 dal pacchetto reprex (v0.3.0)
y <- mean(x, na.rm=TRUE)
sd(y)
per la deviazione standard var(y)
per la varianza.
Entrambe le derivazioni usano n-1
nel denominatore, quindi sono basate su dati campione.