在R中,如何找到平均值的标准误?


Answers:



165

标准误差只是标准偏差除以样本大小的平方根。因此,您可以轻松实现自己的功能:

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

92

标准误差(SE)只是采样分布的标准偏差。采样分布的方差是数据的方差除以N,而SE是其平方根。从这种理解中可以看出,在SE计算中使用方差会更有效。sdR中的函数已经做一个平方根(sdR中的代码在R中,只需键入“ sd”即可显示)。因此,以下是最有效的。

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

为了使函数稍微复杂一点并处理您可能传递给的所有选项,var可以进行此修改。

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

使用这种语法,可以利用诸如如何var处理缺失值之类的优势。任何可以传递给的东西var作为命名参数在此se调用中使用。


4
有趣的是,您的功能和Ian的功能几乎一样快。我对它们进行了1000次测试,测试结果为10 ^ 6百万rmrm(没有足够的力量将它们推得更大)。相反,plotrix的功能总是比这两个功能中最慢的运行还要慢-但它在后台运行的功能还很多。
马特·帕克

6
请注意,这stderr是中的函数名称base
汤姆

3
这是非常好的一点。我通常使用se。我已更改此答案以反映这一点。
约翰

5
汤姆(NO)stderr不计算显示的标准误差display aspects. of connection
预测者

15
@forecaster Tom没有说要stderr计算标准错误,他警告说此名称已在base中使用,John最初为他的函数命名stderr(请检查编辑历史记录...)。
Molx

60

上面的约翰回答版本,消除了讨厌的NA:

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

请注意,有一个名为现有功能stderrbase,做点别的包,所以它可能是更好的选择了其它名称为这一个,比如se
麻雀


3

由于我时不时要回到这个问题,并且因为这个问题很旧,所以我发布了一个投票最多的答案的基准。

请注意,对于@Ian和@John的答案,我创建了另一个版本。length(x)我没有使用,而是使用了sum(!is.na(x))(避免使用NA)。我使用10 ^ 6的向量,重复了1000次。

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

结果:

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)

在此处输入图片说明


0

更一般而言,对于其他任何参数的标准错误,您可以使用引导程序包进行引导程序仿真(或自行编写)



0

记住均值也可以通过使用线性模型获得,将变量回归单个截距,您也可以使用该lm(x~1)函数!

优点是:

  • 您将立即获得 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

reprex软件包(v0.3.0)创建于2020-10-06


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

sd(y)var(y)对于方差的标准偏差。

两种推导均使用n-1分母,因此它们均基于样本数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.