在统计分析中,根据变量的不同类型可以建立不同的预测模型,如果因变量是连续型变量,最常见的是建立线性回归模型。但是,建立线性回归模型有很多前提条件(可以参考:SPSS操作:简单线性回归(史上最详尽的手把手教程))。

由于实际的临床研究中,变量之间关系复杂,因变量和自变量之间并非呈现线性关系,如果强行建立线性回归模型,就会影响模型的预测准确性。对于此类数据,应该如何处理呢?之前医咖会发布过的《R语言课程》,王九谊老师在“多项式回归、分段回归、限制性立方样条...”视频课程中已做了详细介绍。本文以临床医生的角度,通过案例分析,结合R软件来讲解如何建立非线性回归模,也对之前的视频教程内容作了延伸。

案例说明(模拟数据)

临床中心衰、肝硬化的病人,常伴有体液潴留和低钠血症,医生会选择使用托伐普坦进行超滤治疗,但是目前这个药物价格昂贵,未能广泛使用。

假设有一种新的利尿剂上市,价格便宜,且具有类似作用。为了探究新利尿剂的治疗效果,研究人员开展了一项临床试验,共入组149人(数据库名称为urinetest),因变量为患者每日尿量(变量名为urine),自变量为每日新利尿剂使用剂量(变量名为dosage)。

研究目的是为两者建立最合适的回归模型,分析步骤如下:

1、初步探索数据

2、建立简单线性回归

3、建立曲线方程

4、建立分段回归

5、建立样条回归

6、构建局部加权回归

7、建立广义可加模型

8、总结

分析步骤

分析数据前的准备工作

1、点击impordataset导入数据urinetest

2、数据预览,View(urinetest)



R语言 非参数cox回归 r语言非线性回归拟合_数据

3、加载相关的包,请加载前用install.packages命令安装好

library(ggplot2)
library(segmented)
library(splines)
library(Hmisc)
library(rms)
library(mgcv)
library(caret)

一、数据探索

ggplot(urinetest, aes(dosage, urine) )+geom_point#绘制散点图



R语言 非参数cox回归 r语言非线性回归拟合_线性回归_02

从图形可以看出,当利尿剂使用剂量<25ml时,病人的尿量在2000-2300ml之间波动。当利尿剂剂量为25-30ml时,两者成线性关系。当>30ml时,随着利尿剂剂量的增加,尿量不再出现明显的变化。

由此看出,两者呈现出一种非线性的变化关系,存在阈值效应和饱和效应,在不同药物剂量范围内,剂量-反应关系函数差别很大,如果强行用单一的线性回归来建立预测建模,不符合临床实际,模型预测的准确性将会大打折扣。下面我们先用线性回归来分析一下。

二、建立线性回归模型

model.lm

summary(model.lm)#查看回归模型结果



R语言 非参数cox回归 r语言非线性回归拟合_R语言 非参数cox回归_03

模型结果如下:

(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)



R语言 非参数cox回归 r语言非线性回归拟合_线性回归_04

从图形可以直观看出拟合直线与数据点存在一定的偏离,拟合效果不佳。

三、建立曲线方程

下面尝试用曲线模型去拟合,例如对数曲线型、指数曲线型、S曲线型等。我们以对数曲线为例。

model.log
summary(model.log)#查看模型概况



R语言 非参数cox回归 r语言非线性回归拟合_数据_05

对数曲线模型的残差标准误的值为151.5,调整R2为0.6318,两个指标比简单线性回归模型略有提高。

#拟合曲线
ggplot(urinetest, aes(dosage, urine)) + 
geom_point + 
stat_smooth(method = lm, formula = y ~ log(x))



R语言 非参数cox回归 r语言非线性回归拟合_数据_06

从图形可以看出,拟合曲线的效果较直线有所改善。

四、建立分段回归模型

在数据探索时我们发现,药物剂量和尿量的散点图分布呈现三段式变化特征,我们以此为依据,建立一个分段回归模型。在R中我们可以使用segmented这个包。

model.segmented 
summary(model.segmented)#查看模型概况



R语言 非参数cox回归 r语言非线性回归拟合_r 保留之前曲线_07

分段回归结果显示,软件自动将模型分成了两段,拐点为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