二項検定との比較
二項検定は、1群で二値の質的データの頻度を検定する検定法でした。
復習も兼ねて、コインを8回投げて表が1回というデータを二項検定します。
binom.test(1, 8, p=0.5, alternative = "two.sided")
では、これと同じことをGLMでやってみましょう。
y <- c(0,1,1,1,1,1,1,1)
summary(glm(y~1, family=binomial))
二項検定は二項分布から確率を単純に計算していますが、GLMは (glmという呪文に備わった独自の推定手順で) 二項分布を推定しています。そして、母比率0.5となる帰無仮説の母集団 (正規分布に近似された二項分布) からこのデータが得られる確率を求めて (P値を求めて)、検定をおこなっています。
 このことはP値の横にZ値が記されていることから分かります。Z値とは標準正規分布のX軸の値だからです。でも、このデータは本当は正規分布ではなく二項分布であり、あくまでも近似値を求めただけなので、データ数が少ないときは不正確になります。
 ここで推定されている母比率が以下です。
1/(1+exp(-1.946))
一方、単純にデータから最尤推定される母比率は以下です。「ちょっとした違い」ではありますが、違いますね。
7/8
なお、母比率0.5となるときとは、glmの出力結果で切片 (intercept) の推定値が0になるときです。
1/(1+exp(0))
このことから、glmは「interceptの推定値が0になる」という帰無仮説を棄却しようとしていると言い換えることもできます。

t 検定、分散分析、多重比較との比較
例として、irisを使うことにします。
data(iris)
attach(iris)
summary(iris)
全部で150個のデータがあるので、t 検定の例題用に2群の変数をつくります。
hensu <- c(rep(0, 75), rep(1, 75))

t検定の例題にSepal.Widthとhensuを使いましょう。
この2群データがどのようになるのかを、あらかじめ見ておきます。
par(mfrow=c(2,1))
hist(Sepal.Width[hensu==0], breaks=seq(2, 5, 0.5))
hist(Sepal.Width[hensu==1], breaks=seq(2, 5, 0.5))
par(mfrow=c(1,1))
 t 検定してみます。
t.test(Sepal.Width~hensu)
今度は、GLMをしてみましょう。
summary(glm(Sepal.Width~hensu))
 t 値の絶対値はどちらも同じであること、そして自由度dfが違うことに注目してください。P 値の違いは自由度の違いでうまれています。
等分散を前提とした t 検定(Student's t-test)をやってみると
t.test(Sepal.Width~hensu, var.equal=T)
GLMと同じt値とP値を返しましたね。つまり、今回のGLMはStudent's t-testと同じなのです。

今度は、Sepal.WidthとSpeciesを使って分散分析の例題とします。
summary(aov(Sepal.Width ~ Species))
分散分析の結果、有意差が認められたので、多重比較を行います。
TukeyHSD(aov(Sepal.Width ~ Species))
では、これをGLMで実行してみましょう。
summary(glm(Sepal.Width ~ Species))
GLMでは最初からsetosaと2種の比較をおこなっています。
また、ここではアルファベット順で一番先のsetosaを基準にして、残る2種(の母集団の平均値)が有意に違うかを検定しています。
そのため、切片はsetosaの平均値の推定値であり、残る2種の平均がsetosaの平均とどれくらい違うかを検定しています。
mean(Sepal.Width[Species=="setosa"])
mean(Sepal.Width[Species=="versicolor"])
mean(Sepal.Width[Species=="versicolor"]) - mean(Sepal.Width[Species=="setosa"])
mean(Sepal.Width[Species=="virginica"]) - mean(Sepal.Width[Species=="setosa"])

ロジスティック回帰分析
先ほどのhensuを使ってロジスティック回帰分析と同じGLMをおこないましょう。その前に、解析するのはどんなデータなのかを、あらかじめ見ておきます。
plot(hensu~Sepal.Width)
このままだと、データが重なっていて分かりにくいので、Y軸方向に少しばらけさせてみましょう。
plot(jitter(hensu)~Sepal.Width)
ばらけすぎたので、もう少し小さくばらけさせることにします。
plot(jitter(hensu, factor=0.2)~Sepal.Width)
それでは、解析してみましょう。
summary(glm(hensu~Sepal.Width, family=binomial))
なお、これは「上記数式の切片と傾きがそれぞれ0である」という帰無仮説を検定しています。ほとんどの場合、切片は意味がないので、傾きのP値だけに注目します。この曲線を先ほどのグラフに描いておきましょう。
x <- seq(2, 5, 0.01)
lines(x, 1/(1+exp(-5.7356+1.8794*x)))

多変量解析、交互作用
応答変数 ~ 説明変数というモデル式で、説明変数を複数にすると多変量解析になります。
summary(lm(Sepal.Width ~ Sepal.Length + Petal.Width + Sepal.Length : Petal.Width))
ここで、コロン( : )で結ばれている2変数は、2変数の「交互作用」と呼ばれるものです。この交互作用は、要するに2変数の積(掛け算)を意味しています。
実際に、2変数の掛け算をして、それをSePeと名付けて
Sepal.Length * Petal.Width -> SePe
そのSePeを入れて解析すると、交互作用と同じestimateが得られます
summary(lm(Sepal.Width ~ Sepal.Length + Petal.Width + SePe))
このように、Rでは、モデルを複雑にするのは簡単です。
summary(lm(Sepal.Width ~ Sepal.Length * Petal.Width * Species))
けれども、複雑なモデルほど解釈が難しくなります。解析結果からどのようなことが主張できるのか、そもそも、自分のデータでそのような主張ができるのか。統計解析には、十分な勉強と適切な利用が必要ですね。

結論:GLMだけでいろいろなデータに柔軟に対応できます。
とくに、GLMは多変量解析できる点が魅力です。
ただし、GLMが万能というわけではなく、古典的統計のほうが優れていることもあります。


最終更新日時: 2021年 02月 17日(水曜日) 11:05