Home  /  Resources & support  /  FAQs  /  Why is there no intercept in lasso inferential commands? Is it possible to get an intercept?

Why is there no intercept in lasso inferential commands? Is it possible to get an intercept?

Title   Why is there no intercept in lasso inferential commands? Is it possible to get an intercept?
Author Miguel Dorta, StataCorp

The lasso inferential commands implement three lasso-based methods for estimating the coefficients and standard errors of specified variables of interest and for selecting from potential control covariates to be included in the model. The methods are double selection, partialing-out, and cross-fit partialing-out. For each of them, there are commands for linear, logistic, and Poisson regression models. Also, for both partialing-out and cross-fit partialing-out, there is a command for instrumental-variable linear regression.

This FAQ has been structured as follows:

The reason that an intercept is not reported

All the implemented methods perform a lasso stage, where multiple lasso models are fit to select controls, and a final estimation stage, where the coefficients and standard errors for the variables of interest are computed. The intercept is regarded as one of the controls (treated as always included); therefore, if an intercept is also added as a variable of interest, it will be perfectly collinear with the intercept in the controls. We do not report the selected controls because their standard errors would not be valid. Therefore, we do not report the intercept.

Computing a point estimate of the intercept after double-selection regressions

For the double-selection lasso regression commands (dsregress, dslogit, and dspoisson), a point estimate of the intercept can be computed in the final estimation stage.

In the examples below, we show you how to compute a point estimate of the intercept. We begin by loading one of the datasets used in the documentation.

. use https://www.stata-press.com/data/r17/breathe, clear
(Nitrogen dioxide and attention)

Next we create a global macro for a list of potential control covariates using factor-variable syntax, which implies 41 potential control covariates.

. global controlvars i.(sex grade overweight feducation msmoke)##c.(sev_home age) 

In the examples below, we will be using the same dataset and the global macro controlvars.

Example 1: dsregress

We fit a double-selection linear model for the react variable, specifying no2_class and no2_home as variables of interest and the controls from the global macro controlvars.

. dsregress react no2_class no2_home, controls($controlvars)

Estimating lasso for react using plugin
Estimating lasso for no2_class using plugin
Estimating lasso for no2_home using plugin

Double-selection linear model         Number of obs               =      1,053
                                      Number of controls          =         41
                                      Number of selected controls =          7
                                      Wald chi2(2)                =      20.99
                                      Prob > chi2                 =     0.0000

Robust
react Coefficient std. err. z P>|z| [95% conf. interval]
no2_class 1.94622 .4248716 4.58 0.000 1.113487 2.778953
no2_home -.3717156 .2445907 -1.52 0.129 -.8511047 .1076734
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 dsregress

The three "Estimating lasso" messages indicate that dsregress performed the lasso stage. The corresponding list of selected controls is stored in the macro e(controls_sel). This allows us to use regress to reproduce the point estimates of the final estimation stage, where the intercept takes on the value 904.10475.

. quietly regress react no2_class no2_home `e(controls_sel)' if e(sample), vce(robust)

. estimates store rep_dsreg

. etable, estimates(dsregress rep_dsreg) column(estimates) keep(no2_class no2_home 
  _cons) cstat(_r_b, nformat(%9.5f)) novarlab

dsregress rep_dsreg
no2_class 1.94622 1.94622
no2_home -0.37172 -0.37172
_cons 904.10475
Number of observations 1053 1053

Example 2: dslogit

Here we fit a double-selection logit model for the lbweight variable, specifying indicators for meducation as variables of interest, and we use the same potential controls from Example 1.

. dslogit lbweight i.meducation, controls($controlvars)

Estimating lasso for lbweight using plugin
Estimating lasso for 2bn.meducation using plugin
Estimating lasso for 3bn.meducation using plugin
Estimating lasso for 4bn.meducation using plugin

Double-selection logit model          Number of obs               =      1,058
                                      Number of controls          =         41
                                      Number of selected controls =          6
                                      Wald chi2(3)                =       1.70
                                      Prob > chi2                 =     0.6361

Robust
lbweight Odds ratio std. err. z P>|z| [95% conf. interval]
meducation
Primary .3385649 .4093585 -0.90 0.370 .0316559 3.621004
Secondary .2286818 .2718619 -1.24 0.215 .0222487 2.35049
University .2514901 .3000166 -1.16 0.247 .0242703 2.605953
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 dslogit

Similarly, dslogit performed a corresponding lasso stage and stored the selected controls in the macro e(controls_sel). So we can use logit to reproduce the point estimates of the final estimation stage, where the value for the implicit intercept is 0.09494.

. quietly logit lbweight i.meducation `e(controls_sel)' if e(sample), or vce(robust)

