読者です 読者をやめる 読者になる 読者になる

みかんのたね

薬学や研究の話、くだらない話、愚痴などを書きます。

標準偏差と標準誤差

実験データを平均値や中央値といった指標を用いて要約することは、よくあるし、便利だ。平均値が実際の分布をよく表す指標として適切かどうかは、分布の形によって判断しなければならない。このことは所得の分布などでよく議論されている。

 

そのほかに、データのばらつきを表す場合などに用いる標準偏差(Standard deviation, SDや、推定値の精度を知りたい場合などに用いる標準誤差(Standard error, SE)といった統計量がよく用いられる。だが、しばしば「標準偏差(SD)と標準誤差(SE)の違いがわかりません」と訊かれることがある。教科書を読んで下さい、というのが本音だけども、最近はそれも面倒(そういう人は、教科書を読んでもわからない場合がほとんど)になってきた。

(※2016.07.03追記:この記事結構読まれてるみたいだし、直接知ってる人からは質問に来られたりもするので、折角だしもうちょっとレポートや研究に使えるレベルの記事を書きましょうかね。思いつきですが。応援の声があれば、書きます。)

 

多分、具体例を出した方が解ってもらえるのだろうなあ。ということで、

例えば、下の様に平均10, 標準偏差1で分布するデータがあるとする。

f:id:fineatoms:20150612132510j:plain

これを母集団として、この中から標本抽出(サンプリング)した時に、標本サイズと、標本から求めたSD, SEの関係は下の様になる(左がSD, 右がSE。赤線は95%信頼区間)。

 

f:id:fineatoms:20150612132512j:plainf:id:fineatoms:20150612132513j:plain

サンプル数を増やした時に、標本から計算されるSDはサンプルサイズを増やすにつれて母集団のSD(=1)に近づいていく。一方で標本から計算されるSEはサンプルサイズを増やすにつれてどんどん減少していく。(まあ、定義から明らかですけれど。)

たまに、サンプル数を増やせばSDも小さくなるんだと言うひとが居るけれども、そういうものではない。サンプルサイズを増やすと、真の(母集団の)SDに近づく、というのが適切であろう。

 

標本から算出したSDを、母集団のSDをいかほどの精度で反映しているかは、サンプルサイズによって変わりる(左のグラフでは、サンプルサイズを増やすと標本から求めたSDの値は真の(母集団の)値に近づき、その95%信頼区間も狭くなっていく)

↑多分こういうことを言うから解らなくなる…

 

結局、SDとSEは何が違うの、という問にはやはり「教科書を読んで下さい」というしかないのだが…まあ性質としては上のような違いがある。

何かの理解の一助になればと思い、記載しておく。

 

一応、Rのコードものせておく。

 

#sample size, SD, SE
x<-rnorm(n=10000, mean=10, sd=1)
hist(x,col="#00000050", main="histgram")
#
SDmat<-c()
for(j in 1:50){
x<-rnorm(n=1000, mean=10, sd=1)
SDs<-c()
for(i in 2:500){
sd<-sd(x[1:i])
SDs<-c(SDs, sd)
}
SDmat<-cbind(SDmat, SDs)
}
SDmean<-apply(SDmat,1, "mean")
SDsd<-apply(SDmat,1, "sd")
SDse<-SDsd/(sqrt(ncol(SDmat)))
U<-SDmean + 1.96*SDse
L<-SDmean - 1.96*SDse
plot(0,0, type="n",xlab="Sample size", ylab="SD",xlim=c(0, 100), ylim=c(0.5, 1.5), bty="l", main="sample SD and sample size")
lines(U, col="#ff0000", bty="l")
lines(L, col="#ff0000",bty="l")
lines(SDmean, col="#111111",bty="l")

#SE
SEmat<-c()
for(j in 1:50){
x<-rnorm(n=1000, mean=10, sd=1)
SEs<-c()
for(i in 2:500){
se<-sd(x[1:i])/sqrt(i)
SEs<-c(SEs, se)
}
SEmat<-cbind(SEmat, SEs)
}
SEmean<-apply(SEmat,1, "mean")
SEsd<-apply(SEmat,1, "sd")
SEse<-SEsd/(sqrt(ncol(SEmat)))
U<-SEmean + 1.96*SEse
L<-SEmean - 1.96*SEse
plot(0,0, type="n",xlab="Sample size", ylab="SEM",xlim=c(0, 100),
ylim=c(0, 1.0), bty="l", main="sample SEM and sample size")
lines(U, col="#ff0000", bty="l")
lines(L, col="#ff0000",bty="l")
lines(SEmean, col="#111111",bty="l")