理学療法士がまとめたノート

統計学備忘録(R言語のメモ)

since2016 ときどきTEXのメモ

リスク比の信頼区間

ポイント:比の対数をとり、正規近似する

リスク比は疫学における指標の1つです.一般的には相対危険度(相対リスク,relative risk,RR)として利用されています.

xm <- matrix(c("a","b","c","d"), nrow=2, byrow=T)
name <- list("暴露"=c("あり(A群)","なし(B群)"),"疾病"=c("あり","なし"))
dimnames(xm)<-name
xm

            疾病
暴露         あり なし
  あり(A群)  "a"  "b" 
  なし(B群)  "c"  "d" 

前提
比は分母が小さくなると、数値が大きくなりすぎて正規近似の精度が悪くなります.比の対数であれば高い精度で正規近似することが可能になります. したがって、比の対数を考えていくことになります.

定義と言葉の整理

標本比率 \frac{a}{a+b}=p'A の母比率をPA

標本比率 \frac{c}{c+d}=p'B の母比率をPB

log\frac{a}{a+b}=log(p'A), log\frac{c}{c+d}=log(p'B)


リスク差(過剰絶対リスク) = p'A-p'B

リスク比 RR = \frac{p'A}{p'B} A群のB群における疾病の頻度の比

過剰リスク(過剰相対リスク) = \frac{p'A-p'B}{p'B} 

オッズ比=\frac{\frac{a}{b}}{\frac{c}{d}}


リスク比の信頼区間

比の対数を考えていきます.
標本のリスク比=標本リスク比( \frac{p'A}{p'B} =rr)、母集団のリスク比を母リスク比(\frac{PA}{PB} =RR)とします.

標本リスク比rrの対数 log\ rr、 母リスク比RRの対数 log RR

正規近似で信頼区間を求めていくためには、以下の式が必要になります.

Z = \frac{ log\ rr - logRR}{ log\ rr の標準誤差}

したがって、以下の式が95%信頼区間を求める式になります

log\ rr - 1.96(log\ rrの標準誤差) \leqq logRR \leqq  log\ rr + 1.96(log\ rrの標準誤差)

以下、log\ rrの標準誤差 = SE とします

log\ rr - 1.96SE \leqq logRR \leqq  log\ rr + 1.96SE

rr\times exp(-1.96\times SE) \leqq RR \leqq  rr\times exp(1.96\times SE)


log\ rrの分散

log\ rr=log\ a - log(a+b) - log\ c + log(c+d) より

V(log\ rr)=\frac{1}{a} - \frac{1}{a+b} + \frac{1}{c} - \frac{1}{c+d}  デルタ法(delta method)によって近似的に求めたもの

「矢野様より指摘いただき、修正しております」

#Rで95%信頼区間を求めてみます
rr <- a*(c+d)/(a+b)/c      #  = (a/(a+b))/(c/(c+d)) 
exp(log(rr)+qnorm ( c(0.025,0.975) )*sqrt(b/a/(a+b)+d/c/(c+d)))

または
exp(log(rr)+c(-1,1)*qnorm (0.975)*sqrt(b/a/(a+b)+d/c/(c+d)))

例)
クロス表イメージ
matrix(c(76, 399, 129, 332),2,byrow=T)
     [,1] [,2]
[1,]   76  399
[2,]  129  332

a<-76; b<-399; c<-129; d<-332 #参考web2より
( rr <-  a*(c+d)/(a+b)/c )    #リスク比
[1] 0.5717829
rr*exp(qnorm ( c(0.025,0.975) )*sqrt(b/a/(a+b)+d/c/(c+d)))
[1] 0.4440632 0.7362370

または
rr*exp(c(-1,1)*qnorm (0.975)*sqrt(b/a/(a+b)+d/c/(c+d)))
[1] 0.4440632 0.7362370


参考web1 R -- 相対危険度(対応のない場合)
参考web2 R による統計処理
参考文献)柳川 堯 ; 観察データの多変量解析―疫学データの因果分析,近代科学社 ,2016

有意差とは・・・?

