進階報告規範: STROBE已經雙重審閱,尚未人工抽查

世代研究

前瞻與回溯的差別到底在哪、為什麼「觀察到的關聯」不等於「治療的效果」、以及一個未達統計顯著的結果該怎麼寫才不會騙到自己。

世代研究在做什麼

挑一群還沒有發生目標事件的人,記錄他們的暴露狀態,然後往前追蹤,看誰發生了事件。

這個「從暴露走向結果」的方向是世代研究的定義特徵,也是它與病例對照研究的分野 (後者從結果回頭找暴露)。方向決定了它能算什麼:因為兩個分母——有多少人被追蹤、追了多久——都是知道的, 世代研究可以直接估發生率(incidence),病例對照不行。

兩種分母,兩種發生率

「發生率」不是一個量,是兩個。論文常常在兩者之間滑來滑去,而差別正好就在用了哪一個分母。

累積發生率(cumulative incidence,也叫風險)是發生事件的人數除以被追蹤的人數。 它是一個比例,不會超過 1,而且不附上時間長度就無法解讀:下面那張表報的 16.1%,要跟旁邊那一列的追蹤時間中位數合起來看才有意義。 本頁那張曲線圖用的就是這個尺度——它的 y 軸是累積發生率。

發生率(incidence rate)是事件數除以人時(person-time)——每個人實際被觀察的時間, 全部加總起來。單位是「每人年」或「每千人年」,沒有 1 這個上限,也不需要指定觀察期, 因為追蹤有多長已經寫在分母裡了。

只要每個人被追蹤的時間長短不一,兩者就會分開——而這幾乎是常態。如果有些人追了一年就失聯、 有些人追了十年,用人數當分母等於認定這兩群人有同樣的機會發生事件,用人時當分母則不會。所以:

  • 追蹤窗口固定、失聯又少時,累積發生率才是直接回答臨床問題的那個量—— 「這件事在五年內發生在我身上的機率是多少」。
  • 進入時間錯開、設限很多、或追蹤很長時,發生率才是誠實的摘要。模型也建立在它上面: Poisson 迴歸把人時明確放進分母, 而 Kaplan-Meier 與 Cox 是用「每個時點還有誰在風險集合裡」處理同一個問題—— 這也是為什麼曲線下面那張 number-at-risk 表跟曲線本身一樣重要。
  • 無論用哪一個,報發生率而不說分母是什麼,就是讀者失去驗算能力的那一刻。

前瞻與回溯:差別不在時間,在資料的品質

這是最常被搞混的一組詞。兩者的追蹤方向都是從暴露到結果——差別在於研究者決定要做這個研究時, 事件是否已經發生。

前瞻性(prospective)回溯性(retrospective)
研究開始時,結果發生了嗎還沒已經發生
暴露怎麼測研究者為這個研究設計並收集用既有紀錄(病歷、健保資料庫、登錄檔)
追蹤方向暴露 → 結果暴露 → 結果(一樣)
主要弱點貴、慢、失聯暴露測量受限於別人為別的目的留下的紀錄

還有一個常見的誤稱:「回溯性分析」(retrospective analysis)指的是分析時機,不是研究設計。 一個前瞻性收案的世代,事後拿去回答當初沒打算問的問題,那是回溯性分析,但它仍然是前瞻性世代。

這一章的例子

用一份真的觀察性資料走一遍:接受根除性前列腺切除術的病人,暴露是輸血用紅血球的儲存時間長短, 結果是生化復發。臨床上的疑問是儲存較久的紅血球會不會影響腫瘤預後。

library(medicaldata)
library(survival)
data(blood_storage, package = "medicaldata")

d <- blood_storage
# 原始資料把儲存時間分成三組;本例比較「長」與「短/中」
d$exposure <- factor(
  ifelse(d$RBC.Age.Group == 3, "Long storage", "Short/medium storage"),
  levels = c("Short/medium storage", "Long storage")
)

