決策曲線 Decision Curve

本文轉自:決策曲線分析法(Decision Curve Analysis,DCA)

簡介

評價一種診斷方法是否好用,一般是作ROC曲線,計算AUC。但是,ROC只是從該方法的特異性和敏感性考慮,追求的是準確。而臨牀上,準確就足夠了嗎?患者就一定受益嗎?

比如我通過某個生物標誌物預測患者是否患了某病,無論選取哪個值爲臨界值,都會遇到假陽性和假陰性的可能,有時候避免假陽性受益更大,有時候則更希望能避免假陰性。既然兩種情況都無法避免,那我就想要找到一個淨受益最大的辦法。

2006年,MSKCC(紀念斯隆凱特琳癌症研究所)的AndrewVickers博士等人研究出另一種評價方法,叫決策曲線分析法(Decision Curve Analysis,DCA)。相對於二戰時期誕生的ROC曲線,DCA還很年輕,也一直在完善之中,不過2012-2016年間,Ann InternMed.、JAMA、BMJ、J Clin Oncol等雜誌都已陸續發文,推薦使用決策曲線分析法。

      

      Lancet. 2016 Jun 4;387(10035):2302-11.

這是一個來自Lancet的例子,研究者爲了評價房顫患者口服抗凝藥的出血風險,開發了一種新的評價方法,即基於生物標誌物的ABC出血風險評分(Age,Biomarkers,Clinicalhisory),讓它和傳統的ORBIT及HAS-BLED法比較。這種類型的研究,咱們通常就是作ROC曲線。但他們沒有,而是採用了決策曲線分析法。

這幅圖的橫座標爲閾概率(ThresholdProbability)。當各種評價方法達到某個值時,患者i的出血風險概率記爲Pi;當Pi達某個閾值(記爲Pt),就界定爲陽性,採取某種干預措施(比如更改抗凝方案)。

那麼改了抗凝方案,自然就改變了出血與血栓形成之間的利弊平衡,縱座標就是利減去弊之後的淨獲益率(Net Benefit, NB)。

可這幅圖除了三種評價方法的曲線外,還有兩條虛線,它們代表兩種極端情況。橫的那條表示,所有樣本都是陰性(Pi < Pt),所有人都沒幹預,淨獲益爲0。斜的那條表示所有樣本都是陽性,所有人都接受了干預,淨獲益是個斜率爲負值的反斜線(原理見後文)。其它的曲線就與它們相比較。

從圖中可以看出,HAS-BLED曲線和兩條極端曲線很接近,也就是說它沒什麼應用價值。而在一個很大的Pt區間範圍內,ABC法和ORBIT法的獲益都比極端曲線高,所以它們可選的Pt範圍都比較大,相對安全。而ABC又比ORBIT好一些。

 

繪製決策曲線

畢竟這是新的算法嘛,傳統的統計軟件好像還木有跟上,R語言倒是跟得挺快。2016年,Kerr等人專爲決策曲線製作了個名爲DecisionCurve的R語言包。

這裏有一份示例數據,是NHLBI(美國國家心肺血液研究所)的Framingham心臟研究專項數據集的一個子集,4000多個樣本。

      

自變量分別爲性別(sex)、收縮壓(sbp)、舒張壓(dbp)、血清膽固醇(scl)、年齡(age)、身體質量指數(bmi)等,因變量爲冠心病相關死亡事件(chdfate)。因變量必須是二元變量,隨訪時間內死亡爲1,未死亡爲0。

下面建立兩個模型,來演示怎樣畫出DCA曲線。一個是簡單模型,以血清膽固醇值爲預測方法(predictor),死亡事件爲結果(outcome);另一個是複合模型,聯合性別、年齡、BMI、血清膽固醇、收縮壓、舒張壓爲預測方法,死亡事件爲結果。

準備工作

//#library(DecisionCurve) # 注:DecisionCurve包已經不再維護,更名爲rmda
library(rmda)
setwd('D:\\DCA')
Data<- read.csv('2.20.Framingham.csv',sep = ',')

DCA運算

simple<- decision_curve(chdfate~scl,data = Data, family = binomial(link ='logit'),
thresholds= seq(0,1, by = 0.01),
confidence.intervals =0.95,study.design = 'case-control',
population.prevalence = 0.3)

#decision_curve()函數中,family =binomial(link = ‘logit’)是使用logistic迴歸來擬合模型。threshold設置橫座標閾概率的範圍,一般是0 ~ 1;但如果有某種具體情況,大家一致認爲Pt達到某個值以上,比如40%,則必須採取干預措施,那麼0.4以後的研究就沒什麼意義了,可以設爲0 ~ 0.4。by是指每隔多少距離計算一個數據點。

# Study.design可設置研究類型,是cohort還是case-control,當研究類型爲case-control時,還應加上患病率population.prevalance參數。
complex<- decision_curve(chdfate~scl+sbp+dbp+age+bmi+sex,data = Data,
family = binomial(link ='logit'), thresholds = seq(0,1, by = 0.01),
confidence.intervals= 0.95,study.design = 'case-control',
population.prevalence= 0.3)
# 基本和simple相同,就是那幾個聯合應用的變量之間用個+號連接起來。
List<- list(simple,complex)
#把剛纔計算的simple和complex兩個對象合成一個list,命名爲List。

