Em R, como encontrar o erro padrão da média?


90

Existe algum comando para encontrar o erro padrão da média em R?

Respostas:



168

O erro padrão é apenas o desvio padrão dividido pela raiz quadrada do tamanho da amostra. Assim, você pode facilmente fazer sua própria função:

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

93

O erro padrão (SE) é apenas o desvio padrão da distribuição de amostragem. A variância da distribuição amostral é a variância dos dados dividida por N e SE é a raiz quadrada disso. Partindo desse entendimento, percebe-se que é mais eficiente usar a variância no cálculo da SE. A sdfunção em R já faz uma raiz quadrada (o código para sdestá em R e é revelado digitando apenas "sd"). Portanto, o seguinte é mais eficiente.

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

para tornar a função um pouco mais complexa e lidar com todas as opções que você poderia passar var, você poderia fazer esta modificação.

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

Usando essa sintaxe, pode-se tirar vantagem de coisas como a forma como varlida com valores ausentes. Qualquer coisa que possa ser passada varcomo um argumento nomeado pode ser usada nesta sechamada.


4
Curiosamente, sua função e a de Ian são quase identicamente rápidas. Eu testei os dois 1000 vezes contra 10 ^ 6 milhões de consumos de rnorm (potência insuficiente para pressioná-los com mais força do que isso). Por outro lado, a função do plotrix sempre foi mais lenta do que até mesmo as execuções mais lentas dessas duas funções - mas também tem muito mais acontecendo sob o capô.
Matt Parker de

6
Observe que stderré um nome de função em base.
Tom

3
Esse é um ponto muito bom. Eu normalmente uso se. Eu mudei esta resposta para refletir isso.
John

5
Tom, NÃO stderrNÃO calcula o erro padrão que exibedisplay aspects. of connection
previsor de

15
@forecaster Tom não disse stderrcalcula o erro padrão, ele estava avisando que este nome é usado no base, e John originalmente nomeou sua função stderr(verifique o histórico de edição ...).
Molx 01 de

60

Uma versão da resposta de John acima que remove os incômodos NAs:

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

Observe que há uma função existente chamada stderrno basepacote que faz outra coisa, então pode ser melhor escolher outro nome para esta, por exemplose
pardal


3

Como estou voltando a esta pergunta de vez em quando e porque ela é antiga, estou postando um benchmark para as respostas mais votadas.

Observe que para as respostas de @Ian e @John, criei outra versão. Em vez de usar length(x), usei sum(!is.na(x))(para evitar NAs). Usei um vetor de 10 ^ 6, com 1.000 repetições.

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)

insira a descrição da imagem aqui


0

mais geralmente, para erros padrão em qualquer outro parâmetro, você pode usar o pacote de inicialização para simulações de bootstrap (ou gravá-los por conta própria)



0

Lembrando que a média também pode ser obtida por meio de um modelo linear, regredindo a variável contra uma única interceptação, você também pode usar a lm(x~1)função para isso!

As vantagens são:

  • Você obtém intervalos de confiança imediatamente com confint()
  • Você pode usar testes para várias hipóteses sobre a média, usando, por exemplo, car::linear.hypothesis()
  • Você pode usar estimativas mais sofisticadas do desvio padrão, no caso de você ter alguma heteroscedasticidade, dados agrupados, dados espaciais, etc., consulte o pacote 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

Criado em 2020-10-06 pelo pacote reprex (v0.3.0)


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

sd(y) para desvio padrão var(y) para variância.

Ambas as derivações usam n-1o denominador, portanto, são baseadas em dados de amostra.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.