# 完整個案分析——掉了幾列一定要報出來
vars <- c("TimeToRecurrence", "Recurrence", "exposure",
          "Age", "PVol", "PreopPSA", "TVol")
complete <- d[complete.cases(d[, vars]), ]

# 未校正
coxph(Surv(TimeToRecurrence, Recurrence) ~ exposure, data = complete)

# 校正已測量到的干擾因子
coxph(Surv(TimeToRecurrence, Recurrence) ~ exposure + Age + PVol +
        PreopPSA + factor(TVol), data = complete)

驗證環境:R 4.6.0 + survival 3.8.6 + medicaldata 0.2.0

依紅血球儲存時間分組的生化復發累積發生率曲線,橫軸 0 到 100 個月、縱軸 0 到 0.5。兩組曲線大致重疊,信賴區間全程互相重疊。曲線下方附風險人數表,兩組在第 0、20、40、60、80、100 個月的人數分別是:短/中儲存 196、107、71、35、20、2;長儲存 103、62、41、23、9、2。第 100 個月時短/中儲存組剩 2 人、長儲存組剩 2 人,曲線右端那一段幾乎沒有分母。
依輸血紅血球儲存時間分組的累積發生率。注意 y 軸是累積發生率(1 − 存活),不是存活率——世代研究關心的是「多少人發生了」。下方的風險人數表是曲線的分母:到第 80 個月只剩 20 與 9 人,到第 100 個月更只剩 2 與 2 人,那一段的高低不要當真。產圖腳本 figures/scripts/D1-cohort-blood-storage.R

第一步:誰進了分析,誰沒有

人數
資料集總人數316
因變項有缺失而排除17
進入分析299
發生生化復發48(16.1%)
長儲存組 / 短中儲存組103 / 196
中位追蹤時間(reverse KM)35.4 個月

排除了 17 人看起來不多,但完整個案分析不是中性的預設,它是一個帶假設的選擇。 一句「資料是隨機缺失的」不足以概括那個假設:完整個案分析要對目標估計量有效,需要缺失機制夠良性—— 在迴歸的脈絡下,最寬鬆的說法是「會不會缺失,在模型已納入的變項條件下與結果無關」。 缺 PSA 值的人可能本來就追蹤得比較鬆散,而追蹤鬆散與預後有關,這個條件就未必成立。 該做的是檢查缺失與結果、暴露及模型變項的關聯,必要時改用多重插補或做敏感度分析 (見 缺失值與多重插補);這裡的重點是:數字要報出來,不能靜靜地少掉。

第二步:基線平不平衡

觀察性研究沒有隨機化,所以兩組本來就會不一樣。看的是標準化平均差(SMD):

變項SMD
Age-0.158
PVol-0.102
PreopPSA0.033

慣例上 |SMD| < 0.1 算平衡。這裡有兩個變項略微超過——比的是絕對值,所以負的 SMD 也算:年齡 -0.158、前列腺體積 -0.102,術前 PSA 則是 0.033,落在門檻內。 兩個超標的幅度都不大,但在解讀時要記得它們在那裡——而且要注意這張表只涵蓋了校正模型裡的部分變項,腫瘤體積(TVol)沒有算平衡資訊。

第三步:未校正與校正後

模型HR(長儲存 vs 短中儲存)95% CIp
未校正1.080.60–1.930.805
校正年齡、前列腺體積、術前 PSA、腫瘤體積1.050.59–1.900.859

這個結果未達統計顯著。 接下來這一段是本章最重要的部分,因為它決定你會不會騙到自己。

第四步:校正之後仍然不能宣稱因果

校正前後的 HR 幾乎沒動(1.08 → 1.05), 這代表已測量到的那幾個干擾因子在這裡影響不大。但這句話有一個很重的限定詞。

統計校正只能處理你有測量到的變項。這份資料沒有的東西——手術醫師的經驗、術後追蹤的密集程度、 病人的共病負擔——如果同時影響「輸到哪批血」與「會不會復發」,那個偏誤原封不動地留在估計值裡。

