基於R的生存資料預測模型構建與Nomogram繪製

2021-02-16 臨床研究與醫學統計

題記:本文成形於2015年並於2017年收錄於由筆者與胡志德醫生共同主編,中南大學出版社出版的《瘋狂統計學》,此次屬舊文重發,較原文有較大改動。

1. 背景介紹

人們對於「算命」這樣的事情總是樂此不彼,無論是中國文化中「算命佔卜」還是西方文化中的「佔星術」,無不說明人們對於此道的熱衷。本章討論的構建預測模型也是一種「算命」,只是這是一種更為科學的「算命」。作為一個腫瘤科醫生,臨床上可能會遇到這樣的情況,一個55歲男性中晚期食管癌患者問道:醫生,請問我還能活多久?大多數時候我們會根據患者的臨床分期告訴患者,這種情況的中位生存時間是多少……其實這裡的臨床分期就是我們預測患者期望壽命的依據,或者如本文標題所說的「預測模型」,我們用某一臨床分期的所有患者中位生存時間來回答單個患者的問題,可能會存在問題,這裡的中位生存時間代表的是患病人群預期壽命的平均值,對於具體的個體來說有時並不準確。

那我們是否有更科學、更準確的方法計算出單個患者的生存概率?答案是肯定的。我們可以通過Cox回歸等方法先構建一個數學模型,然後把這個模型可視化為Nomogram,通過圖形來計算每個具體患者的生存概率。Nomogram中文常稱為諾莫圖或者列線圖,其本質就是回歸方程的可視化。它根據所有自變量標準回歸係數的大小來制定評分標準,給每個自變量的每種取值水平一個評分,對每個患者,就可計算得到一個總分,再通過得分與結局發生概率之間的轉換函數來計算每個患者的結局時間發生的概率。舉例來說,我們治療了一個40歲的男性胰腺癌手術後的患者,術中進行了放療,腫瘤位於胰腺頭部,有腹膜轉移,臨床分期在IV期。根據上述條件,通過一定的數學模型判斷每個變量的得分,比如年齡40歲,得分是10分,男性得分是4分……依次累計各個變量的得分,計算出總分,不同的總分值就對應3月、6月和1年的生存概率。複雜的Cox回歸公式變成了直觀的圖片,醫生可以很方便的計算每個患者的生存概率,從而告知患者一個相對準確的「算命」結果。模型預測是否準確,一致性好不好等概念我們將在後續文章中陸續介紹。

2. 案例與操作

本章我們以[案例 1]的數據,介紹生存資料預後模型的建立與Nomogram圖形繪製。為了便於讀者閱讀與練習模仿,筆者對數據進行了簡化處理。


[案例 1] 筆者在The Cancer Genome Atlas (TCGA) 數據中下載1215例浸潤性乳腺癌患者的臨床資料。下載網址: https://genome-cancer.ucsc.edu/。數據經整理後如下 表1 所示,變量定義及賦值說明如表2所示。研究目的就是要根據1215例乳腺癌患者的生存資料構建預測模型並繪製 Nomogram。

表1. 1215例乳腺癌患者的生存資料

表2.變量定義、賦值及說明

整個預測模型構建的步驟大體如下:

步驟 1. 我們首先使用Cox回歸基於構建預測模型並篩選獨立預後因素(用於建模的數據集一般稱為訓練集或者內部數據集)。需要說明的是本例的數據錄入、單因素Cox回歸分析,多因素Cox回歸分析等操作可參考筆者主編的《聰明統計學》[1] 與《瘋狂統計學》[2]。最終我們可得到三個與預後相關的獨立因素:Age, PgR, Pathologic_stage。

步驟 2. 我們就以這三個獨立的預後因素繪製Nomogram,建模完成。

步驟 3. 對上述兩步所構建的預測模型的區分能力 (Discrimination) 進行評價,並計算C-index。

步驟 4. 對模型進行驗證,可通過外部數據集進行驗證,如果無法獲得外部數據集,筆者推薦採用Bootstrap衝抽樣法基於訓練集驗證模型並繪製校正曲線(Calibration plot)。

3. 計算過程

