Rで、平均の標準誤差を見つける方法は?


回答:



165

標準誤差は、標準偏差をサンプルサイズの平方根で割ったものです。したがって、独自の関数を簡単に作成できます。

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

92

標準誤差(SE)は、サンプリング分布の標準偏差にすぎません。サンプリング分布の分散は、データの分散をNで割ったものであり、SEはその平方根です。その理解から、SE計算で分散を使用する方が効率的であることがわかります。sdRの関数は、すでに1つの平方根を実行しています(のコードsdは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万回のrnormドローに対して1000回テストしました(それよりも強く押すのに十分なパワーではありません)。逆に、plotrixの関数は、これら2つの関数の最も遅い実行よりも常に低速でしたが、内部ではさらに多くのことが行われています。
マットパーカー

6
はのstderr関数名であることに注意してくださいbase
トム

3
それはとても良い点です。私は通常seを使用します。私はそれを反映するためにこの答えを変更しました。
ジョン

5
トム、NOstderrは表示される標準誤差を計算しませんdisplay aspects. of connection
予測者

15
@forecasterトムはstderr標準誤差を計算するとは言いませんでした、彼はこの名前がベースで使用されていることを警告していました、そしてジョンはもともと彼の関数に名前を付けましたstderr(編集履歴をチェックしてください...)。
モレックス2015

60

厄介なNAを削除する上記のジョンの答えのバージョン:

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

既存の機能があることを注意stderrしてbase、この1つに別の名前を選んだ方が良いかもしれませんので、他の何かをしたパッケージは、例えばse
スズメ


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)

ここに画像の説明を入力してください


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分母で使用されるため、サンプルデータに基づいています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.