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

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

since2016 ときどきTEXのメモ

ロジスティック回帰の基準(reference) 変更

ロジスティック解析を行うときには、オッズとオッズ比の基準 (reference) が非常に重要になります.特に日本語での記述の場合には、解析を行う前に基準を設定することをお勧めします.

df <- data.frame(c(rep("あり",15),rep("なし",15)),
               c(rep("有効",12),rep("無効",3),rep("有効",4),"無効","有効","有効",rep("無効",8)))
colnames(df) <- c("筋トレ","効果")
dat1 <- xtabs(~ 効果 + 筋トレ, data = df)  

dat1
      筋トレ
効果   あり なし
  無効    3    9
  有効   12    6

基準を確認します.オブジェクトの内容を情報付きで簡潔に表示 str( ) .

str(dat1)

  ..$ 効果  : chr [1:2] "無効" "有効"
  ..$ 筋トレ: chr [1:2] "あり" "なし"

何も設定しない場合には、「前」に書かれている方が基準として決定されます. 効果の基準は「無効」、筋トレの基準は「あり」.効果を目的変数、筋トレを説明変数としたロジスティック回帰を行います.

#データフレームを操作して、目的変数を0、1に置き換え名義変数にします
#0,1に置き換えていますが、基準は「0=無効」のままです
df$効果n <- ifelse(df$効果=="有効",1 ,0)
df$効果n <- as.factor(df$効果n)
glm(formula = 効果n ~ 筋トレ, family = binomial, data = df)

Coefficients:
(Intercept)   筋トレなし  
      1.386       -1.792  
#オッズ比
exp(-1.792) 
オッズ比=0.1666266

オッズは効果が「無効」に対する「有効」の比率、オッズ比は 筋トレ「あり」のオッズに対する筋トレ「なし」のオッズの比率.つまり、筋トレしなかったら筋トレした場合と比べてオッズは0.167倍に下がることが推定できます.

変数を変換したり、層別を行ったりする過程で、何を基準にしているのか分からなくなる場合もあります.以下のように事前に基準を設定しておくことでエラーを防ぐことができます.

「筋トレなし」と「効果なし」を基準にする場合には以下のように設定します。

#データフレームから直接「効果なし」を基準に設定
df$効果n <- as.factor(df$効果n)
df$効果n <- relevel(df$効果n, ref="0") 
#データフレームから直接「筋トレ」なしを基準に設定
df$筋トレ <- as.factor(df$筋トレ)
df$筋トレ <- relevel(df$筋トレ, ref="なし") 
#これで解釈を間違うことはありません、後の記述は同じです
glm(formula = 効果n ~ 筋トレ, family = binomial, data=df)

(Intercept)   筋トレなし  
     -1.386        1.792 ``
exp(1.792) = 6.001443

筋トレしたらオッズが6倍になる・・・同じ結果なのですが、こちらの方が説得力はありそうです。

それでは、次のような例はどうでしょうか・・・

df2 <- data.frame(
        c(rep("多", 8), rep("中", 5), rep("無", 2),
        rep("多", 1), rep("中", 4), rep("無", 10)),
        c(rep("あり", 15), rep("なし", 15))
        )
colnames(df2) <- c("筋トレ", "効果")
dat2 <- xtabs(~ 筋トレ + 効果, data = df2)  

ロジスティック回帰を行ってみます

あり <- c(8, 5, 2)
なし <- c(1, 4, 10)
筋トレ <- c("多", "中", "無")
glm(cbind(あり, なし) ~ 筋トレ, family = binomial)

(Intercept)     筋トレ中     筋トレ無  
      2.079       -1.856       -3.689  

やはりここでも基準が理解できていないと解釈を間違うことになります.
オッズの基準を「効果なし」、筋トレ の基準を「無」に設定してみます.

筋トレ  <- as.factor(筋トレ ) 
筋トレ  <- relevel(筋トレ , ref=c("無")) 
#効果の基準「なし」を後に書きます
glm(cbind(あり,なし) ~ 筋トレ , family = binomial)

(Intercept)     筋トレ多     筋トレ中  
     -1.609        3.689        1.833  
     
筋トレ「多」のオッズ比
exp(3.689)40
筋トレ「無」に比べると「多」のオッズは40倍になることが推定される

効果「あり」を基準にしい場合

glm(cbind(なし, あり) ~ 筋トレ , family = binomial)

(Intercept)     筋トレ多     筋トレ中  
      1.609       -3.689       -1.833  

筋トレ「無」に比べると筋トレ「多」は、効果ありと比較した効果なしの割合は0.025倍に落ちることが推定されます.筋トレすると効果なしの比率が低くなるという結果です・・・研究目的次第だとは思いますが、やはり前の基準が説明しやすいと良いと思います.