医学研究において、順序カテゴリ(ordinal category)を持つアウトカムは頻繁に遭遇します。疾患の重症度(軽度、中等度、重度)、患者の自覚的健康状態、疼痛スコアなど、カテゴリ間に自然な順序が存在するデータです。通常のロジスティック回帰は2値アウトカムのみを扱うため、このような順序カテゴリには適用できません。順序ロジスティック回帰(ordered logistic regression)は、こうした順序カテゴリデータを適切に解析するための手法です。
## 順序ロジスティック回帰とは
順序ロジスティック回帰は、従属変数が3つ以上の順序カテゴリを持つ場合に用いる回帰モデルです。カテゴリ間の順序情報を活用することで、より効率的な推定が可能になります。
### 通常のロジスティック回帰との違い
通常のロジスティック回帰は、アウトカムが2値(例:発症した/しなかった)の場合に使用します。一方、順序ロジスティック回帰は以下の特徴を持ちます。
- アウトカムが3つ以上の順序カテゴリを持つ
- カテゴリ間の順序関係を考慮する
- 比例オッズ仮定(proportional odds assumption)を用いる
### 順序ロジスティック回帰の考え方
順序ロジスティック回帰では、「あるカテゴリ以下である確率」と「それより上のカテゴリである確率」を比較します。
例えば、血栓の程度が「なし」「軽度」「中等度」の3段階ある場合を考えてみます。このとき、以下の2つの比較を行います。
- なし vs. 軽度/中等度
- なし/軽度 vs. 中等度
順序ロジスティック回帰の特徴は、説明変数(例:年齢、血流量など)の関連が、これらすべての比較で共通であると仮定する点です。これを「比例オッズ仮定」と呼びます。
具体的には、「年齢が1歳高いと血栓が起きやすい」という関連性が、上記のどの比較でも同じ強さで成り立つと仮定します。この仮定により、1つのモデルで複数のカテゴリ間の関係を効率的に推定できます。
生物統計における仮定の考え方については、[[生物統計における仮定とは]]を参照してください。
## 実践:Stataによる解析
### データセットの準備
透析終了時の回路における血栓の程度を例として、順序ロジスティック回帰を実行してみます。アウトカムは血栓の程度(1=なし、2=軽度、3=中等度)、説明変数は血流量、抗血小板薬使用の有無、年齢とします。
以下の`input`コマンドでデータを入力します。
```stata
clear
input id thrombosis blood_flow antiplatelet age
1 1 205 1 45
2 2 195 0 58
3 2 200 1 52
4 3 180 0 62
5 1 210 0 48
6 2 190 1 55
7 2 185 1 50
8 1 215 1 54
9 3 175 0 65
10 2 200 0 50
11 1 220 1 42
12 2 195 1 47
13 3 170 0 68
14 2 205 0 53
15 1 225 1 46
16 2 190 0 59
17 3 180 1 63
18 1 210 0 45
19 2 195 1 54
20 3 175 0 66
21 1 215 1 43
22 2 200 0 56
23 3 185 0 64
24 2 205 1 51
25 1 220 0 47
26 2 180 0 61
27 3 175 1 57
28 1 210 1 44
29 2 200 1 55
30 3 185 0 63
31 1 225 1 45
32 2 190 0 58
33 2 205 1 52
34 3 180 0 65
35 1 215 1 46
36 2 195 0 57
37 3 175 1 56
38 1 200 0 43
39 2 190 1 54
40 3 170 0 68
41 1 210 1 48
42 2 195 0 59
43 2 205 1 53
44 3 180 0 62
45 1 220 1 44
46 2 185 1 50
47 3 175 0 64
48 2 200 0 51
49 1 215 1 46
50 2 190 1 48
51 1 210 1 45
52 3 180 0 67
53 2 200 1 54
54 3 185 0 63
55 1 220 0 47
56 2 195 1 51
57 2 205 1 52
58 3 175 0 65
59 1 215 1 43
60 2 190 0 59
61 3 170 0 69
62 1 200 0 46
63 2 195 1 55
64 3 180 1 54
65 1 210 1 44
66 2 200 0 57
67 2 205 1 53
68 3 175 0 66
69 1 220 1 48
70 2 185 0 52
71 3 180 0 68
72 1 215 1 45
73 2 195 1 54
74 3 175 0 65
75 1 210 0 46
end
```
### 変数ラベルと値ラベルの設定
データの可読性を高めるため、変数ラベルと値ラベルを設定します。
```stata
* 変数ラベルの設定
label variable thrombosis "血栓の程度"
label variable blood_flow "血流量 (mL/分)"
label variable antiplatelet "抗血小板薬使用"
label variable age "年齢"
* 値ラベルの設定
label define thromb_lb 1 "なし" 2 "軽度" 3 "中等度"
label values thrombosis thromb_lb
label define anti_lb 0 "なし" 1 "あり"
label values antiplatelet anti_lb
```
### データの確認
まず、`describe`コマンドでデータセットの構造を確認します。
```stata
. describe
Contains data
Observations: 75
Variables: 5
-------------------------------------------------------------------------------
Variable Storage Display Value
name type format label Variable label
-------------------------------------------------------------------------------
id float %9.0g
thrombosis float %9.0g thromb_lb
血栓の程度
blood_flow float %9.0g 血流量 (mL/分)
antiplatelet float %9.0g anti_lb 抗血小板薬使用
age float %9.0g 年齢
-------------------------------------------------------------------------------
Sorted by:
Note: Dataset has changed since last saved.
```
75例のデータ、5つの変数が格納されていることが分かります。
次に、`summarize`コマンドで記述統計を確認します。
```stata
. summarize
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
id | 75 38.0 21.79449 1 75
thrombosis | 75 1.973333 .7706321 1 3
blood_flow | 75 196.9333 15.58253 170 225
antiplatelet | 75 .5066667 .5031224 0 1
age | 75 55.8 7.669604 42 69
```
血栓の程度は平均1.97(1=なし〜3=中等度)、血流量は平均196.9 mL/分、抗血小板薬使用者は約51%、年齢は平均55.8歳です。
アウトカムの分布を`tabulate`コマンドで確認します。
```stata
. tabulate thrombosis
血栓の |
程度 | Freq. Percent Cum.
------------+-----------------------------------
なし | 23 30.67 30.67
軽度 | 31 41.33 72.00
中等度 | 21 28.00 100.00
------------+-----------------------------------
Total | 75 100.00
```
血栓なし23例(30.7%)、軽度31例(41.3%)、中等度21例(28.0%)と、各カテゴリにバランスよく分布しています。
### 単変量解析
まず、各説明変数単独で順序ロジスティック回帰を実行します。Stataでは`ologit`コマンドを使用し、`or`オプションでオッズ比を表示します。
#### 血流量と血栓の程度
```stata
. ologit thrombosis blood_flow, or
Iteration 0: Log likelihood = -81.306667
Iteration 1: Log likelihood = -21.041299
Iteration 2: Log likelihood = -10.030335
Iteration 3: Log likelihood = -18.880967
Iteration 4: Log likelihood = -18.87233
Iteration 5: Log likelihood = -18.872327
Iteration 6: Log likelihood = -18.872327
Ordered logistic regression Number of obs = 75
LR chi2(1) = 124.87
Prob > chi2 = 0.0000
Log likelihood = -18.872327 Pseudo R2 = 0.7679
------------------------------------------------------------------------------
thrombosis | Odds ratio Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
blood_flow | .6138882 .0681652 -4.39 0.000 .4937348 .7632879
-------------+----------------------------------------------------------------
/cut1 | -100.2135 22.78653 -144.8743 -55.55273
/cut2 | -89.91975 20.44988 -130.0008 -49.83871
------------------------------------------------------------------------------
```
血流量のオッズ比は0.614で、p < 0.001と統計的に有意です。血流量が1 mL/分増加すると、より高い血栓カテゴリに属するオッズが0.614倍(約39%減少)になります。つまり、血流量が高いほど血栓形成が少ないことを示しています。
出力に表示される`/cut1`と`/cut2`はカットポイント(cut point)と呼ばれ、順序ロジスティック回帰モデルにおけるカテゴリ間の閾値を表します。順序ロジスティック回帰では、観測できない連続的な傾向(潜在変数)を想定し、その値がどの範囲にあるかによって観測されるカテゴリが決まると考えます。
- `/cut1`: 「なし」と「軽度」の境界
- `/cut2`: 「軽度」と「中等度」の境界
今回の例では-100.2や-89.9という極端に大きな負の値になっていますが、これは説明変数(血流量)のスケールが大きいためです。これらの値自体を直接解釈することは通常ありません。
### 多変量順序ロジスティック回帰
次に、すべての説明変数を同時に投入した多変量モデルを構築します。オッズ比で結果を表示するため、`or`オプションを使用します。
```stata
. ologit thrombosis blood_flow i.antiplatelet age, or
Iteration 0: Log likelihood = -81.306667
Iteration 1: Log likelihood = -21.166087
Iteration 2: Log likelihood = -11.877885
Iteration 3: Log likelihood = -5.6583118
Iteration 4: Log likelihood = -5.3553856
Iteration 5: Log likelihood = -5.2920982
Iteration 6: Log likelihood = -5.2920168
Iteration 7: Log likelihood = -5.2920168
Ordered logistic regression Number of obs = 75
LR chi2(3) = 152.03
Prob > chi2 = 0.0000
Log likelihood = -5.2920168 Pseudo R2 = 0.9349
------------------------------------------------------------------------------
thrombosis | Odds ratio Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
blood_flow | .4479054 .1818773 -1.98 0.048 .2020905 .99272
|
antiplatelet |
あり | 126.1255 438.2372 1.39 0.164 .1390616 114392.8
age | 2.793255 1.446526 1.98 0.047 1.012288 7.707565
-------------+----------------------------------------------------------------
/cut1 | -111.2362 60.66855 -230.1444 7.671927
/cut2 | -84.98632 48.43362 -179.9145 9.941824
------------------------------------------------------------------------------
Note: Estimates are transformed only in the first equation to odds ratios.
Note: 9 observations completely determined. Standard errors questionable.
```
多変量モデルでは、血流量(p = 0.048)と年齢(p = 0.047)が統計的に有意な関連を示しました。一方、抗血小板薬使用は統計的に有意ではありませんでした(p = 0.164)。
結果は以下のように解釈します。
- **血流量**: オッズ比は0.448で、血流量が1 mL/分増加すると、より高い血栓カテゴリに属するオッズが0.448倍(約55%減少)になることを示します(p = 0.048)。他の変数で調整した後も、血流量が高いほど血栓形成が少ないことが示されています。
- **抗血小板薬使用**: オッズ比は126.1と極端に大きく、信頼区間も非常に広いです(0.139〜114,393)。これは統計的に有意ではなく(p = 0.164)、一部のデータパターンによって推定が不安定になっている可能性があります。
- **年齢**: オッズ比は2.793で、年齢が1歳増加すると、より高い血栓カテゴリに属するオッズが2.793倍になることを示します(p = 0.047)。高齢になるほど血栓形成が多くなる傾向があります。
注意として、「9 observations completely determined」というメッセージが表示されています。これは、一部の観測値がモデルによってアウトカムが完全に予測されることを意味し、標準誤差の推定に影響する可能性があります。このため、特に抗血小板薬使用の推定結果には注意が必要です。
## 比例オッズ仮定の検定
順序ロジスティック回帰の重要な仮定は、比例オッズ仮定(proportional odds assumption、平行回帰の仮定とも呼ばれる)です。この仮定は、各説明変数の効果がすべてのカテゴリ間の比較で一定であることを意味します。
例えば、血栓の程度が「なし」「軽度」「中等度」の3カテゴリの場合、以下の2つの比較があります。
- なし vs. 軽度/中等度
- なし/軽度 vs. 中等度
比例オッズ仮定では、血流量の効果(オッズ比)がこれら両方の比較で同じであると仮定します。もしこの仮定が成立しない場合、順序ロジスティック回帰の結果は適切ではなく、より柔軟なモデルが必要になります。
### omodelコマンドによる仮定の検定
この仮定を統計的に検定するには、`omodel`コマンドを使用します。`omodel`は`ologit`の代替コマンドで、推定結果に加えて比例オッズ仮定の尤度比検定を自動的に実行します。
まず、`omodel`をインストールします。
```stata
ssc install omodel
```
インストール後、`ologit`の代わりに`omodel logit`を使用します。
```stata
. omodel logit thrombosis blood_flow i.antiplatelet age
Iteration 0: Log likelihood = -81.306667
Iteration 1: Log likelihood = -21.166087
Iteration 2: Log likelihood = -11.877885
Iteration 3: Log likelihood = -5.6583118
Iteration 4: Log likelihood = -5.3553856
Iteration 5: Log likelihood = -5.2920982
Iteration 6: Log likelihood = -5.2920168
Iteration 7: Log likelihood = -5.2920168
Ordered logistic regression Number of obs = 75
LR chi2(3) = 152.03
Prob > chi2 = 0.0000
Log likelihood = -5.2920168 Pseudo R2 = 0.9349
------------------------------------------------------------------------------
thrombosis | Coefficient Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
blood_flow | -.8033986 .4061598 -1.98 0.048 -1.599459 -.0073377
antiplatelet |
あり | 4.837158 3.474795 1.39 0.164 -1.973308 11.64762
age | 1.027591 .5179113 1.98 0.047 .0124995 2.042683
-------------+----------------------------------------------------------------
/cut1 | -111.2362 60.66855 -230.1444 7.671927
/cut2 | -84.98632 48.43362 -179.9145 9.941824
------------------------------------------------------------------------------
Note: 9 observations completely determined. Standard errors questionable.
Approximate likelihood-ratio test of proportionality of odds across
response categories: chi2(6) = 3.76 Prob > chi2 = 0.7103
```
### 結果の解釈
`omodel`の出力の最後に表示される尤度比検定が、比例オッズ仮定の検定結果です。
```
Approximate likelihood-ratio test of proportionality of odds across
response categories: chi2(6) = 3.76 Prob > chi2 = 0.7103
```
この検定の帰無仮説は「係数がすべてのカテゴリ間で等しい」、すなわち「比例オッズ仮定が成立している」です。
- **chi2 = 3.76、p = 0.7103**: p値が0.05より大きいため、帰無仮説を棄却できません。比例オッズ仮定は成立していると判断できます。
重要な注意点として、ヘルプファイルにも記載されていますが、**有意なp値(p < 0.05)が出た場合は比例オッズ仮定違反の証拠となります**。一方、**有意でないp値は、必ずしもモデルが適切であることを保証するものではありません**。この検定は仮定違反を検出するためのツールであり、モデルの妥当性を完全に証明するものではない点に留意が必要です。
なお、比例オッズ仮定の検定には`brant`コマンドも使用できます(`omodel`パッケージに含まれています)。`brant`は変数ごとの詳細な検定結果を提供するため、どの変数が仮定違反の原因かを特定する際に有用です。
## 留意点
### 比例オッズ仮定
順序ロジスティック回帰の最も重要な仮定です。この仮定が成立しない場合、推定結果にバイアスが生じる可能性があります。Brant testなどで仮定を確認することが推奨されます。
### サンプルサイズ
順序ロジスティック回帰は、各カテゴリに十分な観測数が必要です。カテゴリ数が多い場合や、一部のカテゴリに観測数が少ない場合、推定が不安定になる可能性があります。
### 完全分離(Complete Separation)
説明変数がアウトカムを完全に予測する場合、モデルの推定に問題が生じます。このような場合、標準誤差が非常に大きくなり、推定結果の信頼性が低下します。データの分布を確認し、必要に応じて説明変数の調整やカテゴリの統合を検討してください。
### カテゴリの順序
順序ロジスティック回帰は、カテゴリ間の順序が意味を持つ場合にのみ適用できます。順序に意味がない場合(例:血液型)は、多項ロジスティック回帰(multinomial logistic regression)を使用してください。
## 参考コード(完全版)
以下は、データ入力から多変量解析までを一度に実行できる完全なコードです。
```stata
* 透析血栓データの作成と順序ロジスティック回帰の実行
clear
* データ入力
input id thrombosis blood_flow antiplatelet age
1 1 205 1 45
2 2 195 0 58
3 2 200 1 52
4 3 180 0 62
5 1 210 0 48
6 2 190 1 55
7 2 185 1 50
8 1 215 1 54
9 3 175 0 65
10 2 200 0 50
11 1 220 1 42
12 2 195 1 47
13 3 170 0 68
14 2 205 0 53
15 1 225 1 46
16 2 190 0 59
17 3 180 1 63
18 1 210 0 45
19 2 195 1 54
20 3 175 0 66
21 1 215 1 43
22 2 200 0 56
23 3 185 0 64
24 2 205 1 51
25 1 220 0 47
26 2 180 0 61
27 3 175 1 57
28 1 210 1 44
29 2 200 1 55
30 3 185 0 63
31 1 225 1 45
32 2 190 0 58
33 2 205 1 52
34 3 180 0 65
35 1 215 1 46
36 2 195 0 57
37 3 175 1 56
38 1 200 0 43
39 2 190 1 54
40 3 170 0 68
41 1 210 1 48
42 2 195 0 59
43 2 205 1 53
44 3 180 0 62
45 1 220 1 44
46 2 185 1 50
47 3 175 0 64
48 2 200 0 51
49 1 215 1 46
50 2 190 1 48
51 1 210 1 45
52 3 180 0 67
53 2 200 1 54
54 3 185 0 63
55 1 220 0 47
56 2 195 1 51
57 2 205 1 52
58 3 175 0 65
59 1 215 1 43
60 2 190 0 59
61 3 170 0 69
62 1 200 0 46
63 2 195 1 55
64 3 180 1 54
65 1 210 1 44
66 2 200 0 57
67 2 205 1 53
68 3 175 0 66
69 1 220 1 48
70 2 185 0 52
71 3 180 0 68
72 1 215 1 45
73 2 195 1 54
74 3 175 0 65
75 1 210 0 46
end
* 変数ラベルの設定
label variable thrombosis "血栓の程度"
label variable blood_flow "血流量 (mL/分)"
label variable antiplatelet "抗血小板薬使用"
label variable age "年齢"
* 値ラベルの設定
label define thromb_lb 1 "なし" 2 "軽度" 3 "中等度"
label values thrombosis thromb_lb
label define anti_lb 0 "なし" 1 "あり"
label values antiplatelet anti_lb
* データの確認
describe
summarize
tabulate thrombosis
tabulate antiplatelet
* クロス集計で分布を確認
tabulate thrombosis antiplatelet, row
* 単変量解析(オッズ比で表示)
ologit thrombosis blood_flow, or
* 多変量順序ロジスティック回帰(オッズ比で表示)
ologit thrombosis blood_flow i.antiplatelet age, or
```
このコードを実行することで、順序ロジスティック回帰の一連の解析を体験できます。