医療データでは、欠測はほぼ避けられません。握力が測れない、10 m 歩行速度が記録されない、MMSE が実施できない、画像検査が一部の患者にしかない、退院後フォローアップに来院しない――。臨床データの「空欄」は単なる入力ミスとは限らず、患者の重症度・診療フロー・施設の運用・保険制度・測定者の判断を反映していることがあります。
欠測バイアスの怖さは、解析者が気づかないうちに研究対象を変えてしまう点にあります。欠測を含む症例をすべて除外すると、「測定できる患者」だけが残ります。リハビリ領域では、歩けない患者ほど歩行速度が欠測し、重度失語や意識障害の患者ほど認知検査が欠測し、重症例ほど退院後評価が欠測しがちです。このような欠測を単純削除すると、モデルは軽症例に偏り、実際に予測したい重症例で性能が落ちます。
本稿は、第9部「医療AI研究の落とし穴と対策」の第6記事です。09·02 データリーケージ・09·03 小規模データ・09·05 多重比較 とも密接に関係します。欠測処理は前処理の一部ですが、予測モデル研究では性能評価・較正・外部妥当性に直結します。特に、欠測補完を全データで行ってから train/test 分割すると、評価データの情報を訓練過程に混ぜる危険があります。前段として 14·03 リーケージデモ・14·02 交差検証デモ も併せて読むと立体的に理解できます。
// 01 · LEARN OUTCOMESこの記事で学ぶこと
- 欠測を「データがない」ではなく、「なぜないのか」という臨床情報として扱える。
- MCAR・MAR・MNAR の違いを、リハビリ・医療AIの具体例で説明できる。
- complete case 解析が、症例数減少だけでなく選択バイアスを生む理由を理解する。
- 平均補完・単一補完・多重代入・欠測インジケータ・モデル内欠測処理の長所と注意点を整理できる。
- cross-validation や外部検証で、欠測補完をどこで fit すべきかを Pipeline 設計として説明できる。
- Methods / Results / Discussion に、欠測の扱いを査読者に伝わる形で記載できる。
// 02 · CONCLUSIONまず結論
// 03 · FIGURE図で理解する欠測の構造
欠測メカニズムは古典的に MCAR・MAR・MNAR に分けて考えます。実際の医療データでこれを厳密に証明することは難しく、「どの仮定が一番妥当か」を臨床的に検討します。まず三つの定義を視覚的に確認します。
次に、complete case 解析の何が問題になるかを「残った患者」と「除外された患者」のミックスとして見ます。欠測が重症度と相関すると、軽症例だけが残り、外部適用性が落ちます。
最後に、補完を どこで fit するか という Pipeline 設計の話です。全データで補完器を fit してから分割すると、評価データの分布情報が訓練側に流れ、リーケージに近い形で性能が楽観化します。
Pipeline + ColumnTransformer を使えば、CV の各 fold 内で自動的に fit/transform を分離できます。// 04 · CLINICALリハ・神経・整形領域での具体例
10 m 歩行速度は、歩行可能な患者でしか測れません。歩行不能例を除外すると、歩行能力予測モデルなのに「歩ける患者だけのモデル」になります。欠測は単なる空欄ではなく、歩行不能という臨床情報を含んでいます。欠測インジケータを「歩行非自立フラグ」として明示的に特徴量に組み込む、または歩行可能例だけの解析と全例解析を分けて報告するなどの設計が必要です。
失語・意識障害・重度認知障害・疲労・検査拒否などで MMSE や MoCA が欠測することがあります。欠測理由が認知機能や全身状態と関係するなら、単純削除は高機能例への偏りを生みます。脳卒中の退院時 FIM 予測などでは、入院時 FIM・年齢・発症から入院までの日数を補完モデルに含めると、MAR 仮定下で多重代入が機能しやすくなります。
状態が良くて来院しない患者と、状態が悪くて来院できない患者の両方がありえます。同じ「フォローアップ欠測」でも、理由が異なればアウトカムとの関係が逆転します。電子カルテ・死亡情報・紹介先情報・電話確認などを用いて欠測そのものを減らす努力と、MNAR シナリオでの感度分析(欠測例のアウトカムが悪い/良いと仮定したときの影響)を併用します。
Duchenne 型筋ジストロフィーの PUL 評価動画では、上肢挙上が困難な患者ほどタスクを完遂できず、姿勢推定が不安定になります。この欠測を単純に補間して滑らかにすると、「できなかった」という情報を消してしまいます。頭部 CT 画像でも、撮影されていない/DICOM 欠落/撮影条件差/アーチファクトでセグメンテーション失敗、といった技術的欠測と臨床的欠測が混在します。タスク不完遂・姿勢推定失敗・ランドマーク欠測を区別して扱うことで、実装時の問題を過小評価せずに済みます。
// 05 · THEORY欠測メカニズムと補完法の選択
MCAR・MAR・MNAR の定式化
観測値を Yobs、未観測値を Ymis、欠測を表すインジケータを R とすると、Rubin の分類は次のように書けます[2]。
MCAR: P(R | Y_obs, Y_mis) = P(R)
欠測が観測値にも未観測値にも依存しない
MAR: P(R | Y_obs, Y_mis) = P(R | Y_obs)
欠測は観測値だけで説明できる
→ 多重代入 (MI) の前提
MNAR: P(R | Y_obs, Y_mis) ≠ P(R | Y_obs)
欠測が未観測値そのものに依存する
→ 通常の補完では救えない・感度分析が必須
実データではどの仮定が成り立つか観測だけからは決まりません。重要なのは「どの仮定がもっとも妥当か」を臨床的根拠とともに記述し、複数仮定での感度分析を併記することです。
欠測処理の選択肢と長所・注意点
| 方法 | 概要 | 長所 | 注意点 |
|---|---|---|---|
| complete case 解析 | 欠測がある症例を除外 | 実装が簡単・手順が明確 | 症例数・イベント数減少。非ランダム欠測なら選択バイアス |
| 平均・中央値補完 | 変数の代表値で埋める | Pipeline に入れやすい | 分布を歪める。不確実性を無視する |
| 回帰・KNN 補完 | 他変数から欠測値を推定 | 変数間の関係を活用 | 補完モデルの仮定に依存・評価データで fit しないこと |
| 多重代入 (MI) | m 個の補完データを作り、結果を統合 (Rubin's rules) | MAR 下で有用・不確実性を反映 | 実装・報告が複雑・予測モデル展開で扱いが難しい |
| 欠測インジケータ | 欠測フラグを特徴量に追加 | 欠測自体が予後情報の場合に有用 | 施設運用を学習するショートカットの危険 |
| 欠測対応モデル | 木系モデルなどで欠測方向を学習 | 表データで実用的 | 欠測メカニズム検討は依然必要・外部施設で性能低下リスク |
complete case が抱える二つの問題
第一に、症例数とイベント数が減ることです。各変数の欠測が少しずつでも、全変数が揃った症例は大きく減ります。EPV 不足は 09·03 で扱った楽観バイアスを増幅します。第二に、解析集団の偏りです。歩行速度や握力は重症例で欠測しやすく、画像特徴量は撮影された患者だけに限定されやすいため、complete case 集団は元の臨床集団とずれます。残った集団は軽症寄りになり、外部適用性が落ちます。
多重代入の流れ
1. m 個の補完データ X^(1), ..., X^(m) を作る
(各補完は条件付き分布から異なる値をサンプル)
2. 各補完データでモデルをfit
→ β^(1), ..., β^(m) と Var(β^(k))
3. Rubin's rules で統合
β_bar = (1/m) Σ β^(k)
T = U_bar + (1 + 1/m) · B
U_bar = within-imputation 分散の平均
B = between-imputation 分散
多重代入は MAR を前提とし、補完モデルにアウトカムと欠測の予測子を含めることで一致推定量を得ます。予測モデル研究では R/mice や scikit-learn IterativeImputer がよく使われます。
アウトカム欠測
説明変数の欠測だけでなく、アウトカム欠測も大きな問題です。退院時 FIM が記録されない・退院後 6 か月の歩行能力が追跡できない・死亡や再入院情報が欠ける状況では、モデルが何を学習し何に適用されるかが揺らぎます。アウトカム欠測を除外するだけでは、追跡できた患者だけを対象にした研究になります。アウトカム欠測の補完は研究目的と仮定に強く依存するため、補完後の性能評価と不確実性の扱いを明示します。
// 06 · IMPLEMENTATION実装:Pipeline・欠測インジケータ・感度分析
機械学習で特に注意すべきは、欠測補完を train/test 分割や CV の前に全データで fit しないことです。中央値補完であっても、全データの中央値を使えば test set の分布情報が訓練側に入ります。影響が小さい場合もありますが、原則として避けます。
# ============================================================
# 欠測補完を含む scikit-learn Pipeline
# CV の各 fold 内で imputer が fit され、評価 fold は transform のみ
# ============================================================
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer, MissingIndicator
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, cross_validate
numeric_features = ["age", "fim_motor", "fim_cognitive",
"gait_speed_10m", "grip_strength"]
categorical_features = ["sex", "diagnosis_group", "ward"]
# 1) 連続値: 中央値補完 + 標準化 + 欠測インジケータ
numeric_pipe = Pipeline([
("union", FeatureUnion([
("impute", Pipeline([
("imp", SimpleImputer(strategy="median")),
("scl", StandardScaler()),
])),
("ind", MissingIndicator(features="all", error_on_new=False)),
])),
])
# 2) カテゴリ: 最頻値補完 + One-Hot
categorical_pipe = Pipeline([
("imp", SimpleImputer(strategy="most_frequent")),
("ohe", OneHotEncoder(handle_unknown="ignore")),
])
preprocess = ColumnTransformer([
("num", numeric_pipe, numeric_features),
("cat", categorical_pipe, categorical_features),
])
model = Pipeline([
("prep", preprocess),
("clf", LogisticRegression(max_iter=2000, class_weight="balanced")),
])
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_validate(
model, X, y, cv=cv,
scoring=["roc_auc", "average_precision", "neg_brier_score"],
return_train_score=False,
)
for k, v in scores.items():
if k.startswith("test_"):
print(f"{k:>22}: {v.mean():.3f} ± {v.std():.3f}")
# ============================================================
# 多重代入 (Iterative Imputer) を用いた予測モデル評価
# 各 fold 内で IterativeImputer を fit する点が CV 設計の要
# ============================================================
from sklearn.experimental import enable_iterative_imputer # noqa
from sklearn.impute import IterativeImputer
from sklearn.ensemble import GradientBoostingRegressor
iter_imputer = IterativeImputer(
estimator=GradientBoostingRegressor(max_depth=3, random_state=0),
max_iter=10, sample_posterior=False, random_state=0,
)
numeric_pipe_mi = Pipeline([
("imp", iter_imputer),
("scl", StandardScaler()),
])
# ... ColumnTransformer / model は同上の構造で組み立てる
# 補完器が CV 内で完結することを必ず確認する
# ============================================================
# 感度分析: complete case vs imputation vs missing indicator
# ============================================================
results = {}
# CC: 欠測を含む行を落とす
mask_cc = X.notna().all(axis=1)
cv_cc = cross_validate(model_no_imputer, X[mask_cc], y[mask_cc],
cv=cv, scoring="roc_auc")
results["complete_case"] = cv_cc["test_score"]
# IMP: median 補完
cv_imp = cross_validate(model_median, X, y, cv=cv, scoring="roc_auc")
results["median_imputation"] = cv_imp["test_score"]
# IND: 補完 + 欠測インジケータ
cv_ind = cross_validate(model_with_indicator, X, y, cv=cv, scoring="roc_auc")
results["imp_plus_indicator"] = cv_ind["test_score"]
# MI: 多重代入
cv_mi = cross_validate(model_iter_imp, X, y, cv=cv, scoring="roc_auc")
results["multiple_imputation"] = cv_mi["test_score"]
import pandas as pd
df = pd.DataFrame({k: pd.Series(v) for k, v in results.items()})
print(df.agg(["mean", "std"]).T)
# 結論が補完法で大きく変わるかを確認する
欠測インジケータの使いどころ
欠測そのものが臨床情報を持つ場合、欠測インジケータは予測に役立つことがあります。「歩行速度欠測」が歩行不能を、「認知検査欠測」が失語や意識障害を反映しているかもしれません。一方で、ある施設では重症例だけ画像検査があり、別の施設では全例にルーチン画像検査がある、というような場合、「画像あり」フラグは疾患重症度ではなく 施設運用 を学習している可能性があります。内部検証では高性能でも、外部施設で性能が崩れる典型的なショートカット学習です[3]。
StandardScaler や SimpleImputer を train_test_split の前に fit_transform しているコードは、欠測補完だけでなく標準化のスケールも leakage 経路になります。必ず Pipeline 化して CV の中で fit する こと。詳細は 09·02 データリーケージ と 14·03 リーケージデモ 参照。
感度分析の設計
欠測メカニズムは完全には検証できません。そのため、結論を強く言い切るのではなく、複数仮定で結論がどの程度変わるかを感度分析で示します。
| 感度分析 | 見るポイント | 解釈 |
|---|---|---|
| complete case vs 補完あり | 性能・係数・特徴量重要度・較正 | 大きく変わる場合、欠測処理が結論に影響 |
| 補完法の比較 | median / KNN / 多重代入で結論が安定するか | 最高性能だけ選ばず、頑健性を見る |
| 欠測インジケータ有/無 | 性能向上が臨床的に妥当か・施設依存ではないか | 外部検証や施設別解析で確認 |
| 高欠測変数を除外 | 欠測の多い変数を抜いても性能が保たれるか | 実装可能性と性能のバランスを評価 |
| MNAR シナリオ | 欠測例のアウトカムが悪い/良いと仮定した場合 | 欠測理由がアウトカムと関係する可能性 |
// 07 · MYTHS誤解と訂正
「欠測は平均で埋めれば実害はない」
分布が歪み、変数の分散が縮小し、変数間相関も弱まります。MAR/MNAR 下では系統的バイアスが残り、回帰係数・特徴量重要度も歪みます。少なくとも中央値補完+欠測インジケータ、可能なら多重代入を検討します。
「complete case は厳密で安全」
非ランダム欠測下では、残った集団が体系的に偏ります。「除外という処理」がそれ自体強い前処理であり、いかなる補完よりも結論を歪めることがあります。complete case 単独を主解析にする場合は、除外例と解析例の比較を必ず示します。
「XGBoost や LightGBM は欠測をそのまま扱えるから補完不要」
木系モデルは欠測方向を学習できますが、欠測メカニズムの臨床的検討を不要にはしません。学習データの欠測パターンに最適化されるため、外部施設で欠測パターンが変わると性能が落ちます。欠測理由を Methods に書く義務は変わりません。
「欠測インジケータを入れれば必ず性能が上がる」
性能が上がるときもありますが、その向上が 臨床的に意味のある情報を捉えているのか、施設運用や検査適応を捉えているのかは別問題です。外部施設で同じ欠測パターンが再現しなければ、ショートカット学習として性能が崩れます[3]。
// 08 · WRITING論文での書き方と査読対応
Methods に書くこと
- 各変数の欠測割合をどのように確認したか
- 欠測パターン(変数間共起・症例単位での欠測数)をどのように評価したか
- 採用した処理:complete case/単一補完/多重代入/欠測インジケータ
- 補完に使用した変数(アウトカムを含むか含まないかも明記)
- 補完器を訓練 fold 内で fit したか(全データで fit していないか)
- 多重代入を用いた場合:補完回数 m、収束診断、Rubin's rules による統合方法
- 感度分析の内容(complete case/補完法比較/欠測インジケータ有無/MNAR シナリオ)
Results に書くこと
- 各変数の欠測割合と症例単位での欠測数
- 解析対象と除外対象(complete case)の背景差
- 欠測処理ごとの性能指標・較正・主要結論の変化
- 補完後データの不自然な分布や外れ値の有無
Discussion に書くこと
- 欠測が非ランダムである可能性とその臨床的根拠
- 欠測が重症度・施設運用・フォローアップ体制を反映している可能性
- 外部施設で欠測パターンが変わった場合の性能低下リスク
- 欠測処理の限界と、今後のデータ収集改善策
「欠測値については、各変数の欠測割合と欠測パターンを確認した。連続変数は訓練データ内の中央値、カテゴリ変数は最頻値で補完し、欠測インジケータを特徴量に併用した。補完処理は cross-validation の各訓練 fold 内で fit し、評価 fold および test set には訓練 fold で学習した補完器を用いて変換のみを行った。感度分析として、complete case 解析・多重代入(m=20、IterativeImputer)・欠測インジケータ有無の比較を行い、ROC-AUC と calibration slope の変化を Supplementary Table S2 に示した。」
査読でよく問われる点
| 査読者の疑問 | 原稿で答えるべきこと |
|---|---|
| 欠測はどのくらいあるのか | 変数別・症例単位・アウトカム単位の欠測割合 |
| 欠測例は解析例と違うのか | 除外例と解析例の背景差・イベント率・アウトカム分布 |
| なぜその補完法を選んだのか | 欠測メカニズム・実装可能性・先行研究・感度分析に基づく説明 |
| 補完でリーケージしていないか | 補完器を訓練 fold 内で fit し、評価データには transform のみ行ったと明記 |
| 多重代入の不確実性を扱ったか | 補完回数 m、Rubin's rules、収束診断 |
| 外部施設で使えるのか | 欠測パターンの施設差、実装時に必須となる変数、欠測時の運用 |
// 09 · CHECKLIST投稿前チェックリスト
解析開始時・投稿前の双方で確認したい項目です。
- 01各変数の欠測割合を表にした
- 02アウトカム別・施設別・重症度別の欠測パターンを確認した
- 03欠測理由を臨床的に検討し、MCAR/MAR/MNAR の妥当性を議論した
- 04complete case 解析だけで結論を出していない
- 05除外例と解析例の背景差・イベント率を示した
- 06補完器を CV の訓練 fold 内で fit した(Pipeline 化)
- 07test set や外部検証データで補完器を fit していない
- 08欠測インジケータを入れる場合、臨床的意味を Methods に書いた
- 09補完あり/なしの感度分析を行った
- 10MNAR が疑われる場合、限界と感度分析を Discussion に書いた
- 11外部施設で欠測パターンが変わる可能性を検討した
- 12Methods / Results / Discussion に欠測の扱いを分けて記載した
// 10 · QUIZミニクイズ
-
Q1歩けないため 10 m 歩行速度が測定できない欠測は、どの考え方に近いですか?
- 完全にランダムな欠測(MCAR)
- 重症度や未観測の歩行能力と関係する欠測(MNAR 寄り)
- モデル性能と無関係な欠測
- 必ず平均補完で解決できる欠測
SHOW ANSWER
B. 歩行速度が測れない理由そのものが、未観測の歩行能力(=アウトカムに直結する重症度)と関係します。単純削除すると歩ける患者に偏る可能性が高く、MNAR シナリオを意識した感度分析が必要です。 -
Q2cross-validation で欠測補完を行う正しい位置はどこですか?
- CV の前に全データで補完器を fit する
- 各訓練 fold 内で補完器を fit し、評価 fold には transform のみ行う
- test set で fit した補完器を訓練データにも使う
- 目的変数を見ながら手作業で埋める
SHOW ANSWER
B. 補完器も学習工程の一部です。評価データの分布情報を使って fit すると、リーケージに近い問題が起きます。scikit-learn の Pipeline + ColumnTransformer で構造を強制できます。 -
Q3complete case 解析の主な問題として最も適切なのはどれですか?
- 常に AUC が低くなることだけが問題
- 症例数が減るだけで、バイアスは生じない
- 欠測例が系統的に異なると、解析対象が元集団からずれて選択バイアスが生じる
- 補完より必ず正確である
SHOW ANSWER
C. 症例数・イベント数の減少(EPV 低下)に加えて、残った集団が軽症例などに偏り、外部適用性が下がる選択バイアスが主な問題です。 -
Q4欠測インジケータを入れる場合の注意点はどれですか?
- 欠測フラグは常に因果的な予後因子である
- 施設運用や測定プロトコルを学習するショートカットになることがある
- 外部検証では必ず性能が上がる
- 欠測理由を説明する必要はない
SHOW ANSWER
B. 欠測フラグは臨床情報を持つこともありますが、施設差や診療フローを拾うこともあります。外部検証で欠測パターンが変わると性能が崩れる典型的なショートカット学習の経路です。
// 11 · FAQよくある質問
- complete case 解析はやってはいけませんか?
- 主解析として単独で使うことは推奨されません。欠測例が体系的に異なると、解析対象が元の臨床集団とずれる選択バイアスが入ります。complete case 解析を行う場合は、除外例と解析例の背景差・イベント率・アウトカム分布を必ず示し、補完あり解析との比較を感度分析として併記します。
- 中央値補完と多重代入のどちらを使うべきですか?
- 研究目的と欠測割合・メカニズムで使い分けます。予測モデル開発で実装可能性を重視するなら、Pipeline に組み込めるシンプルな中央値補完が現実的です。一方、回帰係数の不確実性まで含めて推論したい場合や欠測割合が高い場合は、多重代入が適しています。どちらを採用しても、補完器を CV の訓練 fold 内でだけ fit するルールは変わりません。
- 欠測インジケータは入れるべきですか?
- 欠測そのものが臨床情報を持つ場合は有用です(例:歩行速度欠測 = 歩行不能)。一方で、施設運用や検査適応の差を学習するショートカットになる危険があります。入れる場合は臨床的意味を Methods に明記し、外部検証で欠測パターンが変わったときの性能低下リスクを Limitations に書きます。
// REF参考文献
- Gravesteijn BY, Sewalt CA, Venema E, Nieboer D, Steyerberg EW. Missing Data in Prediction Research: A Five-Step Approach for Multiple Imputation, Illustrated in the CENTER-TBI Study. Journal of Neurotrauma 2021;38:1842–1857. — PDF
- Carpenter JR, Smuk M. Missing data: a statistical framework for practice. Biometrical Journal 2021;63:915–947. — link
- Sisk R, Lin L, Sperrin M, Martin GP. Imputation and missing indicators for handling missing data in the development and deployment of clinical prediction models: A simulation study. Statistical Methods in Medical Research 2023. — link
- Collins GS, Moons KGM, Dhiman P, Riley RD, Beam AL, Van Calster B, et al. TRIPOD+AI statement: updated guidance for reporting clinical prediction models that use regression or machine learning methods. BMJ 2024;385:e078378. — doi
- Moons KGM, Wolff RF, Riley RD, et al. PROBAST+AI: an updated quality, risk of bias, and applicability assessment tool for prediction models using regression or artificial intelligence methods. BMJ 2025;388:e082505. — doi
- Steyerberg EW. Clinical Prediction Models: A Practical Approach to Development, Validation, and Updating. 2nd ed. Springer; 2019.
- van Buuren S. Flexible Imputation of Missing Data. 2nd ed. Chapman & Hall/CRC; 2018. — online