## はじめに
連続変数(年齢、BMI、検査値など)とアウトカムの関連を調べるとき、線形の仮定を置くと実態を見逃すことがあります。スプライン回帰を使えば、変数のどの範囲でリスクが高いのかを柔軟にモデル化し、ハザード比の曲線として可視化できます。
この記事では `mkspline` で線形スプライン変数を作成し、Cox回帰で推定したあと、`xblc` コマンドでハザード比を図示する手順を紹介します。
## 必要なパッケージ
`xblc` は外部コマンドです。初回のみインストールが必要です。福井大学内からインストールする場合はプロキシ設定が必要です([[Stata - 福井大学内でのパッケージインストール]] を参照)。
```stata
net install st0215_1, from(http://www.stata-journal.com/software/sj11-3)
```
## データの準備
心臓移植データ `stan3` を使用します。
```stata
clear
webuse stan3
stset stime, failure(died)
```
```
Survival-time data settings
Failure event: died!=0 & died<.
Observed time interval: (0, stime]
Exit on or before: failure
--------------------------------------------------------------------------
172 total observations
0 exclusions
--------------------------------------------------------------------------
172 observations remaining, representing
75 failures in single-record/single-failure data
60,591 total analysis time at risk and under observation
```
## 線形スプライン変数の作成
`mkspline` は指定したノット(結び目)で変数を区間ごとに分割し、区分線形のスプライン変数を生成します。ここでは年齢を 30、40、50歳の3点で分割し、4つのスプライン変数を作ります。
```stata
mkspline age_s1 30 age_s2 40 age_s3 50 age_s4 = age
```
これにより以下の変数が作成されます。
| 変数 | 区間 |
|------|------|
| `age_s1` | age < 30 の部分の傾き |
| `age_s2` | 30 ≤ age < 40 の部分の傾き |
| `age_s3` | 40 ≤ age < 50 の部分の傾き |
| `age_s4` | 50 ≤ age の部分の傾き |
各区間で異なる傾きを持つことで、年齢とハザードの関連が直線に制約されなくなります。
## 共変量の中心化
調整変数は平均値で中心化しておくと、`xblc` での基準値の解釈がしやすくなります。
```stata
sum year
gen year_c = year - r(mean)
```
複数の変数を中心化したい場合はループを使います。
```stata
foreach var of varlist age height weight {
quietly sum `var'
gen `var'_c = `var' - r(mean)
}
```
## Cox回帰の実行
スプライン変数と中心化した共変量を投入します。
```stata
stcox age_s* year_c
```
```
Cox regression with Breslow method for ties
No. of subjects = 172 Number of obs = 172
No. of failures = 75
Time at risk = 60,591
LR chi2(5) = 15.52
Log likelihood = -336.18518 Prob > chi2 = 0.0084
------------------------------------------------------------------------------
_t | Haz. ratio Std. err. z P>|z| [95% conf. interval]
-------------+----------------------------------------------------------------
age_s1 | .912946 .042566 -1.95 0.051 .8332165 1.000305
age_s2 | 1.114656 .0776674 1.56 0.119 .972368 1.277766
age_s3 | .9969981 .0430169 -0.07 0.944 .9161531 1.084977
age_s4 | 1.064414 .0474151 1.40 0.161 .9754236 1.161524
year_c | .852065 .0598065 -2.28 0.023 .742552 .9777293
------------------------------------------------------------------------------
```
各スプライン変数の係数は「その区間における年齢1歳あたりのハザード比」を表しています。個別の係数よりも、全体の曲線パターンを見ることが重要です。
## xblc によるハザード比の算出
`xblc` は回帰モデルの結果からスプライン変数を合成し、特定の基準値に対するハザード比と信頼区間を算出します。
```stata
levelsof age
quietly: xblc age_s*, covname(age) at(`r(levels)') reference(40) eform ///
line yscale(log) generate(pa hr lb ub)
```
主なオプションの意味は以下の通りです。
| オプション | 説明 |
|------------|------|
| `covname(age)` | 元の変数名を指定する |
| `at(...)` | ハザード比を計算する年齢の値を指定する |
| `reference(40)` | 基準値を40歳に設定する(HR = 1 となる点) |
| `eform` | 指数変換してハザード比として表示する |
| `generate(pa hr lb ub)` | 予測値の変数を生成する(pa: 年齢値、hr: ハザード比、lb/ub: 信頼区間下限/上限) |
## グラフの作成
`xblc` が生成した変数を使って、信頼区間付きのハザード比曲線を描きます。
```stata
* ノット位置と両端にドットを表示する
quietly sum pa
gen show_dot = 1 if pa==`r(min)' | pa==`r(max)' | pa==30 | pa==40 | pa==50
twoway rarea lb ub pa, col(gs13) || ///
scatter hr pa if show_dot==1, ///
msymbol(circle) mcol(black) msize(medium) connect(l) ||, ///
yscale(log) ///
ylab(0.1 0.2 0.5 1 2 5 10, nogrid angle(horizontal) format(%5.1f)) ///
legend(off) scheme(s2mono) ///
ytitle("Hazard ratio") xtitle("Age") ///
name(f1, replace)
```
![[spline_hr_plot.png|500]]
灰色の帯が95%信頼区間、黒い線と点がハザード比を表しています。基準値(40歳、HR = 1)から離れるほど信頼区間が広がっていることがわかります。
## グラフの読み方
- **HR = 1 の線**が基準です。40歳を基準にすると、30歳付近では HR ≈ 0.3 で死亡リスクが低く、60歳以上では HR > 2 でリスクが高いことが読み取れます。
- **信頼区間の幅**はその年齢帯のデータ量を反映しています。端の年齢ではデータが少ないため帯が広がります。
- **ノットの位置**(30、40、50歳)で傾きが変化しています。ノットの選び方で曲線の形が変わるため、臨床的知識やデータの分布に基づいて設定します。
## ノットの選び方
ノットの数と位置はモデルの柔軟性を左右します。一般的な方針は以下の通りです。
- データの分布(パーセンタイル)に基づいて配置する(例: 25th、50th、75th)
- 臨床的に意味のあるカットポイント(例: 30、40、50歳)を使う
- ノットが多すぎると過適合、少なすぎると非線形性を捉えられないため、3-5個程度が一般的です
## 多変量調整での応用
実際の研究では複数の交絡因子を調整します。調整変数を中心化してモデルに追加すれば、同じ手順でスプライン曲線を描けます。
```stata
* 複数変数の中心化
foreach var of varlist age height weight {
quietly sum `var'
gen `var'_c = `var' - r(mean)
}
* 調整済みモデル
stcox age_s* year_c height_c weight_c
```
`xblc` は最後に推定したモデルの結果を使うため、追加の変数が調整変数として反映されます。
## 制限付き3次スプライン(RCS)との違い
`mkspline` で作成するのは線形スプラインです。より滑らかな曲線が必要な場合は、制限付き3次スプライン(restricted cubic spline)を使う方法もあります。
```stata
mkspline age_rcs = age, cubic nknots(4)
```
`cubic` オプションを加えると3次スプライン変数が作成されます。`xblc` はどちらのスプラインにも対応しています。
## まとめ
| 手順 | コマンド |
|------|----------|
| スプライン変数の作成 | `mkspline` |
| 生存時間回帰 | `stcox` |
| ハザード比の算出と可視化 | `xblc` |
| グラフの描画 | `twoway rarea` + `scatter` |
スプライン回帰は、連続変数を安易にカテゴリ化することなく、非線形の用量反応関係を探索できる有用な手法です。