ロジスティック回帰の基準(reference) 変更
ロジスティック回帰を行うときには、オッズとオッズ比の基準 (reference) が非常に重要になります。特に日本語記述の場合には、解析を行う前に基準を設定することをお勧めします。
dat <- read.csv("cross-1.csv", header=T, fileEncoding = "Shift-JIS")
tab <- xtabs(~ 効果 + 筋トレ, data = dat)
print(tab)
基準を確認します.オブジェクトの内容を情報付きで簡潔に表示 str( )
str(dat)
何も設定しない場合には、「前」に書かれている方が基準として決定されます
効果の基準は「無効」、筋トレの基準は「あり」
効果を目的変数、筋トレを説明変数としたロジスティック回帰を実行してみましょう
dat$効果b <- as.factor(ifelse(dat$効果=="有効", 1 , 0))
glm(formula = 効果b ~ 筋トレ, family=binomial, data=dat)
exp(-1.792)
オッズ比=0.1666266
オッズは効果が「無効」に対する「有効」の比率、オッズ比は 筋トレ「あり」のオッズに対する筋トレ「なし」のオッズの比率。筋トレしなかったら筋トレした場合と比べてオッズは0.167倍に下がることが推定できます。変数を変換したり、層別を行ったりする過程で、何を基準にしているのか分からなくなる場合もあります。以下のように事前に基準を設定しておくことでエラーを防ぐことができます。
「筋トレなし」と「効果なし」を基準にする場合には以下のように設定します。
#データフレームから直接「効果なし」を基準に設定
dat$効果b <- relevel(dat$効果b, ref="0")
#factor変数にすることでlevelが付与されます(重要)
dat$筋トレ <- as.factor(dat$筋トレ)
#relevel関数で基準となるカテゴリーを設定します
dat$筋トレ <- relevel(dat$筋トレ, ref="なし")
#これで解釈を間違うことはありません、後の記述は同じです
glm(formula = 効果b ~ 筋トレ, family = binomial, data=dat)
筋トレしたらオッズが6倍になる・・・同じ結果なのですが、こちらの方が説得力はありそうです。それでは、次のような例はどうでしょうか・・・?
dat2 <- read.csv("cross2-1.csv", header=T, fileEncoding = "Shift-JIS")
tab2 <- xtabs(~ 筋トレ + 効果, data = dat2)
head(dat2)
df <- data.frame(tab2)
df2 <- tidyr::spread(df, key=効果, value=Freq) #横のデータに変換
print(df2)
glm(cbind(あり, なし) ~ 筋トレ, family = binomial, data=df2)
やはりここでも基準が理解できていないと解釈を間違うことになります。オッズの基準を「効果なし」、筋トレ の基準を「無」に設定してみます。
#factor変数にすることでlevelが付与されます
df2$筋トレ <- as.factor(df2$筋トレ )
#relevel関数で基準となるカテゴリーを設定します
df2$筋トレ <- relevel(df2$筋トレ , ref=c("無"))
#効果の基準「なし」を後に書きます
glm(cbind(あり,なし) ~ 筋トレ , family = binomial, data=df2)
効果「あり」を基準にしい場合
glm(cbind(なし, あり) ~ 筋トレ , family = binomial, data=df2)
exp(-3.689)
筋トレ「無」に比べると筋トレ「多」は、効果ありと比較した効果なしの割合は0.025倍に落ちることが推定されます。筋トレすると効果なしの比率が低くなるという結果です・・・。研究目的次第だとは思いますが、やはり前の基準が説明しやすいと良いと思います。
<参考>
コメント欄 『間違い』や『分かりにくい部分』などのご意見もお寄せください