个人学习笔记,课程为数学建模清风付费课程
目录
在第七讲时,我们介绍了多元线性回归模型,估计回归系数使用的是OLS ,并在最后探讨了异方差和多重共线性对于模型的影响。事实上,回归中关于自变量的选择大有门道,变量过多时可能会导致多重共线性问题造成回归系数的不显著,甚至造成OLS 估计的失效。本节介绍到的岭回归和 lasso 回归在 OLS 回归模型的损失函数上加上了不同的惩罚项,该惩罚项由回归系数的函数构成,一方面,加入的惩罚项能够识别出模型中不重要的变量,对模型起到简化作用,可以看作逐步回归法的升级版;另一方面,加入的惩罚项能够让模型变得可估计,即使之前的数据不满足列满秩,在稍后的原理推导中我们将更加详细的说明这一点。
一、多元线性回归模型的推导
1.1古典回归模型:满足四个假定
1.1.1假定一:线性假定
1.1.2假定二:严格外生性
保证估计回来的回归系数无偏且一致
1.1.3无完全多重共线性
保证能估计出来
1.1.4球型扰动项
二、原理
1.1岭回归
岭回归 (Ridge regression: Hoerl and Kennard, 1970) 的原理和 OLS 估计类似,但是对系数的大小设置了惩罚项。
1.2lasso回归
三、岭回归和lasso回归的应用
Stata 中,我们可以安装 lassopack 命令来实现 Lasso 回归,Lassopack 包含三个 Lasso 相关的子命令(输入 help lassopack 可以查看详情): ‐ 子命令 lasso2 可进行 Lasso 估计 ; ‐ 子命令 cvlasso 可进行 K 折交叉验证( k‐fold cross validation ); ‐ 子命令 rlasso 可以估计惩罚项由数据决定或者高维情形(变量维度超过样本数)。
2.1安装lassopack命令
2.2使用lasso回归分析棉花产量例题
先将Excel数据导入到Stata(自变量的量纲相同所以不用标准化):
注:Matlab中zscore函数可以对数据进行标准化处理。
我们使用 K 折交叉验证的方法来选择最佳的调整参数。所谓的 K 折交叉验证,是说将样本数据随机分为 K 个等分。将第 1 个子样本作为 “验证集”(validation set )而保留不用,而使用其余 K-1 个子样本作为 “训练集”(training set )来估计此模型,再以此预测第 1 个子样本,并计算第 1 个子样本的 “均方预测误差”(Mean Squared Prediction Error )。其次,将第 2 个子样本作为验证集,而使用其余 K-1 个子样本作为训练集来预测第 2 个子样本,并计算第 2 个子样本的 MSPE 。以此类推,将所有子样本的 MSPE 加总,即可得整个样本的 MSPE 。最后,选择调整参数 ,使得整个样本的 MSPE最小,故具有最佳的预测能力。
cvlasso 单产 种子费 化肥费 农药费 机械费 灌溉费, lopt seed(520)
其中,选择项 “ lopt” 表示选择使 MSPE 最小的 λ ,选择项 “ seed(520)” 表示将随机数种子设为 520 (可自行设定),以便结果具有可重复性;默认 K=10(即 10 折交叉验证)。
上表右边第 1 列即为 Lasso 所估计的变量系数。其中,除常数项外,只有 3 个变量的系数为非零,而其余变量(未出现在表中)的系数则为 0 。考虑到作为收缩估计量的 Lasso 存在偏差(bias ),上表右边第 2 列汇报了 “ Post Lasso” 估计量的结果,即仅使用 Lasso 进行变量筛选,然后扔掉 Lasso 的回归系数,再对筛选出来的变量进行 OLS 回归。注意:以上结果可能随着我们之前设置的随机数种子变化,因为lasso 回归的估计是近似算法,且剔除的多重共线性变量是相对的。
四、总结:何时使用lasso回归?
我们首先使用最一般的 OLS 对数据进行回归,然后计算方差膨胀因子VIF,如果 VIF>10 则说明存在多重共线性的问题,此时我们需要对变量进行筛选。在第七讲时我们提到可以使用逐步回归法来筛选自变量,让回归中仅留下显著的自变量来抵消多重共线性的影响,学完本讲后,大家完全可以把lasso 回归视为逐步回归法的进阶版,我们可以使用 lasso 回归来帮我们筛选出不重要的变量,步骤如下:(1 )判断自变量的量纲是否一样,如果不一样则首先进行标准化的预处理;(2 )对变量使用 lasso 回归,记录下lasso回归结果表中回归系数不为 0 的变量,这些变量就是最终我们要留下来的重要变量,其余未出现在表中的变量可视为引起多重共线性的不重要变量。在得到了重要变量后,我们实际上就完成了变量筛选,此时我们只将这些重要变量视为自变量,然后进行回归,并分析回归结果即可。(注意:此时的变量可以是标准化前的,也可以是标准化后的,因为lasso 只起到变量筛选的目的)