乱数を発生させて、set.seed( )で記憶させてシミュレーションしてみます
乱数なので再現できませんが、set.seed( )を使用することで再確認できます

set.seed(1)     #もう一度確かめたいときはset.seed( )で乱数を記憶させておきます.( )の中は何でもOK.
x20 <- rnorm(20,3.25,2.25)  #平均3.25,標準偏差2.25のデータ(乱数)20個
set.seed(2)
y20 <- rnorm(20,2.12,1.95)  #平均2.12,標準偏差1.95のデータ(乱数)20個
t.test(x20,y20)  #独立した2群の差の検定を実施してみます

        Welch Two Sample t-test

data:  x20 and y20
t = 1.808, df = 37.999, p-value = 0.07852
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.1409049  2.4959643
sample estimates:
mean of x mean of y 
 3.678679  2.501149 

♯ p-value =  0.07852 危険率0.05でも有意差は認められませんでした・・・

次に同じ平均値、同じ標準偏差で100個ずつ用意して、検定してみます

set.seed(3)
x100 <- rnorm(100,3.25,2.25)
set.seed(4)
y100 <- rnorm(100,2.12,1.95)
t.test(x100,y100)

        Welch Two Sample t-test

data:  x100 and y100
t = 3.6836, df = 196.81, p-value = 0.0002971
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4491119 1.4841008
sample estimates:
mean of x mean of y 
 3.274830  2.308224 

P = 0.0002971  危険率0.01でも有意差あり!

統計量(この場合はt値)を考えれば当然の結果なのですが、
まだこのことに気づかずに有意差のみで議論している理学療法士も多いようです.
独立した2群であれば、それぞれのサンプルを増やすことで有意差を出すことが可能になります!

では、箱ひげ図で確認してみます

boxplot(x20,y20,x100,y100,xaxt="n")   
name<-c("x20","y20","x100","y100")
axis(side=1,at=c(1,2,3,4),labels=name) 

f:id:yoshida931:20181217225224p:plain

x20とy20に有意差がなくて、x100とy100に有意差がある・・・ようには見えませんね!
平均値と標準偏差が等しい正規分布からの乱数ですので、同じような箱ひげ図になるのは当然です.
x20とy20に有意差がなくて、x100とy100に有意差があるという結果の理解に苦しみます.
ここに数字のマジックが隠れています.

どのように有意差検定を実施しているのか、理解することが必要になります.
以下のページで、n増加→統計量大→p値小の構図が理解できると思います.

yoshida931.hatenablog.com

さて次はどうでしょうか?

# x20,y20の平均値は同じで、標準偏差を1/10にしてみましょう
set.seed(5)     
x202 <- rnorm(20,3.25,0.225)  
set.seed(6)
y202 <- rnorm(20,2.12,0.195) 
t.test(x202,y202)

    Welch Two Sample t-test
data:  x202 and y202
t = 15.657, df = 37.994, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.8960426 1.1621642
sample estimates:
mean of x mean of y 
 3.186874  2.157771 

# p-value = 2.2e-16  危険率0.01でも有意差あり!

箱ひげ図で確認してみましょう.
f:id:yoshida931:20180124195732p:plain:w400

平均値が同じでも、ばらつき(分散、標準偏差)に違いがあれば統計結果は異なります.

有意差に一喜一憂するのではなく、サンプル数や分散、またそのデータがもつ性質をよく考えて、差を考察するべきです.P値よりも信頼区間や効果量などが比較の参考になるでしょう.
yoshida931.hatenablog.com

平均

算術平均 arithmetin mean (=相加平均)

1回 102回 153回 8人
平均回数は
(10*1+15*2+3*8)/(10+15+8)

度数分布からの平均
真の平均の近似値なので多少のズレが生じます
最初と最後の階級が少ない場合には無視して求めます(年収平均など)
無視できない数であれば、最初の下限は0にして、最後の上限は直線の範囲と同じ範囲にします


幾何平均 geometoric mean (=相乗平均)

そもそも「幾何」とは、「いくばく」と読むので、わずか・すこしという意味があります 例1)利回りの例で考えてみます