我們重點講解Cox回歸模型中C-Index計算,Nomogram繪製過程,Bootstrap法驗證模型及繪製標準曲線。以下所有操作均基於R軟體,軟體下載地址:https://www.r-project.org/. 我們把數據另存為BreastCancer.sav,並保存至R的當前工作目錄下。計算結果如圖1及圖2所示。

載入程序包

library(foreign)library(rms)

## Loading required package: Hmisc

## Loading required package: lattice

## Loading required package: survival

## Loading required package: Formula

## Loading required package: ggplot2

##
## Attaching package: 'Hmisc'

## The following objects are masked from 'package:base':
##
##     format.pval, units

## Loading required package: SparseM

##
## Attaching package: 'SparseM'

## The following object is masked from 'package:base':
##
##     backsolve

數據準備,讀入當前工作路徑下的.sav格式的數據

breast<-read.spss("BreastCancer.sav")

把數據轉換為數據框格式

breast<-as.data.frame(breast)
breast<-na.omit(breast)

展示數據框的前6行數據

head(breast)

##    No    Months Status Age       ER      PgR Margin_status
## 9   9  8.633333 Censor  70 Positive Negative      Nagative
## 11 11 44.033333 Censor  56 Positive Positive      Nagative
## 12 12 48.766667 Censor  54 Positive Positive      Nagative
## 13 13 14.466667 Censor  61 Positive Positive      Nagative
## 14 14 47.900000 Censor  39 Negative Positive      Nagative
## 19 19 39.866667 Censor  50 Positive Positive      Nagative
##    Pathologic_stage HER2_Status Menopause_status
## 9           Stage I    Negative   Post menopause
## 11          Stage I    Negative    Pre menopause
## 12         Stage II    Negative    Pre menopause
## 13         Stage II    Negative   Post menopause
## 14         Stage II    Negative    Pre menopause
## 19         Stage II    Positive   Post menopause
##                 Surgery_method             Histological_type
## 9                   Lumpectomy                         Other
## 11 Modified Radical Mastectomy                         Other
## 12 Modified Radical Mastectomy Infiltrating Ductal Carcinoma
## 13                  Lumpectomy                         Other
## 14                  Lumpectomy Infiltrating Ductal Carcinoma
## 19                  Lumpectomy Infiltrating Ductal Carcinoma

定義終點事件

breast$Status<-ifelse(breast$Status=="Dead",1,0)

設置參考組

breast$Pathologic_stage<- relevel(breast$Pathologic_stage,ref='Stage I')

構建Cox回歸方程

coxm <-cph(Surv(Months,Status==1)~Age+Pathologic_stage+PgR,x=T,y=T,data=breast,surv=T)
surv<- Survival(coxm) surv1<- function(x)surv(1*12,lp=x) surv2<- function(x)surv(1*36,lp=x) surv3<- function(x)surv(1*60,lp=x) dd<-datadist(breast) options(datadist='dd')

繪製列線圖。maxscale參數指定最高分數,一般設置為100或者10分;un.at 設置生存率的刻度;xfrac 設置數值軸與最左邊標籤的距離,可以調節下數值觀察下圖片變化情況

plot(nomogram(coxm,fun=list(surv1,surv2,surv3),lp=F,funlabel=c("1-Yeas OS", '3-Year OS','5-YearOS'),maxscale=100,fun.at=c('0.95','0.85','0.80','0.70','0.6','0.5','0.4','0.3','0.2','0.1')),xfrac=.3)

圖1. 列線圖。

結果解讀:圖中points就是一個選定的評分標準或者尺度,對於每個自變量取值,在該點做一條垂直於Points軸的直線(可通過直尺),交點即代表該自變量取值下的評分,如Age,取25時評分為0分,CEA為90時評分約為100分。以此類推,計算每個患者各個自變量對應的分值points,加起來就是總分totalpoints。同樣的道理,在TotalPoints軸上找到該患者總分對應的點,畫一垂直直接到生存概率軸上(如3年生存概率3-yearOS或者5年生存概率5-year OS),交點即為該患者的3年或5年生存概率。

計算C-index

