医師のための統計学再入門

【応用編】第4回:交互作用の解析

けー@代謝内科 先生

臨床医の皆様が統計学を再学習し、臨床研究のデザインや統計学の基礎知識を身につけることを目的とした本シリーズ「医師のための統計学再入門」。応用編の第4回目となる今回は、「交互作用」について解説します。

 臨床研究では、「ある治療は若年者には効果があるが、高齢者ではそこまでの効果は認められない」「女性ではあるリスクが減るが、男性では変わらない」といった結果に遭遇することがあります。
このような現象は、単なる偶然や交絡によるものなのでしょうか? それとも、治療効果そのものが患者ごとに異なっているのでしょうか?

 本記事では、交互作用の理論と解釈、そしてCox回帰モデルにおける交互作用項の取り扱いを、具体的なデータとPythonコードを用いてわかりやすく解説していきます。

前回の記事はこちら:医師のための統計学再入門【応用編】第3回:生存時間解析

効果修飾とは?交絡とはどう違う?

まず、よく混同されがちな「交絡(confounding)」と「効果修飾(effect modification)」の違いを押さえておきましょう。

特徴 交絡(confounding) 効果修飾(effect modification)
本質的な性質 因果推論をゆがめる「まぎらわしい第三因子」 効果そのものが異なる「治療の効き目の違い」
解析上の扱い 調整(adjust)して除去する対象 層別化して評価する対象
喫煙が発癌の原因かと思ったら実は年齢が交絡していた 若年者では治療効果が強く、高齢者では治療効果が弱い

つまり交絡は「まちがった因果関係に見える」という要因で、効果修飾は「本当に人によって効果が違う」という大切な現象です。

効果修飾がある場合、個別化医療(オーダーメイド治療)に向けた重要な手がかりとなります。

サブグループ解析では何がわかるのか?

効果修飾を疑うとき、よく行われるのが「サブグループ解析」です。たとえば母集団を「65歳未満」と「65歳以上」の2群にわけ、それぞれで治療効果(ハザード比など)を計算する方法です。

ただし次のような注意が必要です:

  • 若年群でp<0.05、高齢群でp>0.05でも、「治療効果に差がある」とは言えません。
  • 効果に「差があるかどうか」は交互作用項で検定する必要があります。

Coxモデルに交互作用項を追加する

では、実際に交互作用をモデルに組み込んでみましょう。

今回も Veterans’ Lung Cancer データを用い、治療効果が「年齢群」によって異なるかを検討してみます。

Pythonコードを提示します。

!pip install lifelines
import pandas as pd
from lifelines import CoxPHFitter


# データ読み込み
url = 'https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/survival/veteran.csv'
df = pd.read_csv(url, index_col=0)


# lifelines 用に status を再符号化(1=event, 0=censored)
df['status'] = df['status'].replace({1: 1, 2: 0})


# ダミー変数化(trt, celltype)、drop_first=True で基準値を自動設定
df2 = pd.get_dummies(df, columns=['trt', 'celltype'], drop_first=True)


# 年齢でグループ分け
df2['age_group'] = (df2['age'] >= 65).astype(int)


# 治療と年齢の交互作用項
df2['trt_2_agegroup'] = df2['trt_2'] * df2['age_group']


# モデル適用
cph = CoxPHFitter()
cph.fit(df2[['time', 'status', 'trt_2', 'age_group', 'trt_2_agegroup']],
        duration_col='time', event_col='status')
cph.print_summary()

治療効果が年齢軍によって異なるか検討した結果の表 治療効果が年齢軍によって異なるか検討した結果の表 治療効果が年齢軍によって異なるか検討した結果の表

上記の結果が得られました。

結果の読み方と「p for interaction」

モデルから得られた結果のうち、注目すべきは trt_2_agegroup(治療と年齢の交互作用項)のp値です。

項目 HR(exp(coef)) p値 解釈例
trt_2 0.89 0.61 治療群2はわずかにリスク減少傾向だが有意ではない
age_group 1.15 0.60 高齢群ではリスクやや上昇の傾向(非有意)
trt_2_agegroup 1.51 0.28 高齢群では治療効果がむしろリスク増に転じている傾向

この trt_2_agegroup の p 値(=0.28)は「年齢によって治療効果が異なる」とまでは言えませんが、将来の仮説を立てる手がかりとして有用な情報とも言えます。

Forestプロットで視覚化しよう

交互作用の存在を視覚的に示すには、「サブグループごとのHR」を並べた Forestプロット が有効です。

以下は、若年者と高齢者における治療効果を図示するPythonコードです。

!pip install japanize_matplotlib
import matplotlib.pyplot as plt
import japanize_matplotlib # Import the library to apply Japanese font settings


plt.rcParams['font.family'] = 'IPAexGothic' # Use 'IPAexGothic' instead of 'IPAPGothic'


# 年齢群ごとの治療効果(仮のHRと95%CI)
groups = ['若年者(65歳未満)', '高齢者(65歳以上)']
HR = [0.85, 1.30]
CI_lower = [0.60, 0.85]
CI_upper = [1.20, 1.98]


