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论文!


分享到:


相關文章: