REGHDFE  Frequently Asked Questions
Contents:
 What does “fixed effect nested within cluster” means?
 Can I use
reghdfe
with multiway clustering but without fixed effects?  Can I absorb the fixed effects formed by the combination of two variables?
 I ran out of memory. What can I do?
 I want to repeat a regression with different outcome variables. Can I compute the transformations only once?
 Where is the constant?
 Why are there four R2s? Which one should I use?
 How can I combine
reghdfe
withesttab
orestout
?  In my model the number of FEs varies by observation. What can I do?
 I want to report a bug or contribute!
What does “fixed effect nested within cluster” means?
(From Statalist)
A fixed effect is “nested within cluster” if the same variable is used in vce(cluster ...)
and in absorb(...)
or—more generally—if a cluster variable is coarser than a fixed effect variable. For instance, if we have state–clustered standard errors and county–level fixed effects, or with clustering by year and monthly fixed effects.
Whenever this happens, reghdfe
will avoid applying a double penalty to the standard errors: it will continue to cluster by e.g. state but will not use the number of counties when computing the absorbed degrees of freedom.
If this option is triggered, you will see the message “fixed effect nested within cluster; treated as redundant for DoF computation” in the second output table of reghdfe
:
. sysuse auto
(1978 Automobile Data)
. reghdfe price weight length, absorb(turn trunk) vce(cluster turn)
(output omitted)
Absorbed degrees of freedom:
+
Absorbed FE  Num. Coefs. = Categories  Redundant 
+
turn  0 13 13 * 
trunk  12 13 1 
+
* = fixed effect nested within cluster; treated as redundant for DoF computation
To disable the adjustment, see the dof(...)
section of the help file.
Details
When reghdfe
computes the VCE matrix, it multiplies the asymptotic VCE matrix by a small sample adjustment (see the formula for “q” here). This adjustment depends on the absorbed degrees of freedom of the model (the degrees of freedom lost by controlling for the fixed effects).
In general, we reduce the degrees of freedom by the number of fixed effects that are estimated by reghdfe
. However, as mentioned above, if a fixed effect variable is also a cluster variable (or is nested within a cluster variable), we do not consider it when computing the absorbed degrees of freedom.
This is done to avoid a double penalty for the fixed effects, as we have already penalized for them by using cluster–robust standard errors at the same level. Additionally, this approach is in line with packages such as xtreg
and xtivreg2
, although not with areg
, which uses a different set of assumptions.
For further discussions, see:
 Statalist post on “super–observations” and the penalties of cluster–robust standard errors
 “… if the FE are nested, then the clustering adjustment already accounts for the degrees of freedom problem.” Lecture notes by Sam Hanson and Adi Sunderam
 Todd Gormley’s lecture notes
Can I use reghdfe
with multiway clustering but without fixed effects?
Yes. Just generate a constant variable and use that within absorb:
. sysuse auto
(1978 Automobile Data)
. gen byte constant = 1
. reghdfe price weight length, absorb(constant) vce(cluster turn trunk)
(converged in 1 iterations)
HDFE Linear regression Number of obs = 74
Absorbing 1 HDFE group F( 2, 17) = 34.60
Statistics robust to heteroskedasticity Prob > F = 0.0000
Rsquared = 0.3476
Adj Rsquared = 0.3292
Number of clusters (turn) = 18 Within Rsq. = 0.3476
Number of clusters (trunk) = 18 Root MSE = 2415.7351
(Std. Err. adjusted for 18 clusters in turn trunk)

 Robust
price  Coef. Std. Err. t P>t [95% Conf. Interval]
+
weight  4.699065 2.650909 1.77 0.094 .8938651 10.29199
length  97.96031 91.6812 1.07 0.300 291.3907 95.4701