# エラーバーの計算
error_lower = [HR[i] - CI_lower[i] for i in range(2)]
error_upper = [CI_upper[i] - HR[i] for i in range(2)]


# プロット
plt.figure(figsize=(6, 2.5))
plt.errorbar(HR, groups, xerr=[error_lower, error_upper],
             fmt='o', color='navy', ecolor='gray', capsize=5)


plt.axvline(1.0, color='red', linestyle='--', label='HR=1(効果なし)')
plt.xlabel("ハザード比(HR)")
plt.title("年齢群別の治療効果")
plt.grid(True)
plt.tight_layout()
plt.legend()
plt.show()

すると、以下の図を得ることができます。この図からわかることは、

患者の年齢による治療効果をForestプロットで視覚化
  • V1若年者ではV2治療により有益な効果の傾向がありそうである
  • 高齢者では効果がなく、むしろ害の傾向もあるように見える
  • ただし、「差がある」と言えるのは交互作用項のp値が有意なときのみである

ということです。

注意すべき落とし穴

交互作用の解析は個別化医療(オーダーメイド医療)の視点からも魅力的ですが、いくつかの注意点や誤解されやすいポイントがあります。以下に代表的な3つを具体例とともにご紹介します。

(1)p for interactionが有意でない限り「差がある」とは言えない

「若年者ではp=0.03、高齢者ではp=0.20だった。だから若年者にだけ効果がある!」と誤解してしまいがちですが、実は、 この結果だけでは「若年者と高齢者で治療効果に差がある」とは言えません。

必要なのは、「両群間で治療効果が統計的に異なる」ことの検定です。それを担うのが「交互作用項のp値(=p for interaction)」です。

肺がん治療薬の臨床試験で、男性のハザード比が0.75(p=0.04)、女性は1.00(p=0.98)だったとしても、「性別で治療効果が異なる」とは限りません。 その差が統計的に有意(p for interaction < 0.05)でない限り、「差がある」と結論づけてはいけないのです。

(2)多重比較のリスク:サブグループを増やすと偶然の有意差が増える

交互作用を検討するためにサブグループを5つ、10個…と増やすほど、偶然にp<0.05になる項目が出るリスクも高まります。これを多重検定(multiple testing)問題といいます。

ある薬の効果を「年齢」「性別」「BMI」「血圧」「喫煙」「飲酒習慣」…と10個の要因で交互作用検定をした場合、本当に差がないのに、約1個は偶然p<0.05になる可能性があります(5%の有意水準の場合)。

こうした「偶然の有意差」を防ぐには、Bonferroni補正などで有意水準を調整する方法が用いられます。

(3)事前計画がないサブグループ解析は仮説生成的:結論づけには慎重さが必要

サブグループ解析は事前に分析計画で定義されている場合はよいのですが、解析の途中や後から「なんとなく気になるから」とサブグループを作って効果を調べると、バイアスや偶然の一致に左右されやすくなります。

ある降圧薬の研究で、主解析の有意差が出なかったため、研究者が「左利きの患者」や「身長が170cm以上」などで効果を再分析し、有意な結果が得られたとしても、それはたまたまデータに「そう見えただけ」かもしれません。

こうした「後付けのサブグループ解析」は、あくまで仮説生成的(次の研究の参考)と位置づけ、結論として断定しない慎重さが求められます。

これらの注意点を踏まえることで、交互作用解析をより正確に、そして臨床的に価値あるかたちで活用することができます。

「統計的に気になったり差があるように見えたりする」という感覚は大切ですが、それを科学的に検証する手段が交互作用解析であることを意識しておくことが重要です。

まとめ

交互作用の解析は、「この治療は誰に効くのか?」という問いに答えるための重要な手法です。

交絡因子とは異なり、効果修飾は個別化医療(オーダーメイド治療)にとって極めて意味のある現象です。

モデルに交互作用項を追加して評価することで、患者ごとに最適な治療方針を探る手がかりを得ることができます。ぜひ、ご自身のデータでも交互作用の検討を試してみてください。

次回は、得られた結果がどれだけ「条件に依存せず一貫しているか」を検証する、感度分析(sensitivity analysis)を取り上げます。

変数の入れ替えやモデルの変更を通じて、解析のロバスト性(頑健さ)を評価する実践的な方法を学んでいきましょう。

 

次回の記事はこちら:医師のための統計学再入門【応用編】第5回:感度分析と統計解析の実践

公式SNS

こちらの記事に加えキャリアや働き方に関連する
医師の皆様に役立つ情報を発信中!

けー@代謝内科
M.D., Ph.D. 糖尿病、内分泌専門医として地方の総合病院で楽しく働いています。なにか面白そうなデータを見つけたら解析してみたくなる癖があります。正確でわかりやすい情報発信を心がけています。
[X]URL:https://x.com/keimitoma

求人をみる/アンケート会員に申し込む

医師転職ドットコム 医師バイトドットコム 医師アンケート会員登録

コメントを投稿する

コメント
投稿者名(12文字以内)

ページの先頭へ