在之前的文章中,我們介紹了列線圖的含義和構建方法,本文重點介紹下繪制列線圖的代碼,經(jīng)典的列線圖如下所示 當我們構建好一個預后模型之后,可以通過列線圖來可視化其公式,最常用的繪圖方法是通過rms這個R包,以pbc這個生存分析的數(shù)據(jù)為例,展示下其基本用法 > library(rms) > pbc <- pbc[pbc$status %in% c(0, 1), ] > head(pbc) id time status trt age sex ascites hepato spiders edema bili chol 2 2 4500 0 1 56.44627 f 0 1 1 0.0 1.1 302 5 5 1504 1 2 38.10541 f 0 1 1 0.0 3.4 279 7 7 1832 0 2 55.53457 f 0 1 0 0.0 1.0 322 13 13 3577 0 2 45.68925 f 0 0 0 0.0 0.7 281 16 16 3672 0 2 40.44353 f 0 0 0 0.0 0.7 204 19 19 4232 0 1 49.56057 f 0 1 0 0.5 0.7 235 albumin copper alk.phos ast trig platelet protime stage 2 4.14 54 7394.8 113.52 88 221 10.6 3 5 3.53 143 671.0 113.15 72 136 10.9 3 7 4.09 52 824.0 60.45 213 204 9.7 3 13 3.85 40 1181.0 88.35 130 244 10.6 3 16 3.66 28 685.0 72.85 58 198 10.8 3 19 3.56 39 1881.0 93.00 123 209 11.0 3 > dd <- datadist(pbc) > options(datadist = "dd") # 生存模型 > f <- psm(Surv(time,status) ~ age + sex, data = pbc, dist='lognormal') > nom <- nomogram(f) > plot(nom)
效果圖如下 和文獻中的列線圖相比,rms的默認輸出結果中多出了Linear Predictor這個軸,如果想要去掉這個軸,可以通過如下方法 > f <- psm(Surv(time,status) ~ age + sex, data = pbc, dist='lognormal') > nom <- nomogram(f, lp = F) > plot(nom)
效果圖如下 可以看到,LInear Predictor這個軸就不顯示了。對于生存模型,我們希望通過該模型預測患者的生存時間和生存概率,基礎的列線圖顯然并沒有這樣的信息,為此,我們需要自己寫函數(shù)來添加我們想要的軸,用法如下 > f <- psm(Surv(time,status) ~ age + sex, data = pbc, dist='lognormal') > # 計算中位生存時間 > med <- Quantile(f) > # 構建生存概率 > surv <- Survival(f) > nom <- nomogram(f, + fun = list(function(x) med(lp = x, q = 0.5), + function(x) surv(365, x), + function(x) surv(365 * 3, x), + function(x) surv(365 * 5, x)), + funlabel = c("Median Survival Time", + "1-year Survival Probability", + "3-year Survival Probability", + "5-year Survival Probability"), + lp = F) > plot(nom)
效果圖如下 由于該數(shù)據(jù)中的生存時間time是以天為單位就算的,因此在計算年的時候進行了轉(zhuǎn)換。雖然加上了我們想要的信息,但是發(fā)現(xiàn)坐標軸的標簽重疊了,此時有幾種方法可以解決這個問題 1. 增加畫布的寬度,將寬度加大之后繪圖區(qū)域變寬,標簽間的距離變大,重疊情況會減少 2. 設置標簽的文字大小,在plot函數(shù)中通過cex.axis參數(shù)設置大小 3. 重新設置坐標軸的間隔,通過fun.at參數(shù),用法如下 > nom <- nomogram(f, + fun = list(function(x) med(lp = x), + function(x) surv(365, x), + function(x) surv(365 * 3, x), + function(x) surv(365 * 5, x)), + funlabel = c("Median Survival Time", + "1-year Survival Probability", + "3-year Survival Probability", + "5-year Survival Probability"), + fun.at = list(c(10000, 20000, 30000, 40000, 60000, 90000), + c(0.96, 0.97, 0.98, 0.99, 0.995), + c(0.90, 0.92, 0.94, 0.96, 0.98), + c(0.6, 0.8, 0.9, 0.95)), + lp = F) > plot(nom)
效果圖如下 綜合使用以上3種方案,就可以得到一個文字標簽不會重疊的列線圖啦。
|