世代研究特有的陷阱

Immortal time bias(不死時間偏誤)

如果暴露的定義需要病人「活到某個時間點才可能被歸類為暴露組」,那段時間裡他依定義不可能死亡—— 這段「不死時間」被算進暴露組的追蹤時間,會讓暴露組看起來有保護效果。

典型情境:依「有沒有在術後接受輔助化療」分組。要接受化療,病人得先活到能開始化療。 處理方式是把暴露當時間相依變項,而不是在基線就分好組。

依基線後的資訊分組

任何「用追蹤期間才知道的資訊」來分組的做法都會出問題——依治療反應分組、 依用藥順從度分組、依中途檢驗值分組。這些都不是基線特徵。

失聯不是隨機的

追丟的人通常與留下來的人不同。失聯率要報,而且要比較失聯者與完成追蹤者的基線特徵。

常見誤用

誤用為什麼錯
對觀察性研究的 Table 1 做組間 p 值檢定兩組確實來自不同母體,檢定只反映樣本數;該看 SMD
完整個案分析不報掉了幾人缺失通常與預後有關,靜默排除是隱藏的選擇步驟
未達顯著寫成「兩組沒有差異」只能說本研究未偵測到差異;寬信賴區間代表無法排除中等效應
信賴區間跨 1 還把 HR 當方向明確的結論呈現效果方向未定,放大成主視覺會誤導
校正後就宣稱因果統計校正只能處理已測量的干擾因子
依基線後才知道的資訊分組製造 immortal time bias 或選擇偏誤
回溯性世代寫成「回溯性分析」或反之前者是設計,後者是分析時機
失聯率不報失聯與預後相關時會造成選擇偏誤

重跑本頁的所有數字

/opt/homebrew/bin/Rscript figures/scripts/D1-cohort-blood-storage.R

讀讀看這張圖

答案取自產生本頁圖表的同一份統計輸出,不是另外打上去的。

這個世代的追蹤時間有兩個候選數字。報告「中位追蹤時間」時該用哪一個,理由是什麼?

看答案與解析

正確答案: 把事件與設限對調之後讀出來的 35.4 個月,它回答的是不發生事件時一個人大約被追蹤多久

26.7 個月是觀察時間的中位數,而觀察時間會被事件切斷——第 3 個月就復發的人只貢獻 3 個月,那不是「這個世代只追蹤了三個月」。事件愈多,這個算法把追蹤看得愈短。reverse Kaplan-Meier 把設限當事件、事件當設限再讀中位數,得到 35.4 個月,那才是追蹤時間分布的中位數,也是可以讀成「典型追蹤長度」的那一個。至於 100.0 個月只是曲線畫到哪裡,它是最後幾個人所在的位置——同一張圖底下的風險人數表顯示那個時間點兩組都只剩個位數的人。

基線平衡表列了年齡、前列腺體積與術前 PSA 三列標準化平均差。哪一個說法對?

看答案與解析

正確答案: 前列腺體積那一列是 -0.102,絕對值已經越過慣例的平衡門檻,跟年齡一樣屬於略微不平衡

標準化平均差的正負號只說明差在哪一邊,判斷平不平衡看的是絕對值。年齡的 -0.158 與前列腺體積的 -0.102 都越過了慣例門檻,術前 PSA 的 0.033 才是真正落在門檻內的那一列。把負號讀成「差距比較小」,會讓最不平衡的那一列被當成最平衡的一列。還有一件這張表本身說不出來的事:它只涵蓋校正模型裡的一部分變項,腫瘤體積沒有平衡資訊,所以「表上有兩列略微超標」不等於「只有兩個變項不平衡」。

校正年齡、前列腺體積、術前 PSA 與腫瘤體積之後,風險比幾乎沒有動。這代表什麼?

看答案與解析

正確答案: 校正後的風險比是 1.055,與未校正幾乎相同,只說明放進模型的那幾個變項沒有承載多少干擾