f<-coxph(Surv(Months,Status==1)~Age+Pathologic_stage+PgR,data=breast)
sum.surv<-summary(f)
c_index<-sum.surv$concordance
c_index

##          C      se(C)
## 0.77878820 0.05734042

此處再次解釋一下上述R語言代碼中計算的C-Index統計量的含義,此值可以參考ROC曲線下面積去理解,取值範圍0~1,越接近1說明我們構建的Cox回歸模型預測價值越大,一般來說C-Index=0.7即表明模型具有良好的預測價值。本例中計算的C-Index = 0.7503, se(C-Index) = 0.02992,以上為軟體直接輸出結果。

計算C-index的補數(可選)

library(Hmisc)
S<-Surv(breast$Months,breast$Status==1)
rcorrcens(S~predict(coxm),outx=TRUE)

##
## Somers' Rank Correlation for Censored Data    Response variable:S
##
##                  C    Dxy  aDxy   SD    Z P   n
## predict(coxm) 0.22 -0.559 0.559 0.09 6.21 0 549

構建標準曲線。u需要與之前f中定義好的time.inc一致,即f中time.inc為60時,此處u即為60;m要根據樣本量來確定,由於標準曲線一般將所有樣本分為3或4組(在圖中顯示3或4個點),m代表每組的樣本量數,因此m*3應該等於或近似等於樣本量。

cal<- calibrate(coxm, cmethod='KM', method='boot', u=60, m=100, B=100)

## Using Cox survival estimates at  30 Days

## Warning in groupkm(cox, Surv(y[, 1], y[, 2]), u = u, cuts = orig.cuts): one
## interval had < 2 observations

列印並修改標準曲線的圖形參數

plot(cal,lwd=2,lty=1,errbar.col=c(rgb(0,118,192,maxColorValue=255)),xlim=c(0.7,1),ylim=c(0.6,1),xlab="Nomogram-Predicted Probability of 5-Year OS",ylab="Actual 5-Year OS(proportion)", col=c(rgb(192,98,83,maxColorValue=255)))
lines(cal[,c("mean.predicted","KM")],type="b",lwd=2,col=c(rgb(192,98,83,maxColorValue=255)), pch=16)
abline(0,1,lty=3,lwd=2,col=c(rgb(0,118,192,maxColorValue=255)))

圖2. 標準曲線。

基於訓練集採用bootstrap重抽樣的方法驗證列線圖的預測準確性。結果解讀:橫坐標為根據列線圖預測的每個患者的5年生存概率,縱坐標為每個患者實際的5年生存概率,如果圖中的紅色線條恰好與藍色虛線完全重合時最為理想。

4. 總結與討論

綜上,本文介紹了生存資料預測模型的構建以及Nomogram的繪製。需要說明的是一個預測模型是否具有較好的實際運用價值,除了考量其預測的準確性還要考量其可操作性。除了內部驗證檢驗其準確性,外部驗證有時也是必須的,本例中因未獲得較好的外部驗證數據及並未演示外部驗證的操作過程。過去十年有關臨床預測模型的Nomogram文章很多,很多Nomogram的預測效能遠高於TNM分期,可是為什麼醫生們仍然習慣運用TNM分期去為患者「算命」呢?我想主要原因還是TNM分期使用更為方便。從這個角度講,我們構建Nomogram應該納入儘可能少的變量以方便臨床使用。到底應該優先考慮其準確性還是應該考慮其可操作性?讀者應該根據自己的研究目的自行考量。

5. 參考文獻

[1]. 周支瑞, 胡志德. 聰明統計學. 長沙:中南大學出版社, 2016.

[2]. 周支瑞, 胡志德. 瘋狂統計學. 長沙:中南大學出版社, 2018.