DCA曲線繪製

plot_decision_curve(List,curve.names= c('simple','complex'),
cost.benefit.axis =FALSE,col = c('red','blue'),
confidence.intervals =FALSE,standardize = FALSE)

#plot_decision_curve()函數的對象就是剛纔的List,如果只畫一根曲線,就不需要合成的那步,直接把List替換成simple或complex就好了。

# curve.names是出圖時,圖例上每條曲線的名字,書寫順序要跟上面合成list時一致。cost.benefit.axis是另外附加的一條橫座標軸,損失收益比,默認值是TRUE,所在不需要時要記得設爲FALSE。col就是顏色。confidence.intervals設置是否畫出曲線的置信區間,standardize設置是否對淨受益率(NB)使用患病率進行校正。

好了,這樣就得到如下曲線:

      

可見,在Pt約爲0.1~0.5範圍內,複合評價模型的淨受益率都比簡單模型高。

然後可用summary(complex,measure= 'NB')查看complex模型曲線上的各數據點,當然,NB也可以改成sNB,表示經過患病率的標準化:

      

接下來的一個函數,就是Kerr等人對DCA算法的進一步發展了,即繪製臨牀影響曲線(Clinical Impact Curve):

plot_clinical_impact(simple,population.size = 1000,cost.benefit.axis = T,
      n.cost.benefits= 8,col = c('red','blue'),
      confidence.intervals= T)

# 使用simple模型預測1000人的風險分層,顯示“損失:受益”座標軸,賦以8個刻度,顯示置信區間,得到下圖:

      

紅色曲線(Numberhigh risk)表示,在各個閾概率下,被simple模型劃分爲陽性(高風險)的人數;藍色曲線(Number high risk with outcome)爲各個閾概率下真陽性的人數。意義一目瞭然吧。

 

DCA算法的設計原理

其實瞭解到上面的也夠了,再瞭解下面的就錦上添花啦~

它相當於在迴歸預測分析的基礎上,引入了損失函數。先簡單定義幾個概念:

P:給真陽性患者施加干預的受益值(比如用某生化指標預測某患者有癌症,實際也有,予活檢,達到了確診的目的);

L:給假陽性患者施加干預的損失值(比如預測有癌症,給做了活檢,原來只是個增生,白白受了一刀);

Pi:患者i有癌症的概率,當Pi > Pt時爲陽性,給予干預。

所以較爲合理的干預的時機是,當且僅當Pi × P >(1 – Pi) × L,即預期的受益高於預期的損失。推導一下可得,Pi > L / ( P + L )即爲合理的干預時機,於是把L / ( P + L )定義爲Pi的閾值,即Pt。

但對二元的預測指標來說,如果結果是陽性,則強制Pi=1,陰性則Pi = 0。這樣,二元和其他類型的指標就有了可比性。

然後我們還可用這些參數來定義真陽性(A)、假陽性(B)、假陰性(C)、真陰性(D),即:

A:Pi ≥ Pt,實際患病;

B:Pi ≥ Pt,實際不患病;

C:Pi < Pt,實際患病;

D:Pi < Pt,實際不患病。

我們有一個隨機抽樣的樣本,A、B、C、D分別爲這四類個體在樣本中的比例,則A+B+C+D = 1。那麼,患病率(π)就是A + C了。

在這個樣本中,如果所有Pi ≥ Pt 的人我們都給做了活檢,那麼就會有人確診,有人白白被拉了一刀,那麼淨受益率NB = A × P – B × L。

但Vickers認爲,知道P和L的確切值並沒有什麼實際意義,人們可能更關心L/P的比值,所以將上面的公式強行除以P,變成NB = A – B × L/P。根據Pt定義公式可推導出:NB = A – B × Pt / ( 1 – Pt )。以Pt爲橫座標,U爲縱座標,畫出來的曲線就是決策曲線。

若使用患病率進行校正,則U = A ×π– B ×(1 –π) × Pt / ( 1 – Pt )。

那麼兩個極端情況的曲線也很好推導了。當所有樣本都是陰性(Pi < Pt),所有人都沒幹預,那麼A = B = 0,所以NB = 0。當所有樣本都是陽性,所有人都接受干預,那麼C = D = 0,A = π,B = 1 –π(因爲A+B+C+D=1),則NB = π– ( 1 –π )Pt / ( 1 – Pt ),所以它斜率爲負值(

當然實際上,由這個表達式可知,陽性極端線不是直線,而是曲線)。

 

以上是分類模型中的決策曲線。生存模型也是有決策曲線的,具體請參考:mskcc/decision-curve-analysis

 

參考資料:

1.Decision curve analysis: anovel method for evaluating prediction models

2.Decision curve analysisrevisited: overall net benefit, relationships to ROC curve analysis, andapplication to case-control studies

3.Assessing the Clinical Impactof Risk Prediction Models With Decision Curves: Guidance for CorrectInterpretation and Appropriate Use

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章