校正前後只從 1.077 移到 1.055,能推論的只有一件事:放進模型的那幾個變項並沒有承載多少干擾。它完全不能推論「沒有干擾」——手術醫師的經驗、術後追蹤的密集程度、病人的共病負擔都不在這份資料裡,而統計校正對沒測量到的變項無能為力。p 值 0.859 則是另一個誤讀:p 值大只代表這份資料沒有偵測到差異,不是差異不存在;何況比較兩個 p 值的大小本來就不是判斷干擾有沒有被處理掉的方式。

未校正的風險比附了一個 95% 信賴區間,而區間跨過了無效值。這一列該怎麼寫進論文?

看答案與解析

正確答案: 點估計是 1.077,而區間一端落在明顯的保護、另一端落在明顯的有害,所以只能寫成未偵測到關聯

0.600 與 1.932 都是真的,問題在於各自只引用一端。同一個區間同時容納了大幅降低與將近翻倍兩種可能,這正是「資料不足以排除中等效應」的意思,而不是任一個方向的證據。點估計 1.077 落在無效值附近,配上這麼寬的區間,唯一撐得住的寫法是「在本世代中未偵測到儲存時間與生化復發的關聯」。要主張兩者相當,需要事先設定等效界限的設計,而不是一個跨過無效值的區間。同理,1.077 也不該被換算成「風險增加了百分之幾」放進圖卡——方向未定的效果量被放大成主視覺就是誤導。

兩條累積發生率曲線在最右端看起來稍微分開。這一段值得討論嗎?

看答案與解析

正確答案: 不值得。到第 100 個月時短/中儲存組只剩 2 人還在風險集合裡,那一段的高低幾乎沒有分母撐著

風險人數表就是曲線的分母,而它會一路縮小。196 只描述曲線的起點;到第 80 個月長儲存組剩下的人已經是個位數,到第 100 個月兩組都只剩下極少數人,那時候一個人發生事件就會讓曲線跳一大格。所以曲線右端的分離是分母耗盡的樣子,不是兩組真的分開了。讀任何一張存活或累積發生率曲線,先把視線移到底下那一列人數,再決定哪一段可以談。

這一頁的第一張表把資料集總人數、被排除的人數與進入分析的人數分成三列。為什麼中間那一列要寫出來?

看答案與解析

正確答案: 因為完整個案分析靠的是一個關於缺失機制的假設,被排除的那 17 人是判斷這個假設的唯一線索

17 人被排除看起來不多,但完整個案分析不是中性的預設值:它要對目標估計量有效,缺失機制必須夠良性——最寬鬆的說法是「會不會缺失,在模型已納入的變項條件下與結果無關」。缺 PSA 值的人可能本來就追蹤得比較鬆散,而追蹤鬆散與預後有關,那個條件就未必成立。316 是資料集的總人數,299 是實際跑模型的人數,兩者都不能替代中間那一列:讀者要看到的是差額,以及它是怎麼產生的。數字要報出來,不能靜靜地少掉。

延伸觀看

Cohort Studies: A Brief Overview
ENTerry Shaneyfelt· 6 min五分半的總覽,看完再讀本章第一節會比較有畫面。
Cohort study vs case-control study: everything you need to know in 5min
ENMichael Fralick· 6 min世代與病例對照的分野,這支講得最乾淨。
Principles of Epidemiology 03. Disease Occurrence and Prototype of Study Designs
繁中臺大開放式課程 NTU OCW· 92 min繁中(英文投影片)。想把流病當一門課上的話,這是完整的一套,本集講各種設計的原型。

素材來源與授權

回報內容問題

這個站的統計內容由 AI 撰寫、AI 互審,人工只做抽查。你看得出來的錯,我們不一定看得出來。

寫得越具體越修得動,例如哪一句話跟哪本教科書/哪篇論文的說法不一致。

留了才回得了信;不留也會看。

一併送出的資訊

這些是自動帶上的,每一項都可以取消。