R: Sets/gets formula macros

setFixest_fml {fixest} | R Documentation

## Sets/gets formula macros

### Description

You can set formula macros globally with `setFixest_fml`. These macros can then be used in `fixest` estimations or when using the function `xpd`.

### Usage

    setFixest_fml(..., reset = FALSE)

    getFixest_fml()

### Arguments

`...` | Definition of the macro variables. Each argument name corresponds to the name of the macro variable. It is required that each macro variable name starts with two dots (e.g. `..ctrl`). The value of each argument must be a one-sided formula or a character vector, it is the definition of the macro variable. Example of a valid call: `setFixest_fml(..ctrl = ~ var1 + var2)`. In the function `xpd`, the default macro variables are taken from `getFixest_fml`, any variable in `...` will replace these values. You can enclose values in `.[]`, if so they will be evaluated from the current environment. For example `..ctrl = ~ x.[1:2] + .[z]` will lead to `~x1 + x2 + var` if `z` is equal to `"var"`.
`reset` | A logical scalar, defaults to `FALSE`. If `TRUE`, all macro variables are first reset (i.e. deleted).

### Details

In `xpd`, the default macro variables are taken from `getFixest_fml`. Any value in the `...` argument of `xpd` will replace these default values.

The definitions of the macro variables will replace in verbatim the macro variables. Therefore, you can include multipart formulas if you wish but then beware of the order the the macros variable in the formula. For example, using the airquality data, say you want to set as controls the variable `Temp` and `Day` fixed-effects, you can do `setFixest_fml(..ctrl = ~Temp | Day)`, but then `feols(Ozone ~ Wind + ..ctrl, airquality)` will be quite different from `feols(Ozone ~ ..ctrl + Wind, airquality)`, so beware!

### Value

The function `getFixest_fml()` returns a list of character strings, the names corresponding to the macro variable names, the character strings corresponding to their definition.

### See Also

`xpd` to make use of formula macros.

### Examples

    # Small examples with airquality data
    data(airquality)
    # we set two macro variables
    setFixest_fml(..ctrl = ~ Temp + Day,
                  ..ctrl_long = ~ poly(Temp, 2) + poly(Day, 2))

    # Using the macro in lm with xpd:
    lm(xpd(Ozone ~ Wind + ..ctrl), airquality)
    lm(xpd(Ozone ~ Wind + ..ctrl_long), airquality)

    # You can use the macros without xpd() in fixest estimations
    a = feols(Ozone ~ Wind + ..ctrl, airquality)
    b = feols(Ozone ~ Wind + ..ctrl_long, airquality)
    etable(a, b, keep = "Int|Win")

    # Using .[]

    base = setNames(iris, c("y", "x1", "x2", "x3", "species"))
    i = 2:3
    z = "species"
    lm(xpd(y ~ x.[2:3] + .[z]), base)

    # No xpd() needed in feols
    feols(y ~ x.[2:3] + .[z], base)

    #
    # You can use xpd for stepwise estimations
    #

    # Note that for stepwise estimations in fixest, you can use
    # the stepwise functions: sw, sw0, csw, csw0
    # -> see help in feols or in the dedicated vignette

    # we want to look at the effect of x1 on y
    # controlling for different variables

    base = iris
    names(base) = c("y", "x1", "x2", "x3", "species")

    # We first create a matrix with all possible combinations of variables
    my_args = lapply(names(base)[-(1:2)], function(x) c("", x))
    (all_combs = as.matrix(do.call("expand.grid", my_args)))

    res_all = list()
    for(i in 1:nrow(all_combs)){
      res_all[[i]] = feols(xpd(y ~ x1 + ..v, ..v = all_combs[i, ]), base)
    }

    etable(res_all)
    coefplot(res_all, group = list(Species = "^^species"))

    #
    # You can use macros to grep variables in your data set
    #

    # Example 1: setting a macro variable globally

    data(longley)
    setFixest_fml(..many_vars = grep("GNP|ployed", names(longley), value = TRUE))
    feols(Armed.Forces ~ Population + ..many_vars, longley)

    # Example 2: using ..("regex") to grep the variables "live"

    feols(Armed.Forces ~ Population + ..("GNP|ployed"), longley)

    # Example 3: same as Ex.2 but without using a fixest estimation

    # Here we need to use xpd():
    lm(xpd(Armed.Forces ~ Population + ..("GNP|ployed"), data = longley), longley)

    #
    # You can also put numbers in macros
    #

    res_all = list()
    for(p in 1:3){
      res_all[[p]] = feols(xpd(Ozone ~ Wind + poly(Temp, ..p), ..p = p), airquality)
    }

    etable(res_all)

    #
    # lhs and rhs arguments
    #

    # to create a one sided formula from a character vector
    vars = letters[1:5]
    xpd(rhs = vars)

    # Alternatively, to replace the RHS
    xpd(y ~ 1, rhs = vars)

    # To create a two sided formula
    xpd(lhs = "y", rhs = vars)

    #
    # Dot square bracket operator
    #

    # You can create multiple variables at once
    xpd(y ~ x.[1:5] + z.[2:3])

    # You can summon variables from the environment
    var = "a"
    xpd(y ~ x.[var])

    # ... the variables can be multiple
    vars = LETTERS[1:3]
    xpd(y ~ x.[vars])

    # You can have "complex" variable names but they must be nested in character form
    xpd(y ~ .["x.[vars]_sq"])

    # DSB can be used within regular expressions
    re = c("GNP", "Pop")
    xpd(Unemployed ~ ..(".[re]"), data = longley)

    # => equivalent to ..("GNP|Pop")

[Package fixest version 0.10.0 Index]