10%, 15%, -5%, 13% と年々変化する利回り
平均は
 ( 1.1 + 1.15 + 0.95 + 1.13 ) / 4 
=1.0825 ではありません!
正解は・・・
( 1.1 * 1.15 * 0.95 * 1.13 )^(1/4)
= sqrt( sqrt( 1.1 * 1.15 * 0.95 * 1.13 ) )
=1.079501 
年平均利率は7.95%が正解です

奇数の場合は対数で計算します

例2)極端な例ですが、消費税で考えます

100円の品物の買う場合に
昨年5%になり、翌年15%に引きあがりました
この2年間の平均上昇率は何%でしょうか?
( 5 + 15 ) / 2 = 10% ではありません
(1.05 * 1.15 ) ^ (1/2) =1.098863
平均9.88%が正解です


調和平均 harmonic mean

距離÷時間=速度を例にとって考えてみます

片道100kmを往復します
往路は10km/h, 復路は15km/hかかりました
平均速度は(10+15)/2=12.5km/hではありません
往路の時間は100/10時間、復路の時間は100/15時間で合計50/3時間になります
したがって平均時速は
(100*2)/( (100/10)+(100/15) ) = 12 km/h

移動平均

x <- runif(500,-1,1)    #一様分布の乱数500個
plot(y2,type = "l")

f:id:yoshida931:20180122151901p:plain:w600

二乗平均平方根RMS

xr <-sqrt( x^2)

f:id:yoshida931:20180122152328p:plain:w600

移動平均

install.packages("TTR")
library(TTR)
x5 <- SMA(xr, 5) # 移動平均間隔5
plot(x5,type = "l")
x10 <- SMA(xr, 10) # 移動平均間隔10
plot(x10,type = "l")   

f:id:yoshida931:20180122152720p:plain:w600

f:id:yoshida931:20180122152747p:plain:w600

データフレームからの抽出

例)ChickWeightからDietの1と3だけ抜き出す

subset(ChickWeight,subset = Diet==c(1,3))

例)iris アヤメ

head(iris,5)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa

Sepal.Length(へたの長さ)とSpecies(種)
2列のみを抽出したフレームにします

irisSL <- subset(iris,select = c(Sepal.Length, Species))
head(irisPW,5)

  Sepal.Length Species
1          5.1  setosa
2          4.9  setosa
3          4.7  setosa
4          4.6  setosa
5          5.0  setosa

つぎに列を種(3種類)にしてへたの長さを提示します

iun2 <- unstack(irisSL,formula = Petal.Width ~ Species)
head(iun2,10)

  setosa versicolor virginica
1    5.1        7.0       6.3
2    4.9        6.4       5.8
3    4.7        6.9       7.1
4    4.6        5.5       6.3
5    5.0        6.5       6.5

Sepal.Length(へたの長さ)とSpecies(種)の2列に戻します

x<-c(iun2$setosa,iun2$versicolor,iun2$virginica)
Species <- c(rep("setosa",50),rep("versicolor",50),rep("virginica",50))
xy <- data.frame(Sepal.Length=x, Species)

  Sepal.Length Species
1          5.1  setosa
2          4.9  setosa
3          4.7  setosa
4          4.6  setosa
5          5.0  setosa
6          5.4  setosa


irisのvirginicaだけを抜き出す方法

ise <- split(iris,iris[5])     #irisの5列目の項目で分割
head(ise$virginica)

    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
101          6.3         3.3          6.0         2.5 virginica
102          5.8         2.7          5.1         1.9 virginica
103          7.1         3.0          5.9         2.1 virginica
104          6.3         2.9          5.6         1.8 virginica
105          6.5         3.0          5.8         2.2 virginica
106          7.6         3.0          6.6         2.1 virginica



Sepal.Lengthの順に並べ換えます

Sepal.Lengthの昇順に並び替え
ise <- split(iris,iris[5])     #irisの5列目の項目で分割
isev <- ise$virginica
isevo <- isev[order(isev$Sepal.Length),]
head(isevo)

    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