. estimates store rep_dslog

. etable, estimates(dslogit rep_dslog) column(estimates) keep(meducation _cons) 
  cstat(_r_b, nformat(%9.5f)) novarlab 

dslogit rep_dslog
meducation
Primary 0.33856 0.33856
Secondary 0.22868 0.22868
University 0.25149 0.25149
_cons 0.09494
Number of observations 1058 1058

Example 3: dspoisson

Now we fit a double-selection Poisson model for the correct variable, specifying no2_class and no2_home as variables of interest, and we specify the same potential controls as in the previous examples.

. dspoisson correct no2_class no2_home, controls($controlvars)
Estimating lasso for correct using plugin
Estimating lasso for no2_class using plugin
Estimating lasso for no2_home using plugin

Double-selection Poisson model        Number of obs               =      1,053
                                      Number of controls          =         41
                                      Number of selected controls =          3
                                      Wald chi2(2)                =       9.36
                                      Prob > chi2                 =     0.0093

Robust
correct IRR std. err. z P>|z| [95% conf. interval]
no2_class .9993293 .0002192 -3.06 0.002 .9988997 .9997591
no2_home 1.000062 .0000966 0.64 0.521 .9998728 1.000251
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 dspoisson

Analogously, dspoisson performed a corresponding lasso stage and stored the selected controls in the macro e(controls_sel). We can then reproduce the point estimates for the final estimation stage showing the value of the implicit intercept (111.52364).

. quietly poisson correct no2_class no2_home `e(controls_sel)' if e(sample), irr 
  vce(robust)

. estimates store rep_dspoi

. etable, estimates(dspoisson rep_dspoi) column(estimates) keep(no2_class no2_home 
  _cons) cstat(_r_b, nformat(%9.5f)) novarlabel

dspoisson rep_dspoi
no2_class 0.99933 0.99933
no2_home 1.00006 1.00006
_cons 111.52364
Number of observations 1053 1053

An intercept cannot be estimated from partialing-out and cross-fit partialing-out regressions

The partialing-out commands are poregress, pologit, popoisson, and poivregress. The cross-fit partialing-out commands are xporegress, xpologit, xpopoisson, and xpoivregress. For all of these commands, the final estimation stage is performed using partial-covariate variables (zero-mean residuals). Therefore, if an intercept would be included in the final estimation stage, its value would be zero like in the next example. Consequently, an intercept in terms of the original covariates cannot be computed from those commands.

Example 4: poregress

The code below reproduces the point estimates of poregress demonstrating that, if an intercept would be included, its value would be virtually zero.

poregress react no2_class no2_home, controls($controlvars)
estimates store poregress
mark touse if e(sample)
local sel1 `e(lasso_selected_1)' 
local sel2 `e(lasso_selected_2)' 
local sel3 `e(lasso_selected_3)' 
quietly {
	regress react `sel1' if touse 
	predict double res_react, residual
	regress no2_class `sel2' if touse 
	predict double res_no2_class, residual
	regress no2_home `sel3'  if touse 
	predict double res_no2_home, residual
	regress res_react res_no2_class res_no2_home if touse, vce(robust)
	estimates store rep_poreg
}
etable, estimates(poregress rep_poreg) column(estimates) cstat(_r_b, nformat(%9.5f)) novarlab

And this is the output of the last command:

. etable, estimates(poregress rep_poreg) column(estimates) cstat(_r_b, 
  nformat(%9.5f)) novarlab 

poregress rep_poreg
no2_class 1.91259
no2_home -0.35376
res_no2_class 1.91259
res_no2_home -0.35376
_cons 0.00000
Number of observations 1053 1053

For the other po and xpo commands, manually reproducing the final estimation stage is not straightforward as in poregress. That being said, partial-covariate variables are used similarly, so there cannot be an intercept.