R语言lm()实现无截距多元线性回归遇单预测变量问题求助
多元线性回归拟合问题修正与系数对比实现
问题说明
使用lm()拟合无截距多元线性回归时,X.mat.train是含190个观测的多列矩阵,但模型仅输出单个系数,无法得到每个预测变量对应的估计值。
错误原因
公式y.train~0+ X.mat.train中,直接传入矩阵会被R识别为单个整体变量,而非展开为矩阵的每一列作为独立预测变量,因此仅拟合出一个系数。
修正方案与完整代码
1. 正确拟合无截距多元线性回归
将矩阵转换为数据框,让lm()自动识别每一列作为独立预测变量,或者用动态公式生成方法:
# 方法一:矩阵转数据框,用.表示所有列作为预测变量 simple.fit <- lm(y.train ~ 0 + ., data = as.data.frame(X.mat.train)) # 方法二:用reformulate生成公式(适合已知矩阵列名的场景) # formula <- reformulate(colnames(X.mat.train), response = "y.train", intercept = FALSE) # simple.fit <- lm(formula) # 查看回归结果 summary(simple.fit)
2. 提取估计系数向量
此时summary(simple.fit)$coefficients会包含每个预测变量的系数,提取第一列即可得到完整的估计系数向量:
estimated_coeff <- summary(simple.fit)$coefficients[, 1]
3. 估计系数与真实系数的对比绘图
按照需求绘制两者绝对差值的图表,同时提供系数对比散点图作为补充:
# 先检查系数长度是否匹配(矩阵列数需等于真实系数向量长度) if(length(estimated_coeff) != length(beta.vec)) { stop("估计系数与真实系数长度不匹配,请检查X.mat.train的列数和beta.vec的维度") } # 计算绝对差值 abs_difference <- abs(estimated_coeff - beta.vec) # 绘制绝对差值柱状图 barplot(abs_difference, names.arg = names(estimated_coeff), main = "估计系数与真实系数的绝对差值", xlab = "预测变量", ylab = "绝对差值", col = "lightblue", cex.names = 0.8) # 调整标签字号避免重叠 # 绘制真实系数与估计系数的散点对比图 plot(beta.vec, estimated_coeff, main = "真实系数 vs 估计系数", xlab = "真实系数值", ylab = "估计系数值", pch = 16, col = "darkred") abline(a = 0, b = 1, lty = 2, col = "blue") # 添加y=x参考线,便于对比
内容的提问来源于stack exchange,提问作者r010101
相关产品推荐
相关产品推荐