107          4.9         2.5          4.5         1.7 virginica
122          5.6         2.8          4.9         2.0 virginica
114          5.7         2.5          5.0         2.0 virginica
102          5.8         2.7          5.1         1.9 virginica
115          5.8         2.8          5.1         2.4 virginica
143          5.8         2.7          5.1         1.9 virginica
````

ベイズの定理

ベイズの定理とは「観測値(データ)で条件付けられた、母数の分布を与える定理 」です

#Rのサンプル women$height を使用します
x <- women$height
#標本平均
me <- mean(women$height)
=65
#標本標準偏差
sd <- sqrt(sum((x - mean(x))^2) / length(x))
=4.32

  女性の伸長(インチ)の平均65、標準偏差4.32を正規分布の母数と見立ててしまえば、95%予測区間を導き出すことは簡単です.
  しかし、x~N(65,4.3)の分布が真の分布とは言えません.x~N(64,4.5)やx~N(66,4.6)などの母分散も考えられます.つまり、母数(平均や標準偏差)も分布することが考えられます.

確率密度関数 f(母数|観測値) の分布

例として母数を平均値, 標準偏差とします

f (θ|x) = f ( 平均値, 標準偏差 | x )

平均値, 標準偏差 とデータxは独立していないので条件付き分布となります

条件付き分布

f (x,θ) ≠ f(x)*f(θ)
# x が与えられた場合
  f (x,θ) = f(x)*f (θ|x)
# θ が与えられた場合
  f (x,θ) = f (x|θ)*f(θ)   


分布に関するベイズの定理

観測値(データ)で条件付けられた、母数の分布を与える定理

f (x,θ) = f(x)*f (θ|x)より
f (θ|x) = f (x,θ) ÷ f(x)
        = f (x|θ)*f(θ) ÷ f(x)

上記式より

f (θ|x) =事後分布,\ \ f(x|θ)=尤度,\ \ f(θ) =事前分布,\ \ f(x) =正規化定数

f (θ|x) = \frac{f (x|θ)*f(θ)}{ f(x)}



確率に関するベイズの定理

Aを得られた結果とします.Bをその原因とします.
例)5つの袋に赤白の玉が入り混ざっています.どれかの袋から玉が取られたとします.

取り出した玉=結果A
どの袋から取り出したか=原因B

 結果Aが得られた原因Bを推定します.袋が5つなのでB1, B2, B3, B4, B5 が原因となります. ベイズの定理では、結果Aであったときに原因が、B1またはB2またはB3またはB4またはB5 である確率を算出することになります.

ベイズの定理
P( Bi | A ) = \frac{P(Bi)P(A|Bi)}{P(A)} = \frac{P(Bi)P(A|Bi)}{ΣP(Bi)P(A|Bi)}

証明

A = A∩Ω =A∩(B1∪B2∪…∪Bi)
=(A∩B1)∪(A∩B2)∪...∪(A∩B1)
 P(A) = ΣP(Bi)P(A|Bi)

例)ベイズの逆確率
袋B1または袋B2から一つの球を取り出します.
B1には白玉3個、赤玉2個
B2には白玉1個、赤玉3個
取り出した球が赤だった場合(事象A)、袋がB1である確率、B2である確率を求めよ.

f:id:yoshida931:20180117184454p:plain:w300

正規化

f:id:yoshida931:20180316120813p:plain:w300


P(赤)= ΣP(Bi)P(赤|Bi)=P(B1)P(赤|B1)+P(B2)P(赤|B2)=\frac{1}{2}*\frac{2}{5}+ \frac{1}{2}*\frac{3}{4}

# 赤玉を引いた袋がB1である確率(ベイズの逆確率)   
  P(B1|A)= (1/2)*(2/5) / ((1/2)*(2/5) + (1/2)*(3/4)) = 0.3478261
# 赤玉を引いた袋がB2である確率(ベイズの逆確率)   
  P(B2|A)= (1/2)*(3/4) / ((1/2)*(2/5) + (1/2)*(3/4)) = 0.6521739
#正規化しているので
  P(B1|A) + P(B2|A) = 1

参考文献
豊田秀樹; はじめての統計データ分析 ベイズ的<ポストp値時代>の統計学, 朝倉書店, 2016