You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:31:12