文章目录
R语言|临床预测模型(二)
一般线性模型
(一)线性回归(Linear regression)
根据自变量数目多少,可分为简单线性回归和多重线性回归,只有一个自变量即为简单线性回归,多个自变量即为多重线性回归。相较于简单线性回归,多重线性回归更为可靠,但仍可能出现欠拟合状况,且并非纳入自变量越多越好。
1. 概述
(1)相关
-
相关 ≠ 线性回归
-
相关:不确定性的相关关系,指两个变量在宏观上存在关系,但未精确到数学函数关系,当变量X增加时,变量Y随着增加或者减少,但变量Y的具体取值不能由变量X确定,可分为正相关、负相关和零相关。
-
线性回归:确定性的数学函数关系。
-
-
根据变量数值分布类型不同,相关可分为直线相关、秩相关、列联相关等。
-
秩相关:当变量的数值不符合正态性或为等级资料时,宜采用秩相关,主要利用变量数值的秩次替代原始数据进行相关分析。
-
列联相关:针对于分类变量。
-
直线相关:可计算皮尔森(Pearson)相关系数 r,r > 0为正相关,r < 0为负相关,r = 0为零相关或无相关,r绝对值越大相关程度越大。
r 的假设检验公式(p<0.05则存在统计学意义):
注意:
-
相关关系不等于因果关系
-
相关系数只是用于衡量变量间的相关程度,弱相关不一定表明变量间没有关系
-
在直线相关中,极端值对相关系数的影响较大
-
在相关关系成立的数据范围之外外推应谨慎,通常可内推
-
数据的间杂性可能存在虚假相关
(a)样本甲和样本乙两个变量均为正相关,但混合在一起则显示无相关
(b)样本甲乙两变量均无相关,但混合在一起显示存在正相关
-
-
(2)回归
-
回归:用回归方程表示变量间的依存关系
a 为截距,其单位与因变量 Y 相同,在临床研究中通常没有实际意义,因为自变量X大多取不到 0
b 为斜率,也称为回归系数
简单线性回归中,自变量 X 的回归系数 b 的假设检验(p<0.05存在统计学意义)
RMSE 在排除了自变量 X 对因变量 Y 的线性影响后,用于衡量因变量 Y 随机波动大小,可以反映数据的离散化程度,在多因素逐步回归分析中作为自变量 X 引入和剔除的标准之一。
-
简单线性回归分析的数据需满足以下条件:
- 正态性:给定自变量 X,因变量 Y 符合正态分布,即双变量正态分布
- 独立性:各观测的因变量 Y 值之间应符合独立性,传染病相关研究通常不符合
- 线性:自变量 X 与因变量 Y 之间应符合线性关系,可通过绘制散点图判断是否符合线性假设
- 方差齐性:因变量 Y 的方差不会随着自变量 X 的变化而变化
-
在临床工作中,多重线性回归更为常见
2. 线性回归实战
对于相关和线性回归,一般是从研究不确定性的相关关系开始,再将其逐步完善为确定性的数学函数关系。
(1)简单线性回归
a. 回归拟合
简单线性回归可以使用 lm()
、glm()
、rms
包中的 ols()
进行拟合,结果完全等价。
# 查看示例数据 women,共2个变量(height、weight),15个研究对象
str(women)
# 相关分析(Pearson),不指定 y 则默认为自身
cor(x=women, method = c("pearson"))
# 对 Pearson 相关系数 r 做统计学假设检验
cor.test(x=women$height, y=women$weight, method = c("pearson"))
# 简单线性回归
lmfit <- lm(formula=weight~height, data=women)
summary(lmfit)
b. 回归检验
由于简单线性回归具有一定的适用条件,此处对其进行了判断。
# 线性假定
plot(x=women$height,
y=women$weight,
xlab="height",
ylab="weight")
# 双变量正态性检验
# install.packages("mvnormtest")
library(mvnormtest)
# mshapiro.test 无法处理数据框,只能处理矩阵,故需要先使用 t() 将其转换为矩阵
mshapiro.test(t(women))
# p<0.05说明不符合双变量正态分布
当数据不符合双变量正态性时,如果其不是严重偏态,仍可以使用简单线性回归。
# 查看变量的分布情况
library(car)
scatterplotMatrix(x=women, main="Scatter Plot Matrix")
# 双变量正态性检验,生成线性回归模型诊断图
par(mfrow=c(2,2))
plot(lmfit)
-
残差与拟合值图 (Residuals vs Fitted)
- 目的:检查线性关系假设和均匀性假设(残差的等方差性)。
- 图形解释
- 横轴是拟合值(Fitted Values),纵轴是标准化残差(Residuals)。
- 如果模型正确指定,图中的点应该随机分布在横轴附近,没有明显的模式。
- 如果图中出现曲线模式,说明模型可能有非线性关系未捕捉。
- 如果残差的分散程度随拟合值增加或减少,可能表明异方差性问题。
-
正态 Q-Q 图 (Normal Q-Q)
-
目的:检查残差是否符合正态分布的假设。
-
图形解释
- 横轴是标准正态分布的理论分位数,纵轴是样本残差的分位数。
- 如果残差符合正态分布,图中的点应该大致沿着一条直线分布。
- 如果点偏离直线,特别是在两端,说明残差可能不是正态分布,可能存在重尾或轻尾数据。
- 横轴是标准正态分布的理论分位数,纵轴是样本残差的分位数。
-
-
标量化残差与杠杆图 (Scale-Location or Spread-Location Plot)
- 目的:进一步检查**残差的均匀性(方差齐性)**假设。
- 图形解释
- 横轴是拟合值(Fitted Values),纵轴是标准化残差的平方根(Square Root of Standardized Residuals)。
- 理想情况下,点应随机分布,且呈水平带状分布。
- 如果残差随着拟合值变化而呈现出某种模式,可能表明异方差性问题。
-
杠杆值与标准化残差图 (Residuals vs Leverage or Cook’s Distance Plot)
- 目的:识别可能对模型有过度影响的数据点(高杠杆点或异常值)。
- 图形解释
- 横轴是杠杆值(Leverage),纵轴是标准化残差。
- 该图显示哪些点对模型拟合影响较大(即,离群点或影响点)。
- 图中会标示出 Cook’s 距离(Cook’s Distance)的轮廓线,点在这些轮廓线之外说明它们对模型有很大影响。
对于方差齐性检验,还可以使用 car
包中的 ncvTest()
函数或 SpreadLevelPlot()
函数。
独立性检验一般基于经验主观判断。
**【总结】**若数据轻微违反双变量正态性或者方差齐性,仍然可以进行简单线性回归,因为简单线性回归对轻微偏态数据、异方差数据的稳健性较好。另外,在本案例中,样本量较小是散点出现轻微偏态的主要原因。若增加样本量,变量height、weight必然满足正态性。
(2)多重线性回归
a. 回归拟合
# 载入示例数据
packageurl <- "https://cran.r-project.org/src/contrib/Archive/ElemStatLearn/ElemStatLearn_2015.6.26.tar.gz"
install.packages(packageurl, repos=NULL, type="source")
data("prostate", package = "ElemStatLearn")
对于非高维数据,可以在正式统计分析前,使用 str()
、summary()
、head()
、names()
查看数据全貌信息。
# 各变量相关性检验
cor.prostate <- cor(x=prostate, method = c("pearson"))
round(cor.prostate, 3) # 保留三位小数
# 相关性矩阵可视化
library(corrplot)
corrplot(cor.prostate, method = "ellipse") # 选定图形为椭圆
# 其他可视化方法
library(ggcorrplot)
ggcorrplot(cor.prostate, method = "circle",
hc.order = TRUE, hc.method = "ward.D", # 聚类,对于代谢组学和基因组学数据很有必要
outline.color = "white", # 设置外边框颜色
ggtheme = theme_bw(), # 设置图形格式
type = "upper", # 设置只显示上半部分结果
lab = TRUE, lab_size = 4, # 设置显示相关系数,并设定字体大小
colors = c("#6D9EC1", "white", "#E46726"))
# 多重线性回归,此处为了简便纳入了所有自变量
multifit <- lm(formula = lpsa~lcavol+lweight+age+lbph+svi+lcp+gleason+pgg45, data = prostate)
summary(multifit)
**注意:**由于简单线性回归只有一个变量,其 F 值为 t^2,两者完全等价。
# 使用 anova 查看方差分析表,其结果与回归系数表相似
anova(multifit)
b. 回归检验
在多重线性回归中,也需要对其使用条件进行检验。
par(mfrow = c(2,2))
plot(multifit)
- 左上角图形用来说明因变量与自变量的线性关系。可以发现,残差值Residuals与预测值Fittedvalues没有明显关联。随预测值Fitted values的变化,残差保持稳定,即说明因变量与自变量之间存在线性关系。
- 左下角图用来检查方差齐性,其线段两侧散点呈随机分布,说明其方差齐。
- 右上角图形用来检查残差是否符合正态性,可以发现散点轻微偏离虚线,残差呈轻微偏态。
- 变量是否满足独立性,一般靠主观判断。
# 使用 lmtest 包中的 bptest 检验方差齐性
# install.packages("lmtest")
library(lmtest)
bptest(multifit)
在多重线性回归中,还应当考虑多重共线性问题。
# 检验多重共线性
# packageurl <- "https://cran.r-project.org/src/contrib/Archive/pbkrtest/pbkrtest_0.4-4.tar.gz"
# install.packages(packageurl, repos=NULL, type="source")
# install.packages("car")
library(car)
vif(multifit)
输出结果为各自变量的方差膨胀因子 VIF,如果小于 5 或者 10 则该自变量不存在多重共线性,如果大于 5 或者 10 则存在多重共线性问题,不可直接拟合模型,应该使用岭回归或其它降维方法。
补充:处理多重共线性的策略
-
移除变量:如果某些变量之间存在高共线性,可以考虑从模型中移除一些变量。
-
合并变量:将相关的变量合并为一个新变量,例如,通过计算几个相关变量的平均值。
-
增加样本量:有时增加样本量可以帮助减少共线性带来的影响,因为更多的数据提供了更多的信息,有助于更准确地估计模型参数。
-
正则化方法:使用如岭回归(Ridge Regression)或 LASSO 这类引入惩罚项的技术可以有效地处理共线性问题。
# 绘制预测值与实际值散点图,查看模型拟合准确性,以下两种方法结果相同
par(mfrow = c(1,2))
plot(x = prostate$lpsa, y = predict(multifit), xlab = "实际值", ylab = "预测值")
plot(x = prostate$lpsa, y = fitted(multifit), xlab = "实际值", ylab = "预测值")
因变量Ipsa的预测值与实际值较为一致,说明模型拟合准确性较高。
此处也可以计算 RMSE、MSE、MAE 等指标来量化模型的准确性,其计算较为简单。
**【总结】**相关 vs 线性相关
- 联系:
- 两者均表示线性关系。
- 相关系数与回归系数的符号相同,共变方向一致。
- 假设检验的结果完全等价。
- 相关系数与回归系数存在数学运算关系。
- 可以用回归解释相关。
- 区别:
- 相关系数没有单位,回归系数有单位,所以相关系数与单位无关,回归系数与单位有关。
- 相关表示相互关系,回归表示依存关系。
- 对资料的要求不同:当变量X和Y都是随机变量时,可以进行相关和回归分析;当变量Y是随机变量(变量X可控制)时,理论上只能做回归而不能做相关分析,如变量X为性别时。