給臨床醫師的實戰指南
Causal Inference from Observational Studies: A Practical Guide for Clinicians
和信治癌中心醫院腫瘤內科部
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
觀察性研究的因果推論:給臨床醫師的實戰指南
Causal Inference from Observational Studies: A Practical Guide for Clinicians
| 階段 | 內容 | 重點 |
|---|---|---|
| 1-2 | 問題與設計 | 為什麼需要?怎麼設計? |
| 3-4 | 方法概念 | PS → IPW → 雙重穩健 → TMLE |
| 5-6 | 準備工作 | 選方法、備資料 |
| 7 | R 實作 | 程式碼示範 |
| 8-9 | 驗證報告 | E-value、論文寫作 |
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
某醫學中心回顧性研究報告
「新藥 DrugX 顯著提升晚期癌症病人存活率」
| 組別 | 人數 | 一年存活率 | p-value |
|---|---|---|---|
| 新藥組 | 500 | 70% | |
| 傳統治療 | 500 | 50% | < 0.001 |
統計顯著、效果量大、樣本數夠…
可以發 paper 了嗎?
新藥組
傳統治療組
😱 兩組根本不一樣!
觀察:整體看起來新藥好很多,但分層後差異變小!
觀察到的差異 ≠ 因果效應
因果推論的核心問題:我們想知道「?」是什麼,但永遠無法直接觀察
倘若那天
把該說的話好好說 該體諒的不執著
如果那天我 不受情緒挑撥 你會怎麼做
那麼多如果 可能如果我
可惜沒如果 ( Counterfact ) 只剩下結果 (Outcome)
| 觀察到的關聯 | 真正的原因 |
|---|---|
| 🍦 冰淇淋銷量 ↑ → 溺水死亡 ↑ | 夏天(天氣熱) |
| 🏥 住院病人死亡率 > 在家 | 病重才住院 |
| 👟 鞋子尺寸大 → 閱讀能力強 | 年齡(小孩長大) |
| 🌡️ 黃色手指 → 肺癌風險 ↑ | 抽菸 |
這些都是「混淆」造成的假象!
是「治療 → 結果」,還是「某因素 → 治療 & 結果」?
想一想你自己的研究
把這些因素寫下來,等一下我們會用 DAG 來整理它們
下一步:那要怎麼設計研究,才能回答因果問題呢?
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
在開始分析之前,你需要先想清楚:
| 承接 | 本章目標 | 下一步 |
|---|---|---|
| 你已知道「混淆」讓結果不可信 | 把問題寫成 Target Trial,用 DAG 分清變數角色 | 學會用方法處理混淆(PS / IPW) |
核心概念:「如果能做 RCT,你會怎麼設計?」
用觀察性資料模擬那個理想試驗
“If you can’t describe the trial you’re trying to emulate, you probably shouldn’t be doing the analysis.” — Miguel Hernán
| 步驟 | RCT | Target Trial Emulation |
|---|---|---|
| 定義資格條件 | Protocol 寫好 | 你要自己定義 |
| 治療分配 | 隨機 | 觀察(需調整混淆) |
| Time zero | 隨機分配時 | 你要明確定義 |
| 追蹤 | Protocol 規定 | 資料庫限制 |
| 分析 | ITT / Per-protocol | 模擬 ITT / Per-protocol |
關鍵差異:RCT 的隨機化幫你處理混淆,觀察性研究要自己處理
研究問題:Statin 是否降低心血管死亡?
理想的 RCT
用健保資料模擬
| 要素 | 你要定義的 |
|---|---|
| 資格條件 | 誰可以納入? |
| 治療策略 | 新藥 vs 什麼? |
| 治療分配 | 病人如何被分組(觀察性) |
| 追蹤起點 | Time zero 是什麼時候? |
| 結果 | 主要 outcome |
| 追蹤期間 | 追多久? |
| 因果對比 | 要估計什麼?ATE? |
把臨床語言轉成分析語言,後面寫程式會更順:
| 符號 | 對應 | 臨床例子 |
|---|---|---|
Y |
結果 | 死亡、住院、血壓變化 |
A |
治療 | 新藥 vs 標準治療 |
W |
混淆因子 | 年齡、共病、嚴重度 |
一句話:先定好 Y/A/W,你就知道要叫 AI 做什麼。
延伸:每次下 prompt 都用 資料 → 角色 → 方法 → 估計量 → 診斷 → 解讀 的 6 要素架構。
不死時間偏差
病人必須「活到某時間點」才被歸類為治療組,導致治療組看起來比較好
錯誤設計
正確做法
三種變數:
關鍵:用 DAG 想清楚變數之間的關係,再決定調整什麼
試著為你的研究畫 DAG
工具:可以用紙筆,或用 DAGitty 線上畫
下一步:設計好了,那具體要用什麼統計方法呢?
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
現在我們知道要調整混淆因子,但怎麼調整?
| 承接 | 本章目標 | 下一步 |
|---|---|---|
| 你已定義研究問題與變數角色 | 理解 PS/IPW 如何讓兩組可比 | 學雙重穩健與 TMLE |
白話:「根據病人特徵,預測他接受治療的機率」
用途:讓兩組變得可比較
核心:PS 把多個共變量壓縮成一個分數,代表「這個人被治療的機率」
重疊區域:兩組可比較的範圍
| 方法 | 做法 | 風險 |
|---|---|---|
| 單純迴歸調整 | 把混淆因子丟進模型 | 模型設錯就完了 |
| PS matching | 用 PS 配對 | 丟掉很多樣本 |
| PS weighting (IPW) | 用 PS 加權 | 極端權重不穩定 |
名詞解釋
IPW 的問題
當 PS 接近 0 或 1 時:
實際情況
幾百例的臨床資料:
IPW 可以當敏感度分析,但不建議當主分析
問題:少數極端權重的人,主導了整個估計結果!
我們學到什麼?
下一步:有沒有更穩健的方法? → 雙重穩健估計
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
基礎方法(PS、IPW)有其限制,現在來學更穩健的方法:
| 承接 | 本章目標 | 下一步 |
|---|---|---|
| 你已了解 PS/IPW 的優點與限制 | 掌握雙重穩健、TMLE、Super Learner | 依 outcome/estimand 選方法與套件 |
什麼是「雙重穩健」(Doubly Robust)?
同時用兩個模型來估計因果效應,只要其中一個模型正確,結果就不會有偏誤。就像買兩份保險!
名詞解釋
共同點
TMLE 優勢
實務上:選 TMLE 就對了
關鍵優勢:只有當「兩個模型都錯」時才會有偏誤 → 大大降低風險
雙重穩健的前提
「至少一個模型要對」— 但我們怎麼確保?
傳統做法
問題
解法:讓資料自己決定用哪個模型 → Super Learner
什麼是 Super Learner?
一種「模型組合」技術:同時跑多個機器學習模型,用交叉驗證找出最佳加權組合。
白話總結
Super Learner 就像「模型評審團」:讓多個模型各自預測,然後根據表現分配權重。你不用煩惱該選哪個模型,讓資料說話!
小樣本原則
庫要小且保守,不要追求複雜!
推薦的候選模型
SL.glm:標準 logistic/線性SL.glmnet:正則化(ridge/lasso)SL.gam:平滑非線性SL.ranger:(事件數夠才加)小樣本要避免
| 情境 | 事件數 | 推薦的庫 |
|---|---|---|
| 罕見疾病 RCT | 30-50 | SL.glm, SL.glmnet |
| 一般臨床研究 | 50-200 | SL.glm, SL.glmnet, SL.gam |
| 大型健保資料庫 | 500+ | 上述 + SL.ranger, SL.xgboost |
| 超大資料 | 5000+ | 可加更多彈性模型 |
經驗法則
事件數 ÷ 10 ≈ 可用的候選模型數上限
問題
Super Learner 用了彈性的機器學習模型,但這會帶來一個統計問題…
傳統迴歸
機器學習模型
白話說:模型「記住」了資料的噪音,導致我們對效果估計過度自信
問題
PS 太接近 0 或 1 時,權重會爆炸
解法:把 PS 限制在合理範圍
重要提醒
截斷範圍要預先宣告,不要事後調參(避免 p-hacking 嫌疑)
到目前為止,我們學了:
| 概念 | 重點 |
|---|---|
| 傾向分數 (PS) | 預測接受治療的機率,讓兩組可比 |
| 雙重穩健 | 兩個模型,錯一個也沒關係 |
| TMLE | 最推薦的雙重穩健方法 |
| Super Learner | 自動選最佳模型組合 |
下一步:不同類型的結果變數,要用什麼方法?
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
你的研究結果是什麼類型?
不同類型 → 不同方法 → 不同 R 套件
| 承接 | 本章目標 | 下一步 |
|---|---|---|
| 你已掌握 TMLE / Super Learner 的概念 | 依 outcome 與 estimand 做方法選擇 | 準備資料與品質檢查 |
| Outcome 類型 | 範例 | 估計什麼 | R 套件 |
|---|---|---|---|
| 連續 | 血壓、HbA1c | 平均差 | tmle |
| 二元 | 死亡 Y/N | Risk Diff / RR | tmle |
| 存活 | 死亡時間 | Survival diff | survtmle |
| 計數 | 住院次數 | Rate Ratio | WeightIt |
| 重複測量 | 多時間點追蹤 | 軌跡差異 | geepack |
名詞解釋
ATE(全體平均效果)
ATT(已治療者效果)
幾百例的臨床資料,優先考慮 ATT,除非重疊非常好
你的研究設定
根據剛才學的,確認一下:
tmle / survtmle / 其他下一步:方法選好了,資料要怎麼準備?
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
在跑分析之前,資料要先整理好:
| 承接 | 本章目標 | 下一步 |
|---|---|---|
| 你已選好方法與 estimand | 把資料整理成可分析的格式並完成品質檢查 | 把整個流程用 R 跑一次 |
你的 Excel 可能長這樣:
| id | 治療 | 年齡 | 性別 | ECOG | 共病數 | 追蹤時間 | 事件 | 備註 |
|---|---|---|---|---|---|---|---|---|
| 001 | 新藥 | 58 | 男 | 1 | 2 | 365 | 1 | |
| 002 | 標準 | 62 | 女 | 0 | 1 | 420 | 0 | 轉院 |
| 003 | 新藥 | 71 | 男 | 2 | 3 | 180 | 1 | |
| 004 | 標準 | 55 | 女 | 1 | 730 | 0 | 共病數遺漏 | |
| 005 | 新藥 | 67 | 男 | 1 | 2 | 90 | 1 | 提早退出 |
| … | … | … | … | … | … | … | … | … |
要注意:每一列是一個病人、每一欄是一個變數、遺漏值要標示清楚
觀察到什麼?
陷阱
在跑任何分析之前,先做這三件事:
常見錯誤
直接刪除有缺失的個案(listwise deletion),假裝沒事
| 缺失機制 | 意思 | 處理方式 |
|---|---|---|
| MCAR | 完全隨機缺失 | 刪除還可以(但浪費資料) |
| MAR | 可觀察變數可解釋 | 多重插補 (Multiple Imputation) |
| MNAR | 缺失本身有意義 | 敏感度分析 |
建議:用 mice 套件做多重插補,在每套插補資料內分析再合併
| 方法 | 說明 | 適用情境 |
|---|---|---|
| 改估 ATT | 只估計「治療組」的平均效果 | 對照組有很多極端 PS |
| Trimming | 排除 PS < 0.1 或 > 0.9 的個案 | 兩端都有極端值 |
| Overlap weights | 給重疊區域較高權重 | 想保留所有樣本 |
實務建議
經驗法則
二元結局時,事件數 < 50 會讓任何高自由度模型都很不穩定
| 事件數 | 建議 |
|---|---|
| < 30 | 極度保守:只調整 2-3 個最重要混淆因子 |
| 30-50 | 保守:用正則化模型、減少變數 |
| 50-100 | 標準分析可行,但 Super Learner 庫要小 |
| > 100 | 可以用較彈性的模型 |
| 問題 | 解法 |
|---|---|
| 遺漏值 | Multiple imputation(先處理) |
| 混淆因子放錯時間點 | 只能用 baseline 的 |
| Time zero 不明確 | 仔細定義追蹤起點 |
| 治療定義模糊 | 明確定義什麼算「接受治療」 |
| 重疊不佳 | 改 ATT、trimming、或限制分析範圍 |
| 事件數太少 | 減少調整變數、用正則化 |
下一步:資料準備好了,來看實際的 R 程式碼!
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
如果你已經會 R
可以跳過這一段,直接進入實作!
這一段會快速介紹:
| 承接 | 本章目標 | 下一步 |
|---|---|---|
| 你已完成方法選擇與資料準備 | 補足 R 基礎,確保能跟上實作 | 用一致的 6 要素架構跑完整分析 |
建議
Positron 是現代寫 R 最方便的介面,強烈建議使用
提示:安裝可能需要幾分鐘,請耐心等待
白話說:|> 就是「然後」的意思,把左邊的結果傳給右邊
| 套件 | 用途 |
|---|---|
tmle |
TMLE 估計(連續/二元結果) |
survtmle |
TMLE 估計(存活結果) |
SuperLearner |
模型組合 |
cobalt |
平衡診斷 |
WeightIt |
計算傾向分數權重 |
ggplot2 |
畫圖 |
準備好了?讓我們開始實作!
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
終於要寫 code 了!這一節會示範:
tmle 套件tmle 套件survtmle 套件| 承接 | 本章目標 | 下一步 |
|---|---|---|
| 你已準備好資料與 R 基礎 | 用 6 要素架構把分析跑完整 | 檢驗未測量混淆(敏感度分析) |
每次請 AI 寫程式,先把這 6 件事講清楚:
Y(結果)、A(治療)、W(混淆因子)資料在
data/xxx.csv,共有 N 筆。
Y是 ______(連續/二元/存活),A是 ______,W包含 ______。
請用 ______ 方法估計 ______(ATE/RD/RR/HR),並回報:
1) 主要估計值與 95% CI
2) 平衡診斷(SMD < 0.1)
3) 權重診斷(最大權重、有效樣本量)
最後用一句話解讀臨床意義。
口訣:資料 → 角色 → 方法 → 估計量 → 診斷 → 解讀
從資料到結論:每一步都要檢查,不是跑完程式就結束!
| 要素 | 這個例子 |
|---|---|
| 資料 | data/09_r-workflow/df_continuous.csv |
| 角色 | Y=血壓變化(連續),A=treatment,W=年齡/性別/共病/嚴重度 |
| 方法 | TMLE |
| 估計量 | ATE |
| 診斷 | SMD、PS 重疊、權重、ESS |
| 輸出 | 估計值+95% CI + 一句臨床解讀 |
請 AI 幫你完成這段分析,你可以這樣說:
「請讀取
data/09_r-workflow/df_continuous.csv,這是一個降血壓藥物的觀察性研究資料。治療變數是treatment,結果是outcome(血壓變化,mmHg),混淆因子有age,sex,comorbidity,severity。請用 TMLE 方法估計平均治療效果(ATE),並使用 Super Learner 組合 GLM 和 GLMNet 模型。」
資料在
data/09_r-workflow/df_continuous.csv,共有 N 筆。
Y是 ______(連續),A是 ______,W包含 ______。
請用 TMLE 估計 ATE,並回報估計值+95% CI、SMD、PS 重疊、最大權重、有效樣本量。
最後用一句話解讀臨床意義。
library(tmle)
library(SuperLearner)
SL.lib <- c("SL.glm", "SL.glmnet")
df <- read.csv("data/09_r-workflow/df_continuous.csv")
fit_cont <- tmle(
Y = df$outcome,
A = df$treatment,
W = df %>% select(age, sex, comorbidity, severity),
Q.SL.library = SL.lib,
g.SL.library = SL.lib,
family = "gaussian"
)
fit_cont$estimates$ATE載入 tmle 和 SuperLearner 套件,這是雙重穩健估計的核心工具。
定義 Super Learner 的候選模型庫:GLM(線性)+ GLMNet(正則化)。小樣本建議保守設定。
執行 TMLE:Y 是結果、A 是治療、W 是混淆因子。Q.SL.library 用於結果模型,g.SL.library 用於 PS 模型。
提取 ATE 估計值,包含點估計和 95% 信賴區間。
句型:治療組相較對照組,平均「血壓變化」差異為 ___ mmHg(95% CI ___ 到 );臨床上表示 ___。
解讀:治療組平均血壓下降比對照組多約 5.2 mmHg
請 AI 幫你完成這段分析,你可以這樣說:
「請讀取
data/09_r-workflow/df_binary.csv,這是一個癌症治療的觀察性研究資料。治療變數是treatment,結果是death(0/1),混淆因子有age,sex,comorbidity,severity。請用 TMLE 方法估計 Risk Difference 和 Risk Ratio。」
| 要素 | 這個例子 |
|---|---|
| 資料 | data/09_r-workflow/df_binary.csv |
| 角色 | Y=death(二元),A=treatment,W=年齡/性別/共病/嚴重度 |
| 方法 | TMLE |
| 估計量 | RD, RR |
| 診斷 | SMD、PS 重疊、權重、ESS |
| 輸出 | RD/RR + 95% CI + 一句臨床解讀 |
資料在
data/09_r-workflow/df_binary.csv,共有 N 筆。
Y是 ______(二元),A是 ______,W包含 ______。
請用 TMLE 估計 RD 與 RR,並回報估計值+95% CI、SMD、PS 重疊、最大權重、有效樣本量。
最後用一句話解讀臨床意義。
二元結果只需改兩處:Y 改成 0/1 變數(如死亡),family 改成 "binomial"。
二元結果可以提取 Risk Difference(風險差)和 Risk Ratio(相對風險)兩種 estimand。
句型:治療組相較對照組,死亡風險差為 (95% CI 到 ),相對風險為 ;臨床上表示 ______。
解讀:治療降低死亡風險約 8.5%(RD = -0.085)
請 AI 幫你完成這段分析,你可以這樣說:
「請讀取
data/09_r-workflow/df_survival.csv,這是一個存活分析資料。治療變數是treatment,追蹤時間是time,事件指標是event(1=死亡,0=設限),混淆因子有age,sex,comorbidity,severity。請用 IPW 加權的 Cox 迴歸估計 Hazard Ratio。」
| 要素 | 這個例子 |
|---|---|
| 資料 | data/09_r-workflow/df_survival.csv |
| 角色 | Y=Surv(time, event),A=treatment,W=年齡/性別/共病/嚴重度 |
| 方法 | IPW + Cox(或 survtmle) |
| 估計量 | HR |
| 診斷 | SMD、PS 重疊、權重、ESS |
| 輸出 | HR + 95% CI + 一句臨床解讀 |
資料在
data/09_r-workflow/df_survival.csv,共有 N 筆。
Y是Surv(time, event),A是 ______,W包含 ______。
請用 IPW + Cox 估計 HR,並回報估計值+95% CI、SMD、PS 重疊、最大權重、有效樣本量。
最後用一句話解讀臨床意義。
存活分析需要專用的 survtmle 套件。
ftime 是追蹤時間、ftype 是事件指標(1=事件,0=設限)、trt 是治療變數。
adjustVars 放混淆因子,t0 指定要估計的時間點(如 365 天)。
三個 Super Learner 庫分別用於:事件時間模型、設限時間模型、治療模型。
使用 survival 做存活分析,WeightIt 計算傾向分數權重。
用 weightit() 估計 PS 並計算 IPW 權重。
將權重帶入 coxph(),估計加權後的 Hazard Ratio。
句型:加權後 HR 為 (95% CI 到 ),表示治療組的死亡風險約為對照組的 %;臨床上表示 ______。
解讀:加權後 HR = 0.72,表示治療組的死亡風險是對照組的 72%
請 AI 幫你完成這段分析,你可以這樣說:
「我已經用
WeightIt計算了傾向分數權重。請用cobalt套件幫我檢查平衡:(1) 用bal.tab()列出所有變數的 SMD,閾值設 0.1;(2) 用love.plot()畫出加權前後的 SMD 比較圖。」
| 要素 | 這個例子 |
|---|---|
| 資料 | 已有加權物件 w |
| 角色 | A=treatment,W=欲平衡的共變數 |
| 方法 | cobalt::bal.tab, love.plot |
| 估計量 | SMD、Love Plot |
| 診斷 | 閾值 0.1、極端權重 |
| 輸出 | SMD 表 + Love Plot + 一句解讀 |
我已經計算好權重物件
w。
請用cobalt顯示 SMD 表(閾值 0.1)並畫 Love Plot;同時回報最大權重與有效樣本量。
最後用一句話說明平衡是否足夠。
cobalt 用於平衡診斷,WeightIt 用於計算傾向分數權重。
用 weightit() 計算權重:公式指定混淆因子,method = "ps" 使用 logistic regression 估計 PS。
bal.tab() 檢查 SMD,設定閾值 0.1,超過表示平衡不佳。
love.plot() 畫出 Love Plot,視覺化加權前後的 SMD 變化。
句型:加權後 SMD 皆 < 0.1(或指出未通過變數),表示兩組基線大致平衡/仍需調整 ______。
怎麼看這張表?
怎麼看 Love Plot?
目標:加權後所有 SMD < 0.1
為什麼要檢查權重?
極端權重 = 少數人主導估計 = 結果不可信
原始樣本量:500 人
加權後有效樣本量:
\[ n_{eff} = \frac{(\sum w_i)^2}{\sum w_i^2} \]
解讀
有效樣本量掉到原始的 50% 以下,要小心解讀結果
| 診斷項目 | 目標 | R 函數 |
|---|---|---|
| SMD | 全部 < 0.1 | cobalt::bal.tab() |
| PS 重疊 | 充分重疊 | 密度圖 |
| 最大權重 | 不要太極端 | max(weights) |
| 有效樣本量 | 不要掉太多 | 公式計算 |
報告時務必呈現這四項!
完成分析後,你應該有:
| 項目 | 確認 |
|---|---|
| TMLE 估計值 | ✅ ATE 和 95% CI |
| 平衡診斷 | ✅ SMD < 0.1 |
| PS 重疊 | ✅ 兩組有足夠重疊 |
但是…就算一切都做對了,還有一個問題:未測量的混淆因子
你的分析有沒有漏掉這些?
在進入敏感度分析之前,確認:
如果有任何一項不通過,回去檢查資料或模型!
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
你可能會問:「如果有我沒測量到的混淆因子怎麼辦?」
這就是為什麼我們需要 敏感度分析!
| 承接 | 本章目標 | 下一步 |
|---|---|---|
| 你已完成主要估計與診斷 | 量化未測量混淆的影響 | 把結果寫成論文 |
什麼是 E-value?
E-value 告訴你:「需要多強的未測量混淆因子,才能讓你的結果變成沒有效果」。數字越大,結果越穩健。
E-value = 2.5 表示:
實心點 = E-value(點估計),空心點 = E-value(信賴區間下界)
下一步:怎麼把這些結果寫成論文?
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
分析做完了,怎麼寫進論文?
| 承接 | 本章目標 | 下一步 |
|---|---|---|
| 你已完成主分析與敏感度分析 | 把分析轉成可投稿的 Methods/Results | 總結與行動清單 |
We estimated the average treatment effect using targeted maximum likelihood estimation (TMLE) with Super Learner for both propensity score and outcome models. The ensemble included logistic regression, random forest, and gradient boosting. Covariate balance was assessed using standardized mean differences (threshold < 0.1). Sensitivity to unmeasured confounding was evaluated using E-values.
| 圖表 | 內容 |
|---|---|
| Table 1 | Baseline characteristics(原始 + 加權後) |
| Figure 1 | PS overlap plot |
| Figure 2 | Love plot(SMD 平衡圖) |
| Figure 3 | 結果圖(forest plot / KM curve) |
| Table 2 | 主結果 + 95% CI + E-value |
The estimated risk difference was −5.2% (95% CI: −8.1% to −2.3%, p = 0.001), indicating the new drug reduced mortality by approximately 5 percentage points. All standardized mean differences were below 0.1 after weighting. The E-value was 2.8, suggesting that substantial unmeasured confounding would be required to explain away the observed effect.
Agenda
引言
第一部分:為什麼需要因果推論?
第二部分:研究設計思維
第三部分:方法概念(上)基礎篇
第四部分:方法概念(下)進階篇
第五部分:情境選擇菜單
第六部分:資料準備
R 快速入門
第七部分:R 實作示範
第八部分:敏感度分析
第九部分:結果報告
總結
| 承接 | 本章目標 | 下一步 |
|---|---|---|
| 你已會報告 Methods/Results | 總結重點,給出可直接執行的清單 | 帶回臨床決策的實務原則 |
幾百例臨床資料的優先順序
穩定性 > 可估性 > 模型華麗程度
做 2-3 個替代分析,確認結果穩定:
| 項目 | 替代設定 |
|---|---|
| PS 模型 | 簡單(線性)vs 彈性(GAM/正則化) |
| 截斷範圍 | 0.01/0.99 vs 0.05/0.95 |
| 方法 | TMLE vs AIPW vs Matching |
| Estimand | ATE vs ATT |
如果結論只在某特定設定成立,必須在討論中承認
可以照抄的 checklist
| 類型 | 方法 |
|---|---|
| 連續 | tmle(..., gaussian) |
| 二元 | tmle(..., binomial) |
| 存活 | survtmle() |
| 計數 | IPW + Poisson |
| 問題 | 回答 |
|---|---|
| 樣本數要多少? | 沒有絕對標準,但每組 > 100 較穩定 |
| 混淆因子要放幾個? | 根據 DAG 決定,不是越多越好 |
| Reviewer 不熟 TMLE? | 附 PS matching 當 sensitivity analysis |
| PS 重疊很差怎麼辦? | 考慮 trimming 或 overlap weights |
tlverse 教學網站