01.08 如何建立非線性迴歸預測模型

在統計分析中,根據變量的不同類型可以建立不同的預測模型,如果因變量是連續型變量,最常見的是建立線性迴歸模型。但是,建立線性迴歸模型有很多前提條件(可以參考: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論文!


分享到:


相關文章: