102

是否有任何命令可以找到 R 中平均值的标准误差?

4

8 回答 8

185

标准误差只是标准偏差除以样本量的平方根。因此,您可以轻松地制作自己的功能:

> std <- function(x) sd(x)/sqrt(length(x))
> std(c(1,2,3,4))
[1] 0.6454972
于 2010-04-20T16:18:41.073 回答
103

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

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

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

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

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

于 2010-04-20T19:03:07.560 回答
67

上面约翰回答的一个版本删除了讨厌的 NA:

stderr <- function(x, na.rm=FALSE) {
  if (na.rm) x <- na.omit(x)
  sqrt(var(x)/length(x))
}
于 2011-08-28T09:27:19.260 回答
41

有一个带有内置功能的plotrix包: std.error

于 2010-04-20T15:56:22.890 回答
7

sciplot包具有内置功能se(x)

于 2013-02-06T05:07:33.603 回答
3

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

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

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)

在此处输入图像描述

于 2020-02-24T08:42:13.807 回答
0

您可以使用 pastec 包中的函数 stat.desc。

library(pastec)
stat.desc(x, BASIC =TRUE, NORMAL =TRUE)

你可以从这里找到更多关于它的信息: https ://www.rdocumentation.org/packages/pastecs/versions/1.3.21/topics/stat.desc

于 2020-02-12T13:40:20.083 回答
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 月 6 日创建

于 2020-10-06T17:32:32.487 回答