1. はじめに
先日、2025/4/7にJAMA Network Openに掲載された論文「Zero Suicide Model Implementation and Suicide Attempt Rates in Outpatient Mental Health Care」が、内容手法ともにとても興味深かったため、論文内容の要約と、手法の深堀(Pythonでの実装)をしてみようと思います。
2. 論文概要
こちらは、Zero Suicide(ZS)プログラムという自殺予防プログラムが、外来精神医療において自殺未遂率に与えた影響を、統計的に検証したアメリカでの研究です。
2012年~2019年の間、カリフォルニア州、オレゴン州、ワシントン州、コロラド州、ミシガン州にある、6つの医療システム(=6つの医療施設)で診療を受けた、13歳以上の方々を対象として研究を実施しました。
3. 背景目的
この研究における背景目的の要約は以下です。
- 背景:
- 米国では、医療機関を介した自殺予防が注目されている
- Zero Suicide (ZS) プログラムは、自殺リスクのスクリーニング、評価、短期介入(安全計画、手段の安全性プロトコル)、および行動健康治療が含まれる自殺予防プログラム
- ZSプログラムは、医療システムにおける広範採用のため、さらなるエビデンスが必要とされている。
- 目的
- ZSプログラム導入が、医療システムにおける自殺未遂率の変化にどう影響したかを検証すること。
4. 手法
こちらの研究手法の概要は大きくわけて以下で、
- まず、2012~2019年の月次データを用いて、6つの医療システム(A~D, Y, Z)について、自殺未遂件数を追跡し、変化を見る。
- ※6つの医療システムのうち、ZSプログラムを途中から導入した4つのシステム(A~D)と、既に導入済みだった2つのシステム(Y, Z)がある
- 得られた結果について、「ITS(interrupted time series analysis, 分割時系列解析」と「GEE(generalized estimation equation, 一般化推定方程式)」を用いて、ZSシステムの導入効果を評価(詳細は後述)
5. 結果
論文の結果を要約すると、以下になります。
- 医療システムA〜Cでは、ZSプログラム導入後に自殺未遂率の減少傾向が見られ、とくにA・Bシステムでは統計的に有意な変化があった。
- 一方、Dシステムでは有意な変化は見られず、すでにZSプログラム導入済みのY・Zシステムでは低い水準を維持していた。


医療システムごとの、自殺未遂率の変化についての、中断時系列モデルのグラフは以下です。これを見ると、確かにシステムA, B(一段目)において導入前後での変化が特に見られます。
【医療システムごとの、自殺未遂率の変化についての、中断時系列モデルのグラフ】出典:Zero Suicide Model Implementation and Suicide Attempt Rates in Outpatient Mental Health Care, Figure 2.
6. 結論
結論を簡単に要約すると、「ZSプログラムの実施は、医療機関における自殺未遂率の低下と関連しており、医療システムにおける自殺予防の有効なアプローチであることが示唆された」となります。
7. 手法の深堀
本研究で用いられた2つの統計的手法について、以下でもう少し掘り下げていきます。
7.1 ITS(Interrupted Time Series analysis, 分割時系列解析)とは?
ITSは、介入前後での「傾き」と「水準」の変化を分離して評価できる時系列解析手法です。
ITSは、以下の3つの要素をモデル化します。
- β₁:介入前の傾き(スロープ)
- β₂:介入時点での水準変化(ジャンプ)
- β₃:介入後の傾き変化(スロープ変化)
モデルをグラフに可視化すると以下のようになります。

この3つを使うことで、単に「変化があったか」だけでなく、「どのように変化したか(持続的か一時的か)」まで解釈・可視化できます。
ランダム化試験が難しい状況において、ITSは観察データのみで、因果的な示唆を得るアプローチとして注目されているようです。今回の研究ではZSプログラム導入を介入とし、その後の傾向をβ₃で、水準変化をβ₂で推定しています。
7.2 GEE(generalized estimation equation, 一般化推定方程式)とは?
GEEとは、繰り返し観測やクラスタデータ(たとえば同一の医療機関内での月次観測)のように、データ内に相関がある場合でも、クラスタと相関構造を設定して推定することができる回帰モデルです。
今回の研究では、6つの医療システムにおける自殺未遂の月次件数を分析対象としており、同じ医療システム内で連続して観測されたデータは自己相関を持つと考えられます。そのため、6つの医療システムというクラスタと、観測の相関を考慮するためGEEが使用されていると考えられます。
7.3 今回のモデル
今回の研究のモデルでは、ITS構造を設定したうえで、目的変数(自殺未遂率)に負の二項回帰を仮定し、GEEで推定していました。
式にすると以下に表せます。

このモデルを、以下のGEE構造の設定で推定しています。
GEEは「時系列 × クラスタ」という複雑なデータ構造に適した解析アプローチであり、本論文のように月次の介入効果を検証し、因果に近い示唆(あくまで因果そのものではない)を得たいときに実用的で有用な手法といえそうです。
8. Pythonでの実装
今回の論文のモデルを、簡易的にPythonで実装再現してみます。
以下のようなサンプルデータを作成し、

以下のようにGEEでモデリングし、
# 説明変数
X = sm.add_constant(df[['time', 'post', 'time_after']])
# GEEモデル構築
model = sm.GEE(
endog=df['suicide_attempts'],
exog=X,
groups=df['system_id'],
offset=df['log_pop'],
family=NegativeBinomial(),
cov_struct=sm.cov_struct.Exchangeable()
)
result = model.fit()
以下のようなサマリー結果が出ます。

見たい数値のみを抜き出すと以下で、

今回はサンプルデータなのでデータに意味はないのですが、解釈するとするならば、
- time_after(介入後の傾向変化)の係数coefは -0.0198 であり、これは介入後に目的変数(自殺未遂率など)がわずかに減少傾向になったことを示唆する。
- オッズ比exp(coef) ≒ 0.98なので、介入後1か月経過するごとに、自殺未遂率は前月比で約0.98倍つまり約1.96%減少する傾向となる。
- また、post(水準変化、ジャンプ)の係数が正であることから、導入直後にわずかな水準上昇があった可能性も見られますが、p値から見て統計的な裏付けは不十分
という結果解釈ができそうです。(※こちらはあくまでサンプルデータを用いた再現のため、実際の論文結果とは全く異なります)
9. おわりに
今回は、論文「Zero Suicide Model Implementation and Suicide Attempt Rates in Outpatient Mental Health Care」の要約と、手法深堀(Python実装)を(便利な生成AIの力を大分に借りて)行ってみました。
研究の内容については、こうした取り組みと研究は個人的にとても意義があると感じるため、純粋に凄いな…と思いながら書いていました。そして使われている統計手法であるITS, GEEについてもこちらを書く前は何も知らなかったため、読んでいくにあたってとても勉強になり面白かったです。
参考までに、Python実装再現の際の全文コードは以下です。
# サンプルデータ生成
np.random.seed(42)
# パラメータ
n_systems = 3
months = 60 # 各システムで60か月分のデータ(5年分)
total_rows = n_systems * months
# システムIDと月
system_ids = np.repeat(np.arange(n_systems), months)
time = np.tile(np.arange(1, months + 1), n_systems)
# 介入タイミング(例:月30から介入)
intervention_month = 30
post = (time >= intervention_month).astype(int)
time_after = np.where(time >= intervention_month, time - intervention_month + 1, 0)
# 人口(10万人前後でばらつき)
population = np.random.normal(100000, 5000, size=total_rows).astype(int)
# ログオフセット
log_pop = np.log(population)
# 自殺未遂件数の生成(介入後に少しずつ減るような構造)
base_rate = 5 / 100000 # 10万人あたり5件
true_rate = base_rate * np.exp(-0.01 * time_after)
expected_counts = true_rate * population
# 実際の観測値(ポアソン分布でランダムに設定)
suicide_attempts = np.random.poisson(expected_counts)
# データフレーム作成
df = pd.DataFrame({
'system_id': system_ids,
'time': time,
'post': post,
'time_after': time_after,
'population': population,
'log_pop': log_pop,
'suicide_attempts': suicide_attempts
})
# 説明変数
X = sm.add_constant(df[['time', 'post', 'time_after']])
# GEEモデル構築
model = sm.GEE(
endog=df['suicide_attempts'],
exog=X,
groups=df['system_id'],
offset=df['log_pop'],
family=NegativeBinomial(),
cov_struct=sm.cov_struct.Exchangeable()
)
result = model.fit()
result.summary()
# 結果の係数とオッズ比の表示用DataFrame作成
summary_df = pd.DataFrame({
'coef': result.params,
'std_err': result.bse,
'p_value': result.pvalues,
'exp(coef)': np.exp(result.params)
})
9. 参照ページ/文献
- Zero Suicide Model Implementation and Suicide Attempt Rates in Outpatient Mental Health Care | Health Care Delivery Models | JAMA Network Open
- 【統計的因果推論】分割時系列解析の初歩を解説する【ITS 回帰不連続デザイン】 – Syleir’s note
- 【統計的因果推論】分割時系列解析をPythonで実装する【ITS 回帰不連続デザイン】 – Syleir’s note
- 分割時系列解析(ITS)の入門 | PPT
- 一般化推定方程式 – Wikipedia
読んでくださりありがとうございます!
