# Lasso：拉索中如何做统计推断

Stata连享会   主页 || 视频 || 推文 || 知乎

New！ `lianxh` 命令发布了：

`. ssc install lianxh`

`. help lianxh`

E-Mail: yangjch7@mail2.sysu.edu.cn

Source： Stata Blogs: Using the lasso for inference in high-dimensional models

## 1. 引言

react 测度学生 $i$ 在一场测验中的反应时间
no2_class 测度学生 $i$ 所上学校的空气污染水平
${x}_{i}$ 可能需要包含在模型中的控制变量

linear `poregress` `dsregress` `xporegress`
logit `pologit` `dslogit` `xpologit`
Poisson `popoisson` `dspoisson` `xpopoisson`
linear IV `poivregress` / `xpoivregress`

## 2. Stata 命令及操作

### 2.1 PO 法

Step 1: 调用数据并将连续变量和因子变量及其交互项存入暂元

``````
webuse breathe, clear //调用数据

***********将连续控制变量存入暂元`ccontrols'中********************

local ccontrols "sev_home sev_school age precip age0  siblings_old  "

local ccontrols "`ccontrols' siblings_young no2_home green_home noise_school "

***********将因子控制变量存入暂元`fcontrols'中********************

local fcontrols "grade sex lbweight breastfeed msmoke "

local fcontrols "`fcontrols' feducation meducation overweight "

********将连续型、因子型控制变量及其交乘项存入暂元`ctrls'中*********

local ctrls "i.(`fcontrols') c.(`ccontrols') "

local ctrls "`ctrls' i.(`fcontrols')#c.(`ccontrols') "
``````

``````. describe react no2_class `fcontrols' `ccontrols'

variable name   type    format     label      variable label
--------------------------------------------------------------------
react           double  %10.0g              * Reaction time (ms)
no2_class       float   %9.0g                 Classroom NO2 levels
(ug/m3)
sex             byte    %9.0g      sex        Sex
lbweight        byte    %18.0g     lowbw    * Low birthweight
breastfeed      byte    %19.0f     bfeed      Duration of
breastfeeding
msmoke          byte    %10.0f     smoke    * Mother smoked during
pregnancy
feducation      byte    %17.0g     edu        Father's education
level
meducation      byte    %17.0g     edu        Mother's education
level
overweight      byte    %32.0g     overwt   * Overweight by WHO/CDC
definition
sev_home        float   %9.0g                 Home socio-economic
vulnerability index
sev_school      float   %9.0g                 School socio-economic
vulnerability index
age             float   %9.0g                 Age (years)
precip          double  %10.0g                Daily total
precipitation
age0            double  %4.1f                 Age started school
siblings_old    byte    %1.0f                 Number of older
siblings in house
siblings_young  byte    %1.0f                 Number of younger
siblings in house
no2_home        float   %9.0g                 Home NO2 levels
(ug/m3)
green_home      double  %10.0g                Home greenness (NDVI),
300m buffer
noise_school    float   %9.0g                 School noise levels
(dB)
``````

Step 2: 进行 PO 回归

