回归模型大杂烩-多重线性回归
1模型应用场景:当我们需要分析多个自变量与1个因变量之间的线性关系时,可采用多重线性回归进行分析。
2模型变量要求:
自变量:多个自变量,既可以是连续变量(如年龄),也可以是二分类变量(如性别),无序多分类或有序多分类变量均可。
因变量:1个因变量,需为连续变量(如收缩压)。
3模型表达式和解读:假设因变量为y,自变量为x1-xn,则模型表达式如下:y=b1*x1+b2*x2+...+bn*xn+截距+e
b1、b2。。bn为偏回归系数,表示在其他变量不变的情况下,自变量每变化1个单位对y的影响。当然,此时的b1-bn为非标准化回归系数,若想得到标准化回归系数,可将原始数据进行标准化后重新拟合模型;
截距:又称常数项,表示自变量均为0时,y的估计值;
e:代表残差(又称随机误差),是模型无法捕捉的部分。
4.模型应用条件:
(1)线性:即自变量x与因变量y(或残差)呈线性关系
(2)独立性:即残差之间相互独立。
(3)正态性:即因变量符合正态分布,严格来说指多重线性模型的残差符合正态分布。
(4)方差齐性:即方差相等,指对于每一个x对应的因变量y的方差相等。那么对于多重线性模型,检验模型的残差的方差是否相等。
5.多重共线性:即多个自变量之间存在高度相关,可能引起各变量估计系数出错,甚至导致模型无法收敛。
常用共线性诊断指标:
方差扩大因子(Variance Inflation Factor,VIF):指由于共线性所导致的参数估计值的方差增加量,当VIF大于10,通常表示共线性很强
容忍度(Tolerance, TOL):方差扩大因子VIF的倒数。当TOL小于0.1,通常表示共线性很强
条件指数(condition index):当条件指数大于10,可认为存在共线性;条件指数大于30,可认为存在严重共线性
6.样本量要求:纳入至少模型自变量数10倍以上的样本量,如自变量有10个,则总观测数至少有100个。
目的:以性别、年龄、省份、城乡、婚姻、文化程度、个人年收入为自变量;收缩压为因变量。采用多重线性回归模型进行分析收缩压的影响因素。
变量赋值表
变量 | 变量类型 | 赋值 | 属于 |
性别 | 2分类 | 1=男;2=女 | 自变量 |
年龄 | 连续 | | |
省份 | 无序多分类 | 21/23/32/37/41/42/43/45/52 | |
城乡 | 2分类 | 1=城市,2=农村 | |
婚姻 | 无序多分类 | 1~5 | |
文化程度 | 有序多分类 | 1~5 | |
个人年收入 | 连续 | | |
收缩压 | 连续 | | 因变量 |
SAS实践代码:
/*变量名可以设定为中文*/
option validvarname=any;
/*先导入数据*/
PROC IMPORT OUT= mydata
DATAFILE= "E:\02学习\经验\01医学统计\回归模型大荟萃-多重线性回归\多重线性回归.xlsx"
DBMS=xlsx REPLACE;
GETNAMES=YES;
sheet="sheet1" ;
quit;
/*拟合模型*/
proc genmod data=mydata desc;
class 性别 省份 城乡 婚姻;/*分类变量放到class语句后*/
model 收缩压 =性别 年龄 省份 城乡 婚姻 文化程度 个人年收入/dist=Normal link= Identity;
quit;
上图展示了模型纳入的观测数,自动去除了含有缺失值的观测,最终纳入分析3474。
结果解读:如性别以性别=2为参照,性别=1的平均收缩压增加3.3453。
R实践代码:
#导入数据
.libPaths()#查看R包位置
.libPaths("D:/Program File/R/R-4.3.2/library")#定义包安装位置
setwd("E:/02学习/经验/01医学统计/回归模型大荟萃-多重线性回归")#设置工作空间
getwd()#加载工作空间
library(readxl)
mydata<-read_excel("多重线性回归.xlsx")
#分类变量因子化
a<-c("性别","省份","城乡","婚姻")
mydata[,a]<-lapply(mydata[,a],as.factor)
#设置分类变量的参照组
mydata$性别<-relevel(mydata$性别, ref="2")
mydata$省份<-relevel(mydata$省份, ref="52")
#建立模型
#方法1
fit1<-glm(收缩压~性别+年龄+省份+城乡+婚姻+文化程度+个人年收入,data=mydata,family=gaussian)
fit1
summary(fit1)
结果解读:上述R结果同样提示删除了1015个观测。并且估计的结果与SAS一致。但是无法给出bata值的置信区间。
#方法2
fit1<-lm(收缩压~性别+年龄+省份+城乡+婚姻+文化程度+个人年收入,data=mydata)
fit1
summary(fit1)
#我们可以采用epiDisplay包计算置信区间
install.packages("epiDisplay")
library(epiDisplay)
result<-regress.display(fit1,
decimal = 3)#保留3位小数
#将计算结果保存为table
table<-result[["table"]]
#导出table为csv文件
table<-print(table)
write.csv(table,file="table.csv")