Matlab多元回归变量筛选实战:从全变量到精简模型的逐步回归

发布时间:2026/9/18 17:09:51
Matlab多元回归变量筛选实战:从全变量到精简模型的逐步回归 简介一份围绕多元线性回归模型的数学建模完整实验报告适合统计学、经济学或商科方向的学生对照学习。文档以某市粮食年销售量与常住人口、人均收入、肉蛋鱼销量等变量的关系为案例完整展示从经济意义分析、散点图观察、初始模型建立到逐步回归筛选变量的全过程并在Matlab中求解释参数、完成R²、F统计量与P值检验最后给出与实际数据对比的预测验证。压缩包内共1个docx文件整体205KB报告主体包含数据表、图表说明和可参考的Matlab程序附录便于读者复现同类型回归分析。目前已有159人学习浏览。读者不仅能理解多元回归理论如何落地还能掌握用stepwise命令精简自变量、解读置信区间和统计量、判断模型优劣的实操思路可直接迁移到市场预测、政策评估等场景。1. 从粮食销售数据到多元回归为什么先扔进 regress 不是好主意拿到某市 1974 到 1987 年的粮食年销售量连带常住人口、人均收入、肉蛋鱼销量五个候选变量多数人的第一反应是构造一个 X 矩阵直接调用 Matlab 的 regress。但这个实验很有意思全变量回归跑出来的人均收入、蛋销量和鱼虾销量都不显著模型解释力反而比精简后更弱。这里的问题不是回归函数写错了而是没有先做变量筛选。这篇笔记把散点图观察、stepwise 逐步回归、统计检验和预测验证按实际建模顺序拆开重点解释为什么最终只保留人口和肉销量以及每个判断节点的技术依据。对准备数学建模竞赛的学生和日常做数据分析的人这条路径比背命令更有参考价值。2. 散点图与相关性分析用 Matlab 确定特征对 Y 的影响2.1 先看散点图是建模的纪律在跑任何回归之前先看因变量与每个自变量的散点图可以避免方向性错误。多元回归的前提假设是线性关系但线性关系是否存在、是否存在明显的弯曲趋势、有没有离群点拉偏系数这些从相关矩阵里看不出来。相关矩阵只能给出一个数值散点图却能看到趋势形态和异常值。实验报告里对 x2 人口数量使用了二次函数拟合对其他变量使用线性趋势观察这就是典型的散点图先行。如果一开始就把所有变量塞进线性模型x2 的真实关系可能被线性假设掩盖导致系数估计偏差。2.2 绘制五组散点图的 Matlab 代码数据只有 14 个年份手工录入也不容易出错。下面这段代码把 y 与 x2 到 x6 的关系画在同一个画布上。% 数据录入请按表1实际数据替换 y [ ... ]; % 粮食年销售量单位万吨 x2 [ ... ]; % 常住人口单位万人 x3 [ ... ]; % 人均收入单位元 x4 [ ... ]; % 肉销售量单位万吨 x5 [ ... ]; % 蛋销售量单位万吨 x6 [ ... ]; % 鱼虾销售量单位万吨 % 绘制 y 与每一个自变量的散点图 figure subplot(2,3,1); plot(x2, y, o); xlabel(x2 常住人口); ylabel(y 粮食销量); grid on subplot(2,3,2); plot(x3, y, o); xlabel(x3 人均收入); ylabel(y); grid on subplot(2,3,3); plot(x4, y, o); xlabel(x4 肉销售量); ylabel(y); grid on subplot(2,3,4); plot(x5, y, o); xlabel(x5 蛋销售量); ylabel(y); grid on subplot(2,3,5); plot(x6, y, o); xlabel(x6 鱼虾销售量); ylabel(y); grid on代码里subplot(2,3,k)将图像区域划分为两行三列第 k 个子图依次对应一个自变量。o指定散点标记为圆圈grid on打开网格方便对齐数据点位置。如果某个子图明显出现曲线趋势例如 x2 与 y 的关系向上凸起就需要在模型中加入二次项后再做显著性检验不能只凭视觉决定。2.3 从趋势判断是线性还是二次项从实验描述看x2 增大的时候 y 有向上增加的趋势图中拟合了二次函数而 x3、x4、x5、x6 与 y 的关系比较接近直线适合用线性模型。这里有一个容易被忽略的点散点图显示的二次趋势并不代表最终模型一定要保留二次项。因为 x2 本身可能与 x3、x4 等变量存在相关性二次项显著可能是吸收了其他变量的影响。正确的做法是先建立多元线性回归再用逐步回归筛掉不重要的变量最后回头看是否需要二次项。换句话说散点图是提出假设的工具不是拍板最终模型依据。3. 逐步回归 stepwise 剔除变量的完整套路3.1 多元回归的矩阵形式与 regress 输出多元线性回归的矩阵形式为y Xβ ε其中 X 的第一列通常是全 1 向量用于估计截距 β0后面的列对应各个自变量。ε 是随机误差项。Matlab 的 regress 函数要求输入 y 为列向量X 为样本×变量数矩阵并输出[b, bint, r, rint, stats] regress(y, X)b 是回归系数估计值bint 是每个系数的 95% 置信区间r 是残差rint 是残差置信区间stats 是一个向量依次包含 R²、F 统计量、对应 p 值和误差方差的估计。判断一个变量是否该留在模型里最直接的是看 bint 是否包含零点包含零点说明系数不显著实际取值可能为零变量应当舍弃。3.2 全变量初始模型的建立实验要求先建立包含所有解释变量的初始模型即y β0 β1x2 β2x3 β3x4 β4x5 β5x6 ε在 Matlab 中构建 X 矩阵并回归% 全变量初始模型X 包含常数项列 X_all [ones(14,1), x2, x3, x4, x5, x6]; [b_all, bint_all, r_all, rint_all, stats_all] regress(y, X_all);ones(14,1)生成 14 行全 1 列对应截距项。运行后重点看 stats_all 中的 R² 和 F 统计量。如果 R² 不高且 F 对应的 p 值大于 0.05说明整体模型不显著。另一个需要检查的是 bint_allx3、x5、x6 的置信区间很可能包含零点意味着这三个变量对 y 没有显著解释作用。直接删除是通常做法但这里更标准的方式是用逐步回归。3.3 stepwise 交互式筛选与最终模型Matlab 提供的 stepwise 函数可以用逐步法自动筛选变量避免手动反复增删。使用时需要特别注意stepwise 不允许 X 中包含全 1 列截距由函数内部处理。% 注意stepwise 的输入不包含常数项列 X_candidate [x2, x3, x4, x5, x6]; stepwise(X_candidate, y)运行后会弹出交互窗口显示每个候选变量的系数估计、t 统计量和 p 值并允许用户点击“Add All”或“Next Step”让程序按显著性自动加减变量。实验中选择保留 x2 和 x4剔除 x3、x5、x6。x3 人均收入理论上影响消费但在这个数据集中与人口或肉类销量存在共线性单独解释力被吸收。x5 蛋销量和 x6 鱼虾销量商品属性接近与 x4 肉类销量高度相关同时放入会引入多重共线性。筛选完成后的最终模型为y β0 β1x2 β2x4用改进后的变量重新回归得到精简模型的系数和统计量% 最终模型只保留 x2 和 x4 X_final [ones(14,1), x2, x4]; [b, bint, r, rint, stats] regress(y, X_final);对比 stats_all 和 stats可以观察到精简模型的 R² 更高F 统计量显著提升p 值小于显著性水平 α说明模型整体更可信。同时 bint 的每一行不包含零点所有保留变量均显著。4. 回归模型的统计检验与预测验证4.1 R2、F、P 这三个统计量怎么读R² 称为决定系数表示模型解释因变量变异的能力越接近 1 说明拟合越好。但它在样本量小、变量多的场景下很容易虚高因此还需要调整 R²避免靠增加变量数量来提升拟合度。F 统计量检验整个模型的显著性原假设是所有回归系数全为零。F 值超过临界值或对应 p 值小于 0.05才能说模型总体上有意义。P 值用于单个系数通常用 0.05 作为阈值大于 0.05 的变量应当考虑剔除。4.2 初始模型与最终模型对比表下面表格展示了两次模型的关键差异对比项初始模型所有变量最终模型仅x2与x4R²数值较低解释力不足数值提高拟合优度改善F统计量未达到临界值整体不显著大幅超过临界值回归显著系数的置信区间x3、x5、x6 的区间包含零点所有区间均不包含零点保留变量6 个变量全部参与仅人口与肉销售量为什么剔除变量后 R² 不降反升因为原本不显著的变量增加了回归的自由度消耗却没有带来足够的解释力这种情况下 R² 会被拖累。精简模型减少变量数量模型化方差被更有效地利用。4.3 回归预测与残差验证回归模型建立后需要验证预测能力。假设某年该市人口为 1050 万人肉销售量为 60 万吨代入最终模型即可计算预测销量% 预测示例x2_new、x4_new 按实际场景替换 x2_new 1050; % 示意值单位万人 x4_new 60; % 示意值单位万吨 y_pred b(1) b(2)*x2_new b(3)*x4_new; % 残差图验证线性假设 figure plot(r, o-); yline(0, --); xlabel(样本序号); ylabel(残差)预测前需要明确 b(1)、b(2)、b(3) 分别对应常数项、x2 的系数和 x4 的系数。将预测值与实际值比较如果误差在可接受范围说明模型可用。残差图是另一个重要验证工具残差应随机分布在零点上下不出现趋势性变化。若残差随拟合值增大而增大说明可能存在异方差需要对 y 取对数或使用加权回归。5. 回归系数经济含义与实战中的边界条件5.1 偏效应与边际解释回归系数的解释必须强调“控制其他变量不变”。最终模型里 β1 表示当肉销售量不变时常住人口每增加 1 万人粮食年销量平均增加 β1 万吨。β2 表示当人口数量不变时肉销售量每增加 1 万吨粮食年销量平均增加 β2 万吨。这里所有系数都大于零与人口增长增加粮食需求、肉类消费上升带动口粮替代的经济直觉一致。但在实际报告中不应使用“影响”或“导致”这类因果语言因为回归只能说明相关性不能排除遗漏变量偏误。5.2 变量筛选中容易踩的坑逐步回归本身存在风险。自动筛选只按统计显著性决策而 x3 人均收入在经济理论上应当影响粮食消费在这个实验里不显著很可能是因为与人口或肉类销量高度相关出现了多重共线性。判断多重共线性的常用指标是方差膨胀因子 VIFVIF 大于 10 时应当警惕。另一个坑是样本量过小。14 个样本对应 6 个变量平均每个变量样本量不足 3结果不可靠。经验法中样本量至少是变量数的 10 倍这里更适合只保留两三个变量。5.3 用留一法快速验证模型稳定性对于小样本数据一个简单有效的稳定性验证是留一法交叉验证。每次留出一个样本作为验证集用剩余 13 个样本训练模型预测被留出的样本计算预测误差并循环 14 次。mse 0; for i 1:14 % 当前样本作为验证集其余作为训练集 trY y; trY(i) []; trX [x2, x4]; trX(i,:) []; % 训练模型 b_tr regress(trY, [ones(13,1), trX]); % 预测第 i 个样本 y_hat b_tr(1) b_tr(2)*x2(i) b_tr(3)*x4(i); % 累计平方误差 mse mse (y(i) - y_hat)^2; end cv_mse mse / 14;代码中trX(i,:) []删除第 i 行数据trY(i) []同步删除对应标签。最终得到的 cv_mse 是留一法均方误差它比单纯看训练集 R² 更能反映模型对新数据的适应能力。如果 cv_mse 明显大于训练残差说明模型对特定年份过度拟合此时应该进一步缩减变量或考虑岭回归。本文还有配套的精品资源点击获取