筆者之前有寫過一篇https://reurl.cc/Z1eNkW文章,關於如何在R上面執行傳統ROC 的分析(例如: 觀察一個新的biomarker能否區別疾病的發生),但傳統的ROC分析是假設疾病的發生跟biomarker不會隨著時間的進程而改變,但在臨床的情境,疾病跟biomarker是會隨著時間而改變的,因此我們在做ROC分析的時候需要同時考慮時間的影響,這時候考慮時間變化的time-dependent ROC(時間相依ROC)會比較適合。

關於敏感度跟特異度的計算在傳統的ROC以及時間相依ROC說明如下:

        傳統的ROC

  1. Sensitivity (敏感度) = P(Biomarker > 閾值|Event=1)
  2. Specificity (特異度) = P(Biomarker ≤ 閾值|Event=0)

時間相依的ROC

  1. Sensitivity (敏感度, time) = P(Biomarker > 閾值|Event (time=t) =1)
  2. Specificity (特異度, time) = P(Biomarker ≤ 閾值|Event (time=t) =0)

其實兩種方式唯一的差別只在於有沒有考慮時間,傳統的ROC不管追蹤多久,只管總共發生幾個事件,並以此為基礎計算AUC,但時間相依的ROC因為有考慮追蹤時間,因此不同時間下計算出來的AUC結果會有所不同,研究者必須定義這個時間要看多久。

這邊會用到R APtools package裡面的mayo dataset來進行時間相依的ROC的分析,資料集蒐集了312名原發性膽汁性膽管炎(一種罕見的自體免疫性肝病)患者資料,我先用summary(mayo)快速看一下裡面的內容,資料有四個欄位,time(事件(追蹤)發生時間)、censor(事件發生與否,1=發生; 0=censor)、mayoscore4mayoscore5是兩個分數風險評分。

 

 

1.jpg

 

語法結構:

timeROC(T, delta, marker, other_markers = NULL, cause,

            weighting = "marginal", times, ROC = TRUE, iid = FALSE)

T:事件時間

delta:事件狀態 (0=censor/ 1=發生事件)

marker :計算ROC的連續變項(X),預設是marker值越大,事件越可能發生;反之,前面加-

other_markers:矩陣形式輸入,可輸入多個marker,類似covariates,預設other_markers=NULL

cause:事件發生的coding,一般在沒有競爭風險(Without competing risks)中,會coding1,當存在競爭風險(With competing risks)時,和所關心的事件結局一致,通常為1

weighting:計算方法,預設是weighting="marginal"KM模型;weighting="cox" weighting="aalen"分別為COX模型和additive Aalen 模型

times:想計算的ROC曲線的時間節點

ROC:預設值ROC = TRUE,才能得到敏感度跟特異度的結果

iid = FALSE(預設值)iid = TRUE 才能計算置信區間,但是樣本數量太大時,會需要大量的時間運算

筆者針對mayoscore5outcome跑一個time AUC的分析,語法如下:

##ROC分析 (語法如下)

ROC <- timeROC(T = mayo$time/(365), #將存活時間轉為年,可以不用在資料當中產生一個新的欄位

               delta = as.numeric(mayo$censor), #outcome (0/1)

               marker = mayo$mayoscore5, #自變項

               cause = 1, #event=1

               weighting = "marginal", #權重的計算,預設是marginal,使用Kaplan-Meier做計算

               times = c(1, 3, 5, 10), #預測13510年時間的AUC

               iid = T) #只有marginal可以計算信賴區間

ROC # 輸出各時間點的AUC及其標準誤(se)

結果呈現:

R提供了13510年的AUC及其標準誤,並提供各個時間點仍在追蹤的人數(Survivors)、發生outcome的人數(Cases)censor的人數(Censored)

 

2.jpg

 

       R提供了13510年的AUC及其標準誤,並提供各個時間點仍在追蹤的人數(Survivors)、發生outcome的人數(Cases)censor的人數(Censored)。如果不想自己手動透過AUC跟標準誤計算信賴區間,可以用以下指令快速得到:confint(ROC)$CI_AUC #得到95%信賴區間

 

3.jpg

 

   筆者前面有提到時間相依的ROC因為有考慮追蹤時間,因此不同時間下計算出來的AUC結果會有所不同,如果想要知道不同時間點的AUC結果,可以使用以下指令plotAUCcurve(ROC, conf.int = T, col="blue")  結果呈現:

 

4.jpg

 

   上圖的X軸式追蹤時間,Y軸是AUC的結果,實線為AUC各時間點的連線,虛線為mayoscore5 AUC的信賴區間。由圖可發現AUC最好的時候大概是在一開始跟第5年,隨著時間的增加,AUC看起來有遞減的趨勢,但整體來說mayoscore5AUC不管在任何時間都有超過0.8,非常的優異。

#筆者繪製1,3,5,10年的time-dependent AUC

par(pty="s") #ROC curve圖形呈現正方形

plot(ROC, time=1, col="red", title = "") #col=線的顏色

plot(ROC, time=3, add=TRUE, col="blue") # add=TRUE,將第二條ROC curve加到第一張ROC curve上面

plot(ROC, time=5, add=TRUE, col="green")

plot(ROC, time=10, add=TRUE, col="grey")

legend("bottomright", c("Y-1","Y-3","Y-5","Y-10"),

       col=c("red","blue","green","grey50"),lty=1,lwd=2) #將圖形加上legend,位置在右下角(bottomright)

結果呈現:

 

5.jpg

arrow
arrow
    全站熱搜

    晨晰部落格新站 發表在 痞客邦 留言(0) 人氣()