``````poregress react no2_class, controls(`ctrls') //PO 法
``````

``````Partialing-out linear model          Number of obs                =      1,084
Number of controls           =          0
Number of selected controls  =          0
Wald chi2(1)                 =      11.39
Prob > chi2                  =     0.0007

------------------------------------------------------------------------------
|               Robust
react |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
no2_class |   1.472821   .4363526     3.38   0.001      .617586    2.328057
------------------------------------------------------------------------------
Note: Chi-squared test is a Wald test of the coefficients of the variables
of interest jointly equal to zero. Lassos select controls for model
estimation. Type lassoinfo to see number of selected variables in each
lasso.
``````

``````estimates store poplug
``````

PO 法采用的是多次 Lasso 方法来筛选控制变量。为说明 PO 方法的机理，我们考虑一个简单的线性模型：

• 1.采用 Lasso 方法，用 $y$ 对 $X$ 进行回归，选出能够最佳预测 $y$ 的控制变量 ${\stackrel{~}{X}}_{y}$
• 2.用 $y$ 对 ${\stackrel{~}{X}}_{y}$ 回归，得到残差 $\stackrel{~}{y}$;
• 3.采用 Lasso 方法，用 $d$ 对 $X$ 进行回归，选出能够最佳预测 $d$ 的控制变量 ${\stackrel{~}{X}}_{d}$
• 4.用 $d$ 对 ${\stackrel{~}{X}}_{d}$ 回归，得到残差 $\stackrel{~}{d}$;
• 5.用 $\stackrel{~}{y}$ 对 $\stackrel{~}{d}$ 回归，得到 $\gamma$ 的估计值和标准误。

`poregress` 命令默认采用的是基于 plugin 方法的 Lasso 回归，也可以通过在选项中添加 `selection()` 来使用其他检验方法，这部分也可以可参考上篇推文 Stata:拉索开心读懂-Lasso 入门

Step 3: 进一步分析

``````lassocoef ( ., for(react)) ( ., for(no2_class))//变量筛选结果对比
``````

``````-------------------------------------------
|   react   no2_class
---------------------+---------------------
age |     x
|
4th  |     x
|
2nd  |     x
|
sex#c.age |
0  |     x
|
feducation#c.age |
4  |     x
|
sev_school |               x
precip |               x
no2_home |               x
green_home |               x
noise_school |               x
|
2nd  |               x
|
_cons |     x         x
-------------------------------------------
Legend:
b - base level
e - empty cell
o - omitted
x - estimated

``````

``````lassoknots , for(react)//变量 react 的变量筛选
lassoknots , for(no2_class)//变量 no2_class 的变量筛选
``````

`````` lassoknots , for(react) //变量 react 的变量筛选

----------------------------------------------------------------------------------------------------
|              No. of           |
|             nonzero In-sample |                       Variables (A)dded, (R)emoved,
ID |   lambda      coef. R-squared |                            or left (U)nchanged
-------+-------------------------------+------------------------------------------------------------
(*) 1 | .1375306          5    0.1619 | A age               0.sex#c.age       3.grade#c.green_home
|                               |   4.feducation#c.age
----------------------------------------------------------------------------------------------------
* lambda selected by plugin assuming heteroskedastic.

. lassoknots , for(no2_class) //变量 no2_class 的变量筛选

----------------------------------------------------------------------------------------------------
|              No. of           |
|             nonzero In-sample |                       Variables (A)dded, (R)emoved,
ID |   lambda      coef. R-squared |                            or left (U)nchanged
-------+-------------------------------+------------------------------------------------------------
(*) 1 | .1375306          6    0.3411 | A precip            no2_home          sev_school
----------------------------------------------------------------------------------------------------
* lambda selected by plugin assuming heteroskedastic.
``````

### 2.2 DS 法

DS 法是 PO 法的拓展。简单来讲， DS 法是通过引入额外的控制变量使得估计结果更稳健。和 PO 法的语法结构类似，采用命令 `dsregress` 即可实现，最后将估计结构存储为 dsplug。

``````. dsregress react no2_class, controls(`ctrls') //DS 法

. estimates store dsplug

Double-selection linear model  Number of obs               =  1,084
Number of controls          =      0
Number of selected controls =      0
Wald chi2(1)                =  11.39
Prob > chi2                 = 0.0007

-------------------------------------------------------------------
|            Robust
react |    Coef.  Std. Err.    z    P>|z|  [95% Conf. Interval]
----------+--------------------------------------------------------
no2_class | 1.472821  .4363526   3.38   0.001   .617586    2.328057
-------------------------------------------------------------------
Note: Chi-squared test is a Wald test of the coefficients of the variables
of interest jointly equal to zero. Lassos select controls for model
estimation. Type lassoinfo to see number of selected variables in each
lasso.
``````

DS 法估计的结果和 PO 法相似，结果的解读也是相似的，不再此处赘述。

• 采用 Lasso 方法，用 $y$ 对 $X$ 进行回归，选出能够最佳预测 $y$ 的控制变量 ${\stackrel{~}{X}}_{y}$
• 采用 Lasso 方法，用 $d$ 对 $X$ 进行回归，选出能够最佳预测 $d$ 的控制变量 ${\stackrel{~}{X}}_{d}$
• 令 ${\stackrel{~}{X}}_{u}$ 为 ${\stackrel{~}{X}}_{y}$ 和 ${\stackrel{~}{X}}_{d}$ 的合集； 用 $y$ 对 $d$ 和 ${\stackrel{~}{X}}_{u}$ 回归，得到 $\gamma$ 的估计值和标准误。

Belloni, Chernozhukov, and Wei (2016) 指出，尽管在大样本情况下 DS 法和 PO 法拥有同样的性质，但在他们的模拟中，前者表现更好。在有限样本情形下，DS 法表现更好可能是因为这种方法引入的控制变量是在一次回归当中而非两次单独的回归。

### 2.3 XPO 法

XPO 法也被称为双重机器学习法 (DML)， Chernozhukov et al. (2018) 经过推导发现，这种方法相比于 PO 法而言在理论上具有更好的性质，并且在有限样本情形下也表现更好。其中，二者最为重要的差别是 XPO 法要求的稀疏条件更弱。在实际操作中，这意味着 XPO 法可以提供更可靠的统计推断，因为这种方法采用了样本拆分技术（split-sample techniques），从而可以引入更多的控制变量。

``````xporegress react no2_class, controls(`ctrls') //XPO 法

estimates store xpoplug
``````

``````Cross-fit partialing-out    Number of obs                =  1,084
linear model                Number of controls           =      0
Number of selected controls  =      0
Number of folds in cross-fit =     10
Number of resamples          =      1
Wald chi2(1)                 =  11.39
Prob > chi2                  = 0.0007

------------------------------------------------------------------
|            Robust
react |    Coef.  Std. Err.   z    P>|z|  [95% Conf. Interval]
----------+-------------------------------------------------------
no2_class | 1.472821  .4363526  3.38   0.001   .617586    2.328057
------------------------------------------------------------------
Note: Chi-squared test is a Wald test of the coefficients of the variables
of interest jointly equal to zero. Lassos select controls for model
estimation. Type lassoinfo to see number of selected variables in each
lasso.
``````

1. 将样本拆分为 2 折，分别为 A 和 B；
2. 使用子样本 A 进行变量筛选：
• 采用 Lasso 方法，用 $y$ 对 $X$ 进行回归，选出能够最佳预测 $y$ 的控制变量 ${\stackrel{~}{X}}_{y}$
• 用 $y$ 对 ${\stackrel{~}{X}}_{y}$ 回归，${\stackrel{~}{\beta }}_{A}$ 为估计系数；
• 采用 Lasso 方法，用 $d$ 对 $X$ 进行回归，选出能够最佳预测 $d$ 的控制变量 ${\stackrel{~}{X}}_{d}$
• 用 $d$ 对 ${\stackrel{~}{X}}_{d}$ 回归，${\stackrel{~}{\delta }}_{A}$ 为估计系数。
3. 用 A 子样中估计系数，计算 B 子样中的 $y$ 和 $d$ 的残差，具体公式分别为：
• $\stackrel{~}{y}=y-{\stackrel{~}{X}}_{y}{\stackrel{~}{\beta }}_{A}$
• $\stackrel{~}{d}=y-{\stackrel{~}{X}}_{d}{\stackrel{~}{\delta }}_{A}$
4. 将上述操作 2-3 反过来再做一遍，即先使用子样本 B 进行变量筛选：
• 采用 Lasso 方法，用 $y$ 对 $X$ 进行回归，选出能够最佳预测 $y$ 的控制变量 ${\stackrel{~}{X}}_{y}$
• 用 $y$ 对 ${\stackrel{~}{X}}_{y}$ 回归，${\stackrel{~}{\beta }}_{B}$ 为估计系数；
• 采用 Lasso 方法，用 $d$ 对 $X$ 进行回归，选出能够最佳预测 $d$ 的控制变量 ${\stackrel{~}{X}}_{d}$
• 用 $d$ 对 ${\stackrel{~}{X}}_{d}$ 回归，${\stackrel{~}{\delta }}_{B}$ 为估计系数。
5. 用 B 子样中估计系数，计算 A 子样中的 $y$ 和 $d$ 的残差，具体公式分别为：
• $\stackrel{~}{y}=y-{\stackrel{~}{X}}_{y}{\stackrel{~}{\beta }}_{B}$
• $\stackrel{~}{d}=y-{\stackrel{~}{X}}_{d}{\stackrel{~}{\delta }}_{B}$
6. 用 $\stackrel{~}{y}$ 对 $\stackrel{~}{d}$ 回归，便可得到 $\gamma$ 的估计值及标准误。

## 4. 参考文献

• Belloni, A., D. Chen, V. Chernozhukov, and C. Hansen. 2012. Sparse models and methods for optimal instruments with an application to eminent domain. Econometrica 80: 2369–2429.-PDF-
• Belloni, A., V. Chernozhukov, and C. Hansen. 2014. Inference on treatment effects after selection among high-dimensional controls. Review of Economic Studies 81: 608–650.-PDF-
• Belloni, A., V. Chernozhukov, and Y. Wei. 2016. Post-selection inference for generalized linear models with many controls. Journal of Business & Economic Statistics 34: 606–619.-PDF-
• Chernozhukov, V., D. Chetverikov, M. Demirer, E. Duflo, C. Hansen, W. Newey, and J. Robins. 2018. Double/debiased machine learning for treatment and structural parameters. Econometrics Journal 21: C1–C68.-PDF-
• Chernozhukov, V., C. Hansen, and M. Spindler. 2015a. Post-selection and post-regularization inference in linear models with many controls and instruments. American Economic Review 105: 486–90.-PDF-
• ——. 2015b. Valid post-selection and post-regularization inference: An elementary, general approach. Annual Review of Economics 7: 649–688.-PDF-
• Leeb, H., and B. M. Pötscher. 2008. Sparse estimators and the oracle property, or the return of Hodges estimator. Journal of Econometrics 142: 201–211.-PDF-
• Sunyer, J., et al. 2017. "Traffic-related Air Pollution and Attention in Primary School Children." 28(2): 181-189. -PDF-
• Wooldridge, J. M. 2020. Introductory Econometrics: A Modern Approach. 7th ed. Boston, MA: Cengage-Learning.
• 杨继超， 连享会推文 Stata:拉索开心读懂-Lasso 入门

## 5. 相关推文

Note：产生如下推文列表的命令为：
`lianxh lasso 高维 随机推断`

`ssc install lianxh, replace`

## 相关课程

http://lianxh.duanshu.com

### 课程一览

Note: 部分课程的资料，PPT 等可以前往 连享会-直播课 主页查看，下载。

#### 关于我们

• Stata连享会 由中山大学连玉君老师团队创办，定期分享实证分析经验。直播间 有很多视频课程，可以随时观看。
• 连享会-主页知乎专栏，400+ 推文，实证分析不再抓狂。
• 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标，输入简要关键词，以便快速呈现历史推文，获取工具软件和数据下载。常见关键词：`课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法`

✏ 连享会学习群-常见问题解答汇总：
https://gitee.com/arlionn/WD

New！ `lianxh` 命令发布了：

`. ssc install lianxh`

`. help lianxh`