在統計分析中,根據變量的不同類型可以建立不同的預測模型,如果因變量是連續型變量,最常見的是建立線性迴歸模型。但是,建立線性迴歸模型有很多前提條件(可以參考:SPSS操作:簡單線性迴歸(史上最詳盡的手把手教程))。
由於實際的臨床研究中,變量之間關係複雜,因變量和自變量之間並非呈現線性關係,如果強行建立線性迴歸模型,就會影響模型的預測準確性。那麼對於此類數據,因變量和自變量之間可能是複雜的非線性函數關係,我們可以嘗試建立非線性迴歸模型,例如曲線模型、迴歸樣條等。
本期內容我們將通過案例分析,結合R軟件介紹如何建立非線性迴歸模型。
案例說明(模擬數據)
臨床中心衰、肝硬化的病人,常伴有體液瀦留和低鈉血癥,醫生會選擇使用託伐普坦進行超濾治療,但是目前這個藥物價格昂貴,未能廣泛使用。
假設有一種新的利尿劑上市,價格便宜,且具有類似作用。為了探究新利尿劑的治療效果,研究人員開展了一項臨床試驗,共入組149人(數據庫名稱為urinetest),因變量為患者每日尿量(變量名為urine),自變量為每日新利尿劑使用劑量(變量名為dosage)。
研究目的是為兩者建立最合適的迴歸模型,
分析步驟如下:1、初步探索數據
2、建立簡單線性迴歸
3、建立曲線方程
4、建立分段迴歸
5、建立樣條迴歸
6、構建局部加權迴歸
7、建立廣義可加模型
8、總結
分析步驟
分析數據前的準備工作
1、點擊impordataset導入數據urinetest
2、數據預覽,View(urinetest)
3、加載相關的包,請加載前用install.packages命令安裝好
library(ggplot2)
library(segmented)
library(splines)
library(Hmisc)
library(rms)
library(mgcv)
library(caret)
一、數據探索
ggplot(urinetest, aes(dosage, urine) )+geom_point#繪製散點圖
從圖形可以看出,當利尿劑使用劑量<25ml時,病人的尿量在2000-2300ml之間波動。當利尿劑劑量為25-30ml時,兩者成線性關係。當>30ml時,隨著利尿劑劑量的增加,尿量不再出現明顯的變化。
由此看出,兩者呈現出一種非線性的變化關係,存在閾值效應和飽和效應,在不同藥物劑量範圍內,劑量-反應關係函數差別很大,如果強行用單一的線性迴歸來建立預測建模,不符合臨床實際,模型預測的準確性將會大打折扣。下面我們先用線性迴歸來分析一下。
二、建立線性迴歸模型
model.lm
summary(model.lm)#查看回歸模型結果
模型結果如下:
(1)殘差的最大值、最小值、中位數等,描述的是預測值和實際值之差的分佈;
(2)迴歸方程的係數和統計學檢驗結果;
(3)模型的擬合情況。其中Residual standard error為殘差標準誤,是模型用自變量預測因變量的平均誤差,該值越小說明模型擬合越好;Adjusted R-squared為調整R2,可理解為模型對數據集的解釋程度,該值越大模型擬合程度越好。本研究中線性迴歸模型的殘差標準誤的值為159.8;調整R2為0.5902。
接下來看看線性迴歸的擬合效果
ggplot(urinetest, aes(dosage, urine) ) +
geom_point +
stat_smooth(method = lm, formula = y ~ x)
從圖形可以直觀看出擬合直線與數據點存在一定的偏離,擬合效果不佳。
三、建立曲線方程
下面嘗試用曲線模型去擬合,例如對數曲線型、指數曲線型、S曲線型等。我們以對數曲線為例。
model.log
summary(model.log)#查看模型概況
對數曲線模型的殘差標準誤的值為151.5,調整R2 為0.6318,兩個指標比簡單線性迴歸模型略有提高。
#擬合曲線
ggplot(urinetest, aes(dosage, urine)) +
geom_point +
stat_smooth(method = lm, formula = y ~ log(x))
從圖形可以看出,擬合曲線的效果較直線有所改善。
四、建立分段迴歸模型
在數據探索時我們發現,藥物劑量和尿量的散點圖分佈呈現三段式變化特徵,我們以此為依據,建立一個分段迴歸模型。在R中我們可以使用segmented這個包。
model.segmented
summary(model.segmented)#查看模型概況
分段迴歸結果顯示,軟件自動將模型分成了兩段,拐點為dosage=32.534,殘差標準誤為124.9,調整R2為0.7499,兩個指標較曲線模型得到了進一步提升。
#查看擬合效果
plot(dosage,urine, pch=1, cex=1.5)
abline(a=coef(model.lm)[1],b=coef(model.lm)[2],col="red",lwd= 2.5)
plot(model.segmented, col='blue', lwd= 2.5 ,add=T)
在構建的上述模型中,函數自動將模型分成了兩段。但根據對散點圖的分析,我們認為將模型分為三段更為合適,此時可以手動設置25和30兩個劑量拐點,軟件會自動尋找附近的點做為最佳拐點。
#手動設置拐點,分三段迴歸
model.segmented2
summary(model.segmented2)#查看模型概況
軟件找到的兩個最佳拐點分別為24.075和30.166,此時分段迴歸模型的殘差標準誤為99.01,調整R2為0.8427,預測效果比曲線模型明顯提升。
#查看擬合效果
plot(dosage,urine, pch=1, cex=1.5)
abline(a=coef(model.lm)[1],b=coef(model.lm)[2],col="red",lwd= 2.5)
plot(model.segmented2, col='blue', lwd= 2.5 ,add=T)
五、樣條迴歸
上述提到的曲線方程和分段迴歸兩種方法都有一定的缺點。曲線方程是非局部的,當某一個因變量的值發生變化時,即使距離很遠的點也會受到影響。如果採用多項式建立曲線方程,當多項式的冪較高時,自變量的一個微小變化,就會引起因變量很大的變化,得出的模型不適合外推到其他數據樣本。而在分段迴歸模型中,每一段都是基於線性迴歸而建立的,拐點之間的連接顯得比較生硬。
那麼有沒有辦法建立一個既具有分段迴歸模型的優點,又可以擬合比較平滑的模型呢?樣條迴歸則兼具曲線方程和分段迴歸的優點,可以靈活的分段展示自變量與因變量之間的關係。樣條迴歸把數據集劃分成一個個連續的區間,劃分的點稱為節點,每個節點之間用單獨的模型(線性函數或者低階多項式函數)來擬合。節點越多,模型就越靈活。但是過多的節點也會導致過擬合問題,所以一般先嚐試設置3個節點為宜。
樣條迴歸很多種,我們主要講限制性立方樣條回歸。
model.spline
summary(model.spline)#查看模型概況
樣條迴歸模型的殘差標準誤為139.6,調整R2為0.6872。比線性迴歸和曲線迴歸好,但不如分段迴歸。
#樣條迴歸擬合效果
ggplot(urinetest, aes(dosage, urine) ) +
geom_point +
stat_smooth(method = lm, formula = y ~ rcs(x, c(20,30,35)) )
六、Lowess函數建立局部加權迴歸
以上介紹的模型都是參數模型,選擇什麼樣的曲線,設置多少個拐點,這些步驟都需要進行嘗試,但也會容易出現過擬合現象。於是有學者提出了Lowess非參數迴歸,它沒有迴歸係數可估計,只是在尋找一條擬合效果相對更好的曲線。
model.lowess
summary(model.lowess)#查看概況
#查看擬合
ggplot(urinetest, aes(dosage, urine)) +
geom_point +
stat_smooth
局部加權給一般只做數據探索,stat_smooth就是默認用lowess畫擬合圖
七、廣義可加模型
和lowess函數一樣,廣義可加模型也無法給出明確的係數,但它的適用範圍更廣,可以執行因變量與多個自變量之間的各種非參數擬合。
它可以是任意的單變量函數的疊加,這些函數既可以是線性,也可以是非線性。它的因變量可以服從二項分佈、Poisson分佈、Gamma分佈等更廣義的範疇。它的任務就是根據目前的數據,找出一條最貼合的曲線。
model.gam
summary(model.gam)#查看模型概況
廣義可加模型的調整R2為0.837,但沒有給出殘差標準誤的結果,所以我們需要利用模型生成預測值,用預測值和真實值進行比較,得出殘差標準誤為98.5,是上述眾多模型中表現最優秀的。
pr.gam
#計算RSME和R方
data.frame(RMSE = RMSE(pr.gam, urinetest$urine),
R2 = R2(pr.gam, urinetest$urine))
#查看模型擬合情況
ggplot(urinetest, aes(dosage, urine) ) +
geom_point +
stat_smooth(method = gam, formula = y ~ s(x))
從圖形可以看出,廣義可加模型的曲線擬合效果非常好。雖然模型在本數據集中表現良好,但仍需要注意過擬合的情況。
八、總結
各個模型的擬合指標比較
通過比較模型指標,雖然廣義可加模型表現較好,可是它並不能提供係數,無法解釋變量之間的內在聯繫。而結合了專業背景而建立的分段迴歸模型表現相對更為優異。
分段迴歸的結果彙總如下:
為方便臨床應用,我們將劑量節點取整,分別為A=24和C=30,分段迴歸方程的書寫格式為:
Y=β0+β1X1+β2(X1-A)X2+β3(X1-C)X3
(1)當X1≤A時,即X≤24時,X2=0,X3=0,
Y=β0+β1X1=2168.470-0.692*X
(2)當A<X1≤C,即24<X≤30時,X2=1,X3=0,
Y=β0+β1X1+β2(X1-A)X2=2168.470-0.692*X+92.703*(X-24)=-56.402+92.011*X
(3)當X1>C,即X>30時,X2=1,X3=1,
Y=β0+β1X1+β2(X1-A)X2+β3(X1-C)X3
=2168.470-0.692*X+92.703*(X-24)-96.839*(X-30)=2848.768-4.828*X
由醫咖會與心聯喬治心臟健康研究中心(HHRC)聯合建立的心血管研究協作網絡及數據共享平臺(CDS)已經上線!
目前開放共享的數據為“中國房顫註冊研究”,共有2.5萬多房顫數據,歡迎來申請使用數據,發表SCI論文!
閱讀更多 醫咖會 的文章