是否有任何命令可以找到 R 中平均值的标准误差?
8 回答
标准误差只是标准偏差除以样本量的平方根。因此,您可以轻松地制作自己的功能:
> std <- function(x) sd(x)/sqrt(length(x))
> std(c(1,2,3,4))
[1] 0.6454972
标准误差 (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
上面约翰回答的一个版本删除了讨厌的 NA:
stderr <- function(x, na.rm=FALSE) {
if (na.rm) x <- na.omit(x)
sqrt(var(x)/length(x))
}
sciplot包具有内置功能se(x)
由于我不时地回到这个问题并且因为这个问题很老,所以我发布了一个投票最多的答案的基准。
请注意,对于@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)
您可以使用 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
请记住,平均值也可以通过使用线性模型获得,将变量与单个截距进行回归,您也可以使用该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 日创建