glm(y ~ x1 + x2, family = binomial(), data = dat)From Risk to Logistic Regression

Adjusting for Bias II − From Risk to Logistic Regression
Keywords: confounding & collapsibility, effect measure, generalized linear model, language & writing
はじめて研究に取り組む娘と統計家の父。父に研究仮説は”PICO”を”PECO”で整理するといいとアドバイスされ、女医である娘は、がんサバイバーにおけるストーマ造設と復職状況の関係を調査することに決める。その後いくつか質問するうちに、父のことを「こいつ使える」と思い始めたのだった。
ロジスティック回帰をしてみたんだけど
私「これみてよ、お父さん」
お父さん「ん?どうしたの、この資料」
私「前に相談したがんサバイバーの復職状況を調べる研究についてなんだけどね、うちの診療科だけだけど調査票が集まったから、解析してみたの。その結果をまとめた資料よ」
お父さん「ああ、あれね。ストーマ造設と復職率の関連を調べることにしたんだっけ。資料のどこをみればいいの?」
私「この表なんだけど。ロジスティック回帰(logistic regression)をしてみたんだ。その結果をまとめたよ。どうかな」
| パラメータ | 自由度 | 推定値 | 標準誤差 | 95%信頼区間 | \(\chi^2\) | p値 |
|---|---|---|---|---|---|---|
| Intercept | 1 | -27.25 | 3.03 | -33.20~-21.30 | 80.55 | <0.01 |
| STOMA | 1 | 1.41 | 1.54 | -16.1~4.45 | 0.84 | 0.3588 |
| AGE | 1 | 1.47 | 1.48 | -1.42~4.36 | 0.99 | 0.3197 |
| SEX | 1 | 25.72 | 0.00 | 25.72~25.72 | ||
| INCOME | 1 | -0.00 | 0.00 | -0.00~0.00 | 0.58 | 0.4481 |
お父さん「ふむふむ。よくある回帰分析の結果だね。この表、上司にみせるんでしょ。その前にちょっと手直しした方がいいかもね」
私「やっぱり?そんな気がしてみてもらおうと思ったんだ」
お父さん「まず、Intercept、STOMA、AGE、SEX、INCOMEっていうのがわからないよ。Intercept以外は共変量(covariates)のことだよね」
私「共変量って?」
お父さん「共変量っていうのは、ロジスティック回帰に入れる説明変数のこと。復職率を規定する要因っていえばいいかな。それと、Interceptは回帰式でいう切片項のこと。統計ソフトウェアのアウトプットをそのまま表にしたんでしょ?きっとストーマ、年齢、性別、年収という変数を使ったんだと思うんだけど、データ上の変数名がそのままになっている。それに、出てきた数字をぜんぶ載せると、表がうるさくない?」
私「めっちゃしゃべるな。そうね、実はRのglm()を使ったんだけど、そこもよくわからなかったんだよね。そこから聞こうかな」
お父さん「どのあたり?」
私「glm()の指定の仕方。引数っていうの?」
私「以前、連続データは正規分布、2値データは2項分布ってイメージが大事みたいなこといってたでしょ?glm()もその延長だと思うんだけど、familyとかlinkとか謎で、ロジスティック回帰になってるか自信ない」
お父さん「そこはね、単変量分布を一般化線型モデルに広げないと説明できないよ。つまりね、glm()はgeneralized linear modelの略なんだけど、ただの確率分布ってわけじゃなくて、3つのパーツから成り立っているんだ。ざっくりいうとこの3つだよ」
確率分布(データの型はなにか)
回帰係数×共変量
リンク関数(平均をどう変換して共変量と結びつけるか)
私「で、それがfamily、y ~ x1 + x2、linkなの?」
お父さん「そう。glm()は、確率分布+回帰係数×共変量+リンクを指定してるだけなんだ」
私「y ~ x1 + x2は私もわかるよ。調べたい変数をいれるんでしょ」
お父さん「そうだね。Rの中では、この式がデザイン行列\(Z\)に変換されてる」
Z <- model.matrix(~ x1 + x2, data = dat)お父さん「ちょっとマニアックだけど、Rの内部では、model.matrix()っていう関数で、デザイン行列\(Z\)を作っている。\(Z\)の最初の列はすべて1になる。これは回帰直線でいう切片に対応している。次の列以降はx1とx2に対応する値が計算される。こうしておくと、たとえばx1が文字列でも数値に置き換えて計算できたり、回帰係数との掛け算が行列として計算できたり、なにかと都合がいい。ここまで覚えなくていいけど、仕組みを知っておくと理解が進むでしょ」
私「なるほどね、じゃあfamilyってなに?データの型?」
お父さん「そう。familyは日本語では分布族の意味だね。正確には指数型分布族(exponential family)。前にいったみたいに、データの型にあわせて確率分布を選ぶ」
- 連続データ: gaussian()
- 2値データ: binomial()
- 計数データ: poisson()
glm(y ~ x1 + x2, family = gaussian(), data = dat)
glm(y ~ x1 + x2, family = binomial(), data = dat)
glm(y ~ x1 + x2, family = poisson(), data = dat)お父さん「ただしね、一般化線型モデルではデフォルト仕様みたいなものがあって、familyを指定すると以下の3つが一度に決まるっていう特徴がある」
- yの確率分布
- yの分散
- その確率分布にあったリンク関数
私「リンク関数ってなんだ?」
お父さん「リンク関数(link function)は、平均をどう変換して回帰係数×共変量にあわせるかだよ。family = binomial()は、デフォルトでロジット関数(logit function)というリンク関数を使っている。ロジット関数が、2項分布の構造にあった”自然な”リンク関数なんだ。これがロジスティック回帰だよ」
私「そっか、よかった。うん、けっこうわかったから今日はもういい」
ロジスティック回帰のリンク関数は、ロジット関数以外のものを代わりに使うことができます。リンク関数をうまく指定してリスク\(\pi\)を変換することで、オッズ比以外の関連の指標を求められることが知られています。次の指標のうち、対応するリンク関数がなく、求められないものはどれでしょうか。
- リスク差
- リスク比
- ハザード比
- 1、2、3すべて求めることができる
- 正解は4です
一般化線型モデルはロジスティック回帰を一般化したもので、「リンク関数」を変えることで、さまざまな指標を計算できます(田中2022)。詳しくはのちのエピソードで述べますが、リンク関数は、ロジスティック回帰でいえば、リスク\(\pi\)を関数\(g(\pi)\)を用いて変換しています。
リスク差を求めるには、\(g(\pi)=\pi\)つまり恒等関数を指定します。
リスク比を求めるには、\(g(\pi)=\log(\pi)\) つまり対数関数を指定します。
ハザード比を求めるには、\(g(\pi)=\log\{-\log(1-\pi)\}\)つまり補2重対数(complementary log-log)関数を指定します。
文献
次のエピソードとRスクリプト
このシリーズのエピソード
- Understanding Collapsibility of Effect Measures: Marginal vs Stratified
- From Risk to Logistic Regression
- Logit: How a Transformation Shapes an Effect
- Where My Logistic Regression Went Wrong
- Why Logistic Regression Fails in Small Samples
- Understanding Confounding in Effect Measures: Marginal vs Stratified
過去のシリーズ
用語集