相關焦點

  • 如何根據Cox回歸Nomogram計算所有患者的風險得分?
    背景知識我們通過Cox回歸等方法構建臨床預測模型,然後根據模型參數把患者的生存概率可視化為Nomogram。「Nomogra」中文常翻譯為諾模圖或列線圖,其本質就是回歸方程的可視化。以下代碼為構建Cox回歸模型,並繪製列線圖,此處不再詳述,讀者可以參閱文獻[1]獲得更詳細的列線圖及校正曲線繪製代碼。此處在訓練集中構建的Cox回歸模型「coxm」及列線圖對象「nom」是我們後續計算得分及生存概率的依據。
  • 用lasso回歸構建生存模型+ROC曲線繪製
    1load("forest.Rdata")2exprSet = expr[,group_list=="tumor"]34## 必須保證生存資料和表達矩陣,兩者一致5all(substring(colnames(exprSet),1,12)==meta$ID)6#> [1] TRUE2.構建lasso回歸模型lasso
  • R語言|Survminer包繪製生存曲線
    生存分析是醫學領域中一個重要的內容,在各個疾病領域的研究中都運用十分廣泛。在R中進行生存分析常用的包主要有survival包以及survminer包。•Survival 包提供了生存函數的建立,Cox模型的建立,以及比較分析。這個包也提供了基於基礎繪圖系統的生存曲線繪製。
  • 基於R語言pec包對Cox回歸模型進行深度評價
    題記:這是我們臨床預測模型構建的第12篇文章。感謝王子威賢弟賜稿,三人行必有我師!1.
  • R語言基於ARMA-GARCH-VaR模型擬合和預
    p=3186 本文顯示了如何基於潛在的ARMA-GARCH過程(當然也涉及更廣泛意義上的QRM)來擬合和預測風險價值(VaR)。1 從ARMA-GARCH進程模擬(log-return)數據我們考慮使用t 分布的ARMA(1,1)-GARCH(1,1)過程。模擬一條路徑(用於說明目的)。
  • 基於LSTM的多變量多步預測模型
    本文主要分為:LSTM模型簡介、數據探索分析、模型構建測試三個部分。本文今天主要是藉助於LSTM這一深度學習模型來對手中的時序序列數據進行建模分析,構建我們的序列數據預測模型,來對未來多步時刻進行預測分析。二、數據探索分析這裡我們使用到的數據集來源於中央監測站某地公開的大氣常規六因子的監測數據,數據集部分截圖如下所示:
  • 識肝病,驗新知|基於PIVKA-II的ASAP模型無創、精準預測肝癌風險
    因此,為了提高國人最為多見的B肝相關性肝癌的診斷效能,彌補以往單用AFP一種血清標誌物診斷肝癌的不足,我們想到了開發一種基於這兩種肝癌標誌物血清含量和肝癌獨立危險因素(年齡、性別)在內的預測模型,進一步提高檢出慢性B型肝炎患者罹患肝癌的預測效能,這個模型應具有方便、簡單、無創、精確度高的優點。因此,我們聯合了國內十多家大型三甲醫院前瞻性地開展了這項研究。
  • 生信代碼:生存曲線繪製!
    ↑↑↑   關注選刊說   ↑↑↑您的SCI選刊助手!
  • 建立非線性回歸預測模型,來看R教程!
    由此看出,兩者呈現出一種非線性的變化關係,存在閾值效應和飽和效應,在不同藥物劑量範圍內,劑量-反應關係函數差別很大,如果強行用單一的線性回歸來建立預測建模,不符合臨床實際,模型預測的準確性將會大打折扣。下面我們先用線性回歸來分析一下。
  • 你為何而轉:微博用戶轉發行為預測模型的構建與影響因素探究
    本研究旨在構建模型對轉發行為進行預測,並分析其影響因素。首先根據「5W模型」,提取微博作者、微博文本、微博接受者和相互關係四個一級維度特徵,並細分為39個二級維度特徵,利用支持向量機構建預測模型,再通過新浪微博數據,對模型進行評估。預測模型的查全率為58.67%,精確率為82.19%,F1值為68.46%,這表明預測模型的表現令人滿意。
  • 【分類算法】基於 R 語言決策樹算法介紹及應用
    機器學習中決策樹是一個預測模型,它表示對象屬性和對象值之間的一種映射,樹中的每一個節點表示對象屬性的判斷條件,其分支表示符合節點條件的對象。樹的葉子節點表示對象所屬的預測結果。決策樹案例圖 1. 決策樹案例圖圖 1 是一棵結構簡單的決策樹,用於預測貸款用戶是否具有償還貸款的能力。
  • 用ROC曲線解析預測模型
    最具吸引力的目標之一是利用數據資產的力量來創建能夠預測各種結果的機器學習模型。通過定義明確的模型,可以確定能夠預測結果的最重要影響因素,為戰略假設開發有價值的洞察力,甚至可以通過友好的用戶界面將模型的邏輯實現到軟體應用程式中。然而,在任何這種魔法發生之前,我們需要知道模型創建的預測是否有益!
  • 手把手教你用R繪製生存曲線圖
    在預後研究中,生存曲線是常見的圖片之一,目的是描述各組中患者的生存情況。好的生存曲線圖不僅可以令讀者、編輯和審稿專家眼前一亮,也能為論文增色不少。接下來跟大家分享如何用R語言繪製生存曲線圖。survival包對生存數據進行建模.survfit()函數來估計刪失數據的生存曲線;coxph()函數用來擬合Cox比例風險模型.
  • 通過Keras 構建基於 LSTM 模型的故事生成器
    所以神經網絡要準確進行預測,就必須記憶單詞的所以序列。 而這正是 LSTM 可以做到的。編程實現 LSTM本文將通過 LSTM 網絡開發一個故事生成器模型。主要使用自然語言處理(NLP)進行數據預處理,使用雙向LSTM進行模型構建。
  • 「GitHub熱門開源」構建NLP深度學習模型其實就是搭積木
    其實,構建NLP深度學習模型就是搭積木。在構建自然語言理解深度學習模型過程中,研究人員或者工程師們經常需要在編程細節和代碼調試上花費大量精力,而不是專注於模型架構設計與參數調整。與此同時,工具包還提供了一系列針對常見NLP 任務的經典模型。NeuronBlocks能使工程師們在幾秒鐘內快速構建和訓練各種自然語言處理模型。工具包的可擴展性很強,支持快速加入新的神經元模塊用於新的網絡模型的構建,最大程度地避免重複的代碼工作。
  • 小結|醫學統計學各種資料比較選擇方法
    為幫助具有一定臨床研究基礎的學員,能更好掌握臨床資料深度挖掘與預測模型構建套路與常用技能, 考慮目前在疫情期間的實際情況,我們決定召開第11期【臨床預測模型構建與臨床資料深度挖掘網絡精講班】,為了保證學習效果,我們採用國際頂級的zoom網絡會議平臺授課,效果體驗好!
  • 第四十講 R-線性回歸:預測模型及可信區間
    今天的課程將繼續帶大家學習R-線性回歸:預測模型及可信區間。線性回歸的一個主要目標是基於一個或多個預測變量來預測結果值。(我們也用它來研究兩個變量的相關性,同時校正其他混雜因素)。那麼,當我們取得了預測模型後,根據該預測模型對新數據進行預測得出的預測值是什麼?這個預測值的可信度如何呢?今天的講解中,我們會給出答案。我們首先建立一個簡單的線性回歸模型,該模型根據速度預測汽車的停車距離。
  • 時間序列的LSTM模型預測——基於Keras
    時間序列的預測指的是基於序列的歷史數據,以及可能對結果產生影響的其他相關序列,對序列未來的可能取值做出預測。現實生活中的時間序列數據預測問題有很多,包括語音分析、噪聲消除以及股票期貨市場的分析等,其本質主要是根據前T個時刻的觀測數據推算出T+1時刻的時間序列的值。
  • 智源小分子預測賽baseline分享,基於多模型融合的模型構建
    賽題任務為根據從小分子結構中提取的3177個維度特徵,預測小分子的六個化學性質。作者將任務歸納為回歸問題,並嘗試對每一個化學性質分別用模型預測。此baseline的構建基於XGBoost,以及LightGBM,評測分數為8.56。藥物研發是一項成本極高的工作。著名的醫學期刊JAMA的一篇調查論文顯示,研發一款癌症藥物的成本在6.48億美元左右。
  • 嘮一嘮,那些喜歡收臨床預測模型的雜誌
    昨天,給各位介紹了如何基於 SEER 資料庫構建一篇臨床預測模型文章