R语言lm线性回归定性定量变量误识别问题求解
问题场景
正在R中开展同时包含定性变量与定量变量的线性回归分析,所用数据集样例结构如下:
trip X year A 10 500 2019 B 11 600 2019 C 9 450 2020
建模目标为将trip列对应"A"维度的指标作为被解释变量,其余变量作为解释变量构建回归模型。
当前遇到的问题:纳入spécialité这类定性变量时,模型会误将年份等其余定量变量识别为定性变量,针对2019、2020等不同年份取值拆分单独生成系数做回归。
当前使用的建模代码如下:
lm_amb <- lm(reg_spé_amb[,3] ~ reg_spé_amb[,2] + reg_spé_amb[,1] + reg_spé_amb[,4]) summary(lm_amb)
运行后得到的错误回归结果形式如下:
Estimate std error intercept 400 26 reg_spé_amb[, 2]10 88 66 reg_spé_amb[, 2]11 64 10 reg_spé_amb[, 1]A 70 80 reg_spé_amb[, 4]2019 80 90
预期输出为:获得变量A对应的系数、年份变量作为整体的统一系数,而非按每个年份取值拆分生成的单独系数。
问题根因
出现该问题由两个常见错误导致:
- 调用
lm()时使用数据框[,列索引]的方式逐列传入变量,函数无法继承数据框中各列预先设置的变量类型属性,容易将数值类列误判为分类变量 - 数据导入环节,年份、X这类本应为数值型的定量变量,可能因为列中存在特殊字符、缺失值标记不规范,被自动读取为因子(factor)或字符(character)类型,
lm()遇到这类类型的输入会默认按分类变量生成哑变量,也就是你看到的按变量取值拆分单独系数的现象。
解决方案
步骤1:建模前显式指定各列变量类型
先逐列检查变量类型,将定量变量显式转为数值型,定性变量显式转为因子型,参考代码如下:
# 将定量变量X、year转为数值型 reg_spé_amb$X <- as.numeric(reg_spé_amb$X) reg_spé_amb$year <- as.numeric(reg_spé_amb$year) # 将定性变量trip转为因子型 reg_spé_amb$trip <- as.factor(reg_spé_amb$trip)
如果执行
as.numeric()时出现强制转换警告,说明对应列存在非数值的异常内容,需要先清理脏数据再完成类型转换。
步骤2:使用标准语法调用lm()函数
放弃列索引传参的写法,通过data参数绑定建模用的数据框,公式中直接写入列名即可,这种写法下lm()可以正确识别各列预设的变量类型,不会出现类型误判。参考代码如下:
# 注意将公式左侧的被解释变量名替换为你数据集第三列的真实列名 lm_amb <- lm(真实被解释变量列名 ~ X + trip + year, data = reg_spé_amb) summary(lm_amb)
步骤3:按需提取目标系数
如果仅需要trip变量对应A类的系数,以及year变量的统一系数,建模完成后直接通过coef()函数提取即可:
# 提取模型全部系数 all_coef <- coef(lm_amb) # 提取trip对应A类的系数 coef_A <- all_coef["tripA"] # 提取year作为连续变量的统一系数 coef_year <- all_coef["year"]
按上述步骤调整后,模型输出中year将仅返回一个统一的回归系数,不会再出现按年份取值拆分哑变量的问题,定性变量也会按因子水平正确生成对应系数。
内容的提问来源于stack exchange,提问作者user19304348
相关产品推荐
相关产品推荐

