## help for hdfe.ado

    Title

        hdfe --      Partial-out variables with respect to a series of
                       fixed-effects

    Syntax

            hdfe varlist [weight] , absorb(absvars) [generate(stubname) | clear]
                   [clustervars(varlist) partial(varlist) dropsingletons
                   sample(newvarname) cores(#) verbose(#) tolerance(#)
                   maxiterations(#)] maximize_options]

        Notes:
         - this is a programmers' command, like -avar-. For a detailed explanation
           and comments, see the help and website for the reghdfe package.
         - does not accept time series or factor variables
         - varlist and clustervars MUST BE FULLY spelled out (i.e. you need to use
           unab beforehand!), but that is not needed at all for the absvars.

    Absvars:

        absvar                  Description
        --------------------------------------------------------------------------
        i.varname               indicators for each level of varname (the i.
                                  prefix is tacit and can be omitted).
        var1#var2               indicators for each combination of levels of var1
                                  and var2 (same as i.var1#i.var2).
        var1#c.var2             indicators for each level of var1, multiplied by
                                  var2
        var1##c.var2            equivalent to "i.var1 i.var1#c.var2", but much
                                  faster (the two sets of fixed effects are
                                  absorbed jointly at each iteration)
        --------------------------------------------------------------------------

        Notes:
         - Each absvar in the absvars list represents a fixed effect that you wish
           to absorb (like individual, firm or time).
         - It is good practice to put the absvars with more dimensions first.
         - Interactions (e.g. x#z) are supported. Using categorical interactions
           is faster than running egen group(...) beforehand.
         - To partial-out fixed slopes (and not just fixed intercepts), use
           continuous interactions (e.g. x#c.z).
         - Each absvar can contain any number of categorical interactions (e.g.
           i.var1#i.var2#i.var3) but at most one continuous interaction (thus,
           i.var1#c.var2#c.var3 is not allowed).
         - The first absvar cannot contain a continuous variable (i.var1#c.var2 is
           not allowed, although i.var1##c.var2 is ok).
         - When saving fixed effects and using ## interactions, remember that
           newvar=varname1##c.varname2 will be expanded to "newvar=varname1
           newvar_slope=varname1#c.varname2"

    Summary of Options:

        options                 Description
        --------------------------------------------------------------------------
        Model
        * absorb(absvars)       identifiers of the fixed effects that will be
                                  absorbed
          absorb(..., savefe)   save fixed effects with autogenerated names
                                  __hdfe*__; useful when running predict
                                  afterwards
          generate(stubname)    will not overwrite the variables; instead creating
                                  new demeaned variables with the stubname prefix
          clear                 will overwrite the dataset; leaving the
                                  transformed variables, as well as some ancillary
                                  ones (such as the fixed effects, weights,
                                  cluster variables, etc.).  Use char list to see
                                  details of those ancillary variables.
          clustervars(varlist)  list of variables containing cluster categories.
                                  This is used to give more accurate number of
                                  degrees of freedom lost due to the fixed
                                  effects, as reported on r(df_a).
          partial(varlist)      will partial-out the variables in the given
                                  varlist, in addition of the partialled-out fixed
                                  effects indicated in absorb().  Also returns
                                  r(df_partial) with the number of partialled out
                                  variables (excluding collinear).
          dropsingletons        remove singleton groups from the sample; once per
                                  absvar.
          sample(newvarname)    will save the equivalent of e(sample) in this
                                  variable; useful when dropping singletons.  Used
                                  with the generate option.
          cores(#)              will run the demeaning algorithm in # parallel
                                  instances.
          verbose(#)            amount of debugging information to show (0=None,
                                  1=Some, 2=More, 3=Parsing/convergence details,
                                  4=Every iteration)
          maxiterations(#)      specify maximum number of iterations; default is
                                  maxiterations(1000); 0 means run forever until
                                  convergence
          maximize_options      there are several advanced maximization options,
                                  useful for tweaking the iteration. See the help
                                  for reghdfe for details.
          version               reports the version number and date of hdfe, and
                                  saves it in e(version). standalone option

    Recovering Fixed Effects

        You can use hdfe again to recover the fixed effects. For instance, in the
        least-squares case:

            . sysuse auto, clear
            . * Demean variables
            . hdfe price weight length, a(turn trunk) gen(RESID_)
            . * Run regression
            . reg RESID_*
            . * Predict using original variables
            . drop RESID_*
            . rename (price weight length) RESID_=
            . predict double resid, resid
            . rename RESID_* *
            . * Obtain fixed effects
            . hdfe resid, a(FE1=turn FE2=trunk) gen(temp_)

            . * Benchmark and verification
            . reghdfe price weight length, a(BENCH1=turn BENCH2=trunk)
            . gen double delta = abs(BENCH1-FE1) + abs(BENCH2-FE2)
            . su delta

    Stored results

        hdfe stores the following in r():

        Scalars
          r(df_a)                 degrees of freedom lost due to the fixed effects
                                    (taking into account the cluster structure and
                                    whether the FEs are nested within the
                                    clusters)
          r(N_hdfe)               number of sets of fixed effects
          r(df_a#)                degrees of freedom lost due to the #th fixed
                                    effect (excluding those collinear with the
                                    #th-1 first FEs)

        Macros
          r(hdfe#)                canonical expansion of the fixed effects (e.g.
                                    for#turn is expanded into i.foreign#i.turn)

    Author

        Sergio Correia

        Fuqua School of Business, Duke University

        Email: sergio.correia@duke.edu

    Latest Updates

        reghdfe and hdfe are updated frequently, and upgrades or minor bug fixes
        may not be immediately available in SSC.  To check or contribute to the
        latest version of reghdfe, explore the Github repository.