Absorbed degrees of freedom:
+
Absorbed FE  Num. Coefs. = Categories  Redundant 
+
constant  1 1 0 
+
Can I absorb the fixed effects formed by the combination of two variables?
Often you want to absorb fixed effects at the exporter–importer level (in trade) or industry–year level (in finance). The usual (longer) approach is to run:
. egen cou_year = group(country year)
. reghdfe y x1 x2 , absorb(cou_year)
However, if you are lazy like me, just run:
. reghdfe y x1 x2 , absorb(country#year)
The same applies to cluster variables:
. reghdfe y x1 x2 , absorb(country#year) vce(cluster country#year)
I ran out of memory. What can I do?
With Stata 13 or older, Stata will stop when out of memory. With Stata 14 or newer, it will not stop, but it will become very slow as it will use the hard drive instead of the computer memory. We can fix this by two ways:

You can first try with the standard tricks of the trade.
compress
long integers into short ones,recast
double reals into short ones (with care),drop
unused observations and variable. 
If all else fails, use the
pool(#)
option of reghdfe with a smaller value (default is 10). By default, reghdfe applies the generalized within transformation to 10 variables at a time. By choosing a smaller number of variables, it will create smaller temporary matrices, which might just be enough to avoid out–of–memory errors.
I want to repeat a regression with different outcome variables. Can I compute the transformations only once?
Yes. Check out the cache(...)
option. For instance:
. sysuse auto
(1978 Automobile Data)
. reghdfe price weight length, absorb(turn trunk) cache(save)
(dropped 9 singleton observations)
(converged in 12 iterations)
. reghdfe price length, absorb(turn trunk) cache(use)
HDFE Linear regression Number of obs = 65
Absorbing 2 HDFE groups F( 1, 39) = 4.54
Prob > F = 0.0394
Rsquared = 0.4598
Adj Rsquared = 0.1136
Within Rsq. = 0.1043
Root MSE = 2727.2009

price  Coef. Std. Err. t P>t [95% Conf. Interval]
+
length  114.9727 53.95093 2.13 0.039 5.846653 224.0988
+
Absorbed  F(24, 39) = . . (Joint test)

Absorbed degrees of freedom:
+
Absorbed FE  Num. Coefs. = Categories  Redundant 
+
turn  13 13 0 
trunk  12 13 1 
+
. reghdfe price weight, absorb(turn trunk) cache(use)
HDFE Linear regression Number of obs = 65
Absorbing 2 HDFE groups F( 1, 39) = 25.39
Prob > F = 0.0000
Rsquared = 0.6347
Adj Rsquared = 0.4005
Within Rsq. = 0.3943
Root MSE = 2242.7172

price  Coef. Std. Err. t P>t [95% Conf. Interval]
+
weight  5.055336 1.003362 5.04 0.000 3.025846 7.084826
+
Absorbed  F(24, 39) = . . (Joint test)

Absorbed degrees of freedom:
+
Absorbed FE  Num. Coefs. = Categories  Redundant 
+
turn  13 13 0 
trunk  12 13 1 
+
. reghdfe, cache(clear)
Where is the constant?
When applying the within transformation, the constant is lost. It can be recovered, but that operation is costly and the constant might not be informative at all (this is why xtreg
doesn’t report the constant).
Using the summarize
option
If what you actually want is to know the baseline values of the dependent variable, it’s better to just use the summarize(...)
option:
. sysuse auto
(1978 Automobile Data)
. reghdfe price weight length, absorb(turn trunk) summarize
(output omitted)
Regression Summary Statistics:

Variable  mean min max
+
price  6091.446 3291 15906
weight  2987.538 1800 4330
length  187.1538 142 222

You can then access the summary statistics through e(summarize)
:
. matrix list e(summarize)
e(summarize)[3,3]
price weight length
mean 6091.4462 2987.5385 187.15385
min 3291 1800 142
max 15906 4330 222
And you can also choose which statistics do you want:
. reghdfe price weight length, absorb(turn trunk) summ(mean sd median)
(output omitted)
Regression Summary Statistics:

Variable  mean sd p50
+
price  6091.446 2896.648 4934
weight  2987.538 718.3141 3200
length  187.1538 20.89126 192

Computing the constant
If you really need to compute the constant (for sanity checks, etc.), you need to save the fixed effects and run a few extra commands:
. reghdfe price weight length, absorb(turn, save)
(dropped 4 singleton observations)
(converged in 1 iterations)
(converged in 2 iterations)
HDFE Linear regression Number of obs = 70
Absorbing 1 HDFE group F( 2, 54) = 22.41
Prob > F = 0.0000
Rsquared = 0.5999
Adj Rsquared = 0.4888
Within Rsq. = 0.4535
Root MSE = 2101.2277

price  Coef. Std. Err. t P>t [95% Conf. Interval]
+
weight  5.703116 1.103095 5.17 0.000 3.491544 7.914689
length  40.11461 40.99301 0.98 0.332 122.3006 42.07143
+
Absorbed  F(13, 54) = 2.881 0.003 (Joint test)

Absorbed degrees of freedom:
+
Absorbed FE  Num. Coefs. = Categories  Redundant 
+
turn  14 14 0 
+
. predict double d, d
(4 missing values generated)
. summarize d
Variable  Obs Mean Std. Dev. Min Max
+
d  70 3473.347 2563.418 6933.888 142.9562
. di r(mean)
3473.3468
In this case, the constant is “3473.3468”.
Why does areg
give a different constant?
Because areg
does not drop singleton groups. If we drop singleton groups, we can see that areg and reghdfe give the same result:
reghdfe price weight length, absorb(turn, save) keepsingletons
predict double d, d
summarize d
di r(mean)
areg price weight length, absorb(turn)
(Note: this is another reason why the summarize()
option is preferred.)
Why are there four R2s? Which one should I use?
The problem of the standard R2 under many fixed effects is that its value will mostly be driven by the fixed effects and not by the regressors of interest. As a solution, the withinR2 computes the R2 of the regression where every variable has already been demeaned with respect to all the fixed effects.
Therefore, on top of the usual R2 (e(r2)
) and the adjusted R2 (e(r2_a)
), we have the withinR2 (e(r2_within)
) and the adjusted withinR2 (e(r2_a_within)
).
If what you want an acid R2 that relates only to the variables of interest and is not driven by the fixed effets, I would suggest the adjusted withinR2.
Note: see this Statalist thread for more information.
How can I combine reghdfe
with esttab
or estout
?
Reghdfe comes with a “secret” command (estfe
) that allows for neat output tables:
* Setup
sysuse auto
* Run and store regressions
reghdfe price weight length, a(turn) keepsing
estimates store model1
reghdfe price weight length, a(turn trunk) keepsing
estimates store model2
reghdfe price weight length, a(turn foreign) keepsing
estimates store model2
* Prepare estimates for estout
estfe . model*, labels(turn "Turn FE" turn#trunk "TurnTrunk FE")
return list
* Run estout/esttab
esttab . model* , indicate("Length Controls=length" `r(indicate_fe)')
* Return stored estimates to their previous state
estfe . model*, restore
And the output is:

(1) (2) (3)
price price price

weight 5.741*** 5.703*** 5.741***
(5.44) (5.17) (5.44)
Length Con~s Yes Yes Yes
Turn FE Yes Yes Yes
foreign Yes No Yes

N 74 74 74

t statistics in parentheses
* p < 0.05, ** p < 0.01, *** p < 0.001
In my model the number of FEs varies by observation. What can I do?
Suppose you have a firm–level panel and want to control for board member fixed effects. This has two problems:
 The number of board members varies between firms and even within a firm (through time). Thus, I cannot write
absorb(board1 board2 ...)
.  Each individual might be in several boards at the same time.
Given the current setup of reghdfe
, this problem cannot be solved. An imperfect alternative might be to reshape the dataset (so instead of one observation per firmyear, you have one per firmyearboard member), and then run reghdfe while clustering by the original observations.
A better solution would be to use the alternating projection method (that underlies reghdfe) to deal with this problem directly. However, this has not been implemented. If you have suggestions or comments about this setup, please contact me.
I want to report a bug or contribute!
Contributors and pull requests are more than welcome. There are a number of extension possibilities, such as estimating standard errors for the fixed effects using bootstrapping, exact computation of degreesoffreedom for more than two HDFEs, and further improvements in the underlying algorithm. Please see the Github repository for more details.
If you think you have found a bug, please i) test if it is still present in the latest development version, and then ii) report it on Github. Thanks!