Description Usage Arguments Details Value Functions How does digits handle the number of decimals displayed? Arguments keep, drop and order The argument extraline Controlling the placement of extra lines Author(s) See Also Examples
Aggregates the results of multiple estimations and displays them in the form of either a Latex table or a data.frame
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172  etable(
...,
se = NULL,
dof = NULL,
cluster = NULL,
stage = 2,
agg = NULL,
.vcov,
.vcov_args = NULL,
digits = 4,
digits.stats = 5,
tex,
fitstat,
title,
coefstat = "se",
ci = 0.95,
sdBelow = NULL,
keep,
drop,
order,
dict,
file,
replace = FALSE,
convergence,
signifCode,
label,
float,
subtitles = list("auto"),
fixef_sizes = FALSE,
fixef_sizes.simplify = TRUE,
keepFactors = TRUE,
family,
powerBelow = 5,
interaction.combine = " $\\times $ ",
depvar = TRUE,
style.tex = NULL,
style.df = NULL,
notes = NULL,
group = NULL,
extraline = NULL,
fixef.group = NULL,
placement = "htbp",
drop.section = NULL,
poly_dict = c("", " square", " cube"),
postprocess.tex = NULL,
postprocess.df = NULL,
fit_format = "__var__",
coef.just = NULL
)
setFixest_etable(
digits = 4,
digits.stats = 5,
fitstat,
coefstat = c("se", "tstat", "confint"),
ci = 0.95,
sdBelow = TRUE,
keep,
drop,
order,
dict,
signifCode,
float,
fixef_sizes = FALSE,
fixef_sizes.simplify = TRUE,
family,
powerBelow = 5,
interaction.combine = " $\\times $ ",
depvar,
style.tex = NULL,
style.df = NULL,
notes = NULL,
group = NULL,
extraline = NULL,
fixef.group = NULL,
placement = "htbp",
drop.section = NULL,
postprocess.tex = NULL,
postprocess.df = NULL,
fit_format = "__var__",
reset = FALSE
)
getFixest_etable()
esttable(
...,
se = NULL,
dof = NULL,
cluster = NULL,
stage = 2,
agg = NULL,
.vcov,
.vcov_args = NULL,
digits = 4,
digits.stats = 5,
fitstat,
coefstat = "se",
ci = 0.95,
sdBelow = NULL,
keep,
drop,
order,
dict,
file,
replace = FALSE,
convergence,
signifCode,
subtitles = list("auto"),
fixef_sizes = FALSE,
fixef_sizes.simplify = TRUE,
keepFactors = TRUE,
family,
powerBelow = 5,
interaction.combine = " $\\times $ ",
depvar = TRUE,
style.df = NULL,
group = NULL,
extraline = NULL,
fixef.group = NULL,
drop.section = NULL,
poly_dict = c("", " square", " cube"),
postprocess.df = NULL,
fit_format = "__var__",
coef.just = NULL
)
esttex(
...,
se = NULL,
dof = NULL,
cluster = NULL,
stage = 2,
agg = NULL,
.vcov,
.vcov_args = NULL,
digits = 4,
digits.stats = 5,
fitstat,
title,
coefstat = "se",
ci = 0.95,
sdBelow = NULL,
keep,
drop,
order,
dict,
file,
replace = FALSE,
convergence,
signifCode,
label,
float,
subtitles = list("auto"),
fixef_sizes = FALSE,
fixef_sizes.simplify = TRUE,
keepFactors = TRUE,
family,
powerBelow = 5,
interaction.combine = " $\\times $ ",
depvar = TRUE,
style.tex = NULL,
notes = NULL,
group = NULL,
extraline = NULL,
fixef.group = NULL,
placement = "htbp",
drop.section = NULL,
poly_dict = c("", " square", " cube"),
postprocess.tex = NULL,
fit_format = "__var__"
)

... 
Used to capture different 
se 
Character scalar. Which kind of standard error should be computed: “standard”, “hetero”, “cluster”, “twoway”, “threeway” or “fourway”? By default if there are clusters in the estimation: 
dof 
An object of class 
cluster 
Tells how to cluster the standarderrors (if clustering is requested). Can be either a list of vectors, a character vector of variable names, a formula or an integer vector. Assume we want to perform 2way clustering over 
stage 
Can be equal to 
agg 
A character scalar describing the variable names to be aggregated, it is patternbased. All variables that match the pattern will be aggregated. It must be of the form 
.vcov 
A function to be used to compute the standarderrors of each fixest object. You can pass extra arguments to this function using the argument 
.vcov_args 
A list containing arguments to be passed to the function 
digits 
Integer or character scalar. Default is 4 and represents the number of significant digits to be displayed for the coefficients and standarderrors. To apply rounding instead of significance use, e.g., 
digits.stats 
Integer or character scalar. Default is 5 and represents the number of significant digits to be displayed for the fit statistics. To apply rounding instead of significance use, e.g., 
tex 
Logical: whether the results should be a data.frame or a Latex table. By default, this argument is 
fitstat 
A character vector or a one sided formula (both with only lowercase letters). A vector listing which fit statistics to display. The valid types are 'n', 'll', 'aic', 'bic' and r2 types like 'r2', 'pr2', 'war2', etc (see all valid types in 
title 
(Tex only.) Character scalar. The title of the Latex table. 
coefstat 
One of 
ci 
Level of the confidence interval, defaults to 
sdBelow 
Logical or 
keep 
Character vector. This element is used to display only a subset of variables. This should be a vector of regular expressions (see 
drop 
Character vector. This element is used if some variables are not to be displayed. This should be a vector of regular expressions (see 
order 
Character vector. This element is used if the user wants the variables to be ordered in a certain way. This should be a vector of regular expressions (see 
dict 
A named character vector or a logical scalar. It changes the original variable names to the ones contained in the 
file 
A character scalar. If provided, the Latex (or data frame) table will be saved in a file whose path is 
replace 
Logical, default is 
convergence 
Logical, default is missing. Should the convergence state of the algorithm be displayed? By default, convergence information is displayed if at least one model did not converge. 
signifCode 
Named numeric vector, used to provide the significance codes with respect to the pvalue of the coefficients. Default is 
label 
(Tex only.) Character scalar. The label of the Latex table. 
float 
(Tex only.) Logical. By default, if the argument 
subtitles 
Character vector or list. The elements should be of length 1 or of the same length as the number of models. If a list, the names of the list will be displayed on the leftmost column. By default it is equal to 
fixef_sizes 
(Tex only.) Logical, default is 
fixef_sizes.simplify 
Logical, default is 
keepFactors 
Logical, default is 
family 
Logical, default is missing. Whether to display the families of the models. By default this line is displayed when at least two models are from different families. 
powerBelow 
(Tex only.) Integer, default is 5. A coefficient whose value is below 
interaction.combine 
(Tex only.) Character scalar, defaults to 
depvar 
Logical, default is 
style.tex 
An object created by the function 
style.df 
An object created by the function 
notes 
(Tex only.) Character vector. If provided, a 
group 
A list. The list elements should be vectors of regular expressions. For each elements of this list: A new line in the table is created, all variables that are matched by the regular expressions are discarded (same effect as the argument 
extraline 
A list or a one sided formula. The list elements should be either a logical scalar,a vector of the same length as the number of models, or a function. This argument can be many things, please have a look at the dedicated help section; a simplified description follows. For each elements of this list: A new line in the table is created, the list name being the row name and the vector being the content of the cells. Example: 
fixef.group 
Logical scalar or list (default is 
placement 
(Tex only.) Character string giving the position of the float in Latex. Default is "htbp". It must consist of only the characters 'h', 't', 'b', 'p', 'H' and '!'. Reminder: h: here; t: top; b: bottom; p: float page; H: definitely here; !: prevents Latex to look for other positions. Note that it can be equal to the empty string (and you'll get the default placement). 
drop.section 
Character vector which can be of length 0 (i.e. equal to 
poly_dict 
Character vector, default is 
postprocess.tex 
A function that will postprocess the character vector defining the latex table. Only when 
postprocess.df 
A function that will postprocess.tex the resulting data.frame. Only when 
fit_format 
Character scalar, default is 
coef.just 
(DF only.) Either 
reset 
( 
The function esttex
is equivalent to the function etable
with argument tex = TRUE
.
The function esttable
is equivalent to the function etable
with argument tex = FALSE
.
You can permanently change the way your table looks in Latex by using setFixest_etable
. The following vignette gives an example as well as illustrates how to use the style
and postprocessing functions: Exporting estimation tables.
When the argument postprocessing.tex
is not missing, two additional tags will be included in the character vector returned by etable
: "%start:tab\n"
and "%end:tab\n"
. These can be used to identify the start and end of the tabular and are useful to insert code within the table
environment.
If tex = TRUE
, the lines composing the Latex table are returned invisibly while the table is directly prompted on the console.
If tex = FALSE
, the data.frame is directly returned. If the argument file
is not missing, the data.frame
is printed and returned invisibly.
esttable
: Exports the results of multiple fixest
estimations in a Latex table.
esttex
: Exports the results of multiple fixest
estimations in a Latex table.
digits
handle the number of decimals displayed?The default display of decimals is the outcome of an algorithm. Let's take the example of digits = 3
which "kind of" requires 3 significant digits to be displayed.
For numbers greater than 1 (in absolute terms), their integral part is always displayed and the number of decimals shown is equal to digits
minus the number of digits in the integral part. This means that 12.345
will be displayed as 12.3
. If the number of decimals should be 0, then a single decimal is displayed to suggest that the number is not whole. This means that 1234.56
will be displayed as 1234.5
. Note that if the number is whole, no decimals are shown.
For numbers lower than 1 (in absolute terms), the number of decimals displayed is equal to digits
except if there are only 0s in which case the first significant digit is shown. This means that 0.01234
will be displayed as 0.012
(first rule), and that 0.000123 will be displayed as 0.0001
(second rule).
The arguments keep
, drop
and order
use regular expressions. If you are not aware of regular expressions, I urge you to learn it, since it is an extremely powerful way to manipulate character strings (and it exists across most programming languages).
For example drop = "Wind" would drop any variable whose name contains "Wind". Note that variables such as "Temp:Wind" or "StrongWind" do contain "Wind", so would be dropped. To drop only the variable named "Wind", you need to use drop = "^Wind$"
(with "^" meaning beginning, resp. "$" meaning end, of the string => this is the language of regular expressions).
Although you can combine several regular expressions in a single character string using pipes, drop
also accepts a vector of regular expressions.
You can use the special character "!" (exclamation mark) to reverse the effect of the regular expression (this feature is specific to this function). For example drop = "!Wind"
would drop any variable that does not contain "Wind".
You can use the special character "%" (percentage) to make reference to the original variable name instead of the aliased name. For example, you have a variable named "Month6"
, and use a dictionary dict = c(Month6="June")
. Thus the variable will be displayed as "June"
. If you want to delete that variable, you can use either drop="June"
, or drop="%Month6"
(which makes reference to its original name).
The argument order
takes in a vector of regular expressions, the order will follow the elements of this vector. The vector gives a list of priorities, on the left the elements with highest priority. For example, order = c("Wind", "!Inter", "!Temp") would give highest priorities to the variables containing "Wind" (which would then appear first), second highest priority is the variables not containing "Inter", last, with lowest priority, the variables not containing "Temp". If you had the following variables: (Intercept), Temp:Wind, Wind, Temp you would end up with the following order: Wind, Temp:Wind, Temp, (Intercept).
extraline
The argument extraline
adds well... extra lines to the table. It accepts either a list, or a onesided formula.
If a onesided formula: then the elements in the formula must represent either extraline
macros, either fit statistics (i.e. valid types of the function fitstat
). One new line will be added for each element of the formula, they will be appended right after the coefficients. To register extraline
macros, you must first register them in extraline_register
.
If a list: then the elements must be either: a) a logical scalar, b) a vector of the same length as the number of models, c) a function to be applied to each model and which returns a scalar, or d) a onesided formula of extraline
macros (registered with extraline_register
) or valid fitstat
types.
When a list, the elements of type a), b) and c) must have a name! Example: extraline = list("Controls" = TRUE)
is good, extraline = list(TRUE)
is bad. The name for element of type d) is optional. Example: extraline = list("^^My Fstat" = ~f)
will add the row named "My Fstat"
on top of the coefficients (for the placement, see the dedicated section), while extraline = list(~f)
will add the Fstat row with its default name ("Ftest"
) at its default placement (below the coefficients).
You can combine elements in the list, so that the following extraline = list(~r2, "Controls" = TRUE), ~f+ivf
is valid.
The arguments group
, extraline
and fixef.group
allow to add customized lines in the table. They can be defined via a list where the list name will be the row name. By default, the placement of the extra line is right after the coefficients (except for fixef.group
, covered in the last paragraph). For instance, group = list("Controls" = "x[[:digit:]]")
will create a line right after the coefficients telling which models contain the control variables.
But the placement can be customized. The previous example (of the controls) will be used for illustration (the mechanism for extraline
and fixef.group
is identical).
The row names accept 2 special characters at the very start. The first governs the placement of the new line within the section: it can be equal to "^"
, meaning first line, or "_"
, meaning last line. The second character tells in which section the line should appear: it can be equal to "^"
, ""
, or "_"
, meaning respectively the coefficients, the fixedeffects and the statistics section (which typically appear at the top, mid and bottom of the table).
Let's have some examples. Using the previous example, writing "^_Controls"
would place the new line in at the top of the statistics section. Writing "_Controls"
places it as the last row of the fixedeffects section; "^^Controls"
at the top row of the coefficients section; etc...
On top of that there are shortcuts to avoid writing the two special characters. If only one special character is found, it is assumed to reflect the section, unless it corresponds to the default section, a case where the character then reflects the position within the section. An example will make it clear. Writing "^Controls"
would place the line at the top of the coefficients section (since the default placement would have been this section). "_Controls"
would place it at the bottom of the statistics section.
The placement in fixef.group
is defined similarly, only the default placement is different. Its default placement is at the top of the fixedeffects section. This means that the only difference with group
and extraline
is when a single special character is used. Here using, e.g., "^My FEs"
would place the row at the bottom of the coefficients section, since "^"
would refer to the section (and not the row within the section).
Laurent Berge
See also the main estimation functions femlm
, feols
or feglm
. Use summary.fixest
to see the results with the appropriate standarderrors, fixef.fixest
to extract the fixedeffects coefficients.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214  aq = airquality
est1 = feols(Ozone ~ i(Month) / Wind + Temp, data = aq)
est2 = feols(Ozone ~ i(Month, Wind) + Temp  Month, data = aq)
# Displaying the two results in a single table
etable(est1, est2)
# keep/drop: keeping only interactions
etable(est1, est2, keep = " x ")
# or using drop (see regexp help):
etable(est1, est2, drop = "^(MonthTemp\\()")
# keep/drop: dropping interactions
etable(est1, est2, drop = " x ")
# or using keep ("!" reverses the effect):
etable(est1, est2, keep = "! x ")
# order: Wind variable first, intercept last (note the "!" to reverse the effect)
etable(est1, est2, order = c("Wind", "!Inter"))
# Month, then interactions, then the rest
etable(est1, est2, order = c("^Month", " x "))
#
# dict
#
# You can rename variables with dict = c(var1 = alias1, var2 = alias2, etc)
# You can also rename values taken by factors.
# Here's a full example:
dict = c(Temp = "Temperature", "Month::5"="May", "6"="Jun")
etable(est1, est2, dict = dict)
# Note the difference of treatment between Jun and May
# Assume the following dictionary:
dict = c("Month::5"="May", "Month::6"="Jun", "Month::7"="Jul",
"Month::8"="Aug", "Month::9"="Sep")
# We would like to keep only the Months, but now the names are all changed...
# How to do?
# We can use the special character '%' to make reference to the original names.
etable(est1, est2, dict = dict, keep = "%Month")
#
# signifCode
#
etable(est1, est2, signifCode = c(" A"=0.01, " B"=0.05, " C"=0.1, " D"=0.15, " F"=1))
#
# Using the argument style to customize Latex exports
#
# If you don't like the default layout of the table, no worries!
# You can modify many parameters with the argument style
# To drop the headers before each section, use:
# Note that a space adds an extra line
style_noHeaders = style.tex(var.title = "", fixef.title = "", stats.title = " ")
etable(est1, est2, dict = dict, tex = TRUE, style.tex = style_noHeaders)
# To change the lines of the table + dropping the table footer
style_lines = style.tex(line.top = "\\toprule", line.bottom = "\\bottomrule",
tablefoot = FALSE)
etable(est1, est2, dict = dict, tex = TRUE, style.tex = style_lines)
# Or you have the predefined type "aer"
etable(est1, est2, dict = dict, tex = TRUE, style.tex = style.tex("aer"))
#
# Group and extraline
#
# Sometimes it's useful to group control variables into a single line
# You can achieve that with the group argument
setFixest_fml(..ctrl = ~ poly(Wind, 2) + poly(Temp, 2))
est_c0 = feols(Ozone ~ Solar.R, data = aq)
est_c1 = feols(Ozone ~ Solar.R + ..ctrl, data = aq)
est_c2 = feols(Ozone ~ Solar.R + Solar.R^2 + ..ctrl, data = aq)
etable(est_c0, est_c1, est_c2, group = list(Controls = "poly"))
# 'group' here does the same as drop = "poly", but adds an extra line
# with TRUE/FALSE where the variables were found
# 'extraline' adds an extra line, where you can add the value for each model
est_all = feols(Ozone ~ Solar.R + Temp + Wind, data = aq)
est_sub1 = feols(Ozone ~ Solar.R + Temp + Wind, data = aq[aq$Month %in% 5:6, ])
est_sub2 = feols(Ozone ~ Solar.R + Temp + Wind, data = aq[aq$Month %in% 7:8, ])
est_sub3 = feols(Ozone ~ Solar.R + Temp + Wind, data = aq[aq$Month == 9, ])
etable(est_all, est_sub1, est_sub2, est_sub3,
extraline = list("Subsample" = c("All", "MayJune", "Jul.Aug.", "Sept.")))
# You can monitor the placement of the new lines with two special characters
# at the beginning of the row name.
# 1) "^" or "_" which mean first or last line of the section
# 2) "^", "" or "_" which mean the coefficients, the fixedeffects or the
# statistics section.
#
# Ex: starting with "^_" will place the line at the top of the stat. section
# starting with "_" will place the line at the bottom of the FEs section
# etc.
#
# You can use a single character which will represent the section, unless
# it's
# Examples
etable(est_c0, est_c1, est_c2, group = list("_Controls" = "poly"))
etable(est_all, est_sub1, est_sub2, est_sub3,
extraline = list("^Subsample" = c("All", "MayJune", "Jul.Aug.", "Sept.")))
# Note that since the default placement is the coefficients section,
# a single "^" then refers to the position within the section. We end
# up at the top of the coefficients section.
#
# fixef.group
#
# You can group the fixedeffects line with fixef.group
est_0fe = feols(Ozone ~ Solar.R + Temp + Wind, aq)
est_1fe = feols(Ozone ~ Solar.R + Temp + Wind  Month, aq)
est_2fe = feols(Ozone ~ Solar.R + Temp + Wind  Month + Day, aq)
# A) automatic way => simply use fixef.group = TRUE
etable(est_0fe, est_2fe, fixef.group = TRUE)
# Note that when grouping would lead to inconsistencies across models,
# it is avoided
etable(est_0fe, est_1fe, est_2fe, fixef.group = TRUE)
# B) customized way => use a list
etable(est_0fe, est_2fe, fixef.group = list("Dates" = "MonthDay"))
# Note that when a user grouping would lead to inconsistencies,
# the term partial replaces yes/no and the fixedeffects are not removed.
etable(est_0fe, est_1fe, est_2fe, fixef.group = list("Dates" = "MonthDay"))
# Using customized placement => as with 'group' and 'extraline',
# the user can control the placement of the new line.
# See the previous 'group' examples and the dedicated section in the help.
# On top of the coefficients:
etable(est_0fe, est_2fe, fixef.group = list("^^Dates" = "MonthDay"))
# Last line of the statistics
etable(est_0fe, est_2fe, fixef.group = list("_Dates" = "MonthDay"))
#
# Using custom functions to compute the standard errors
#
# You can customize the way you compute the SEs with the argument .vcov
# Let's use some covariances from the sandwich package
etable(est_c0, est_c1, est_c2, .vcov = sandwich::vcovHC)
# To add extra arguments to vcovHC, you need to use .vcov_args
etable(est_c0, est_c1, est_c2, .vcov = sandwich::vcovHC, .vcov_args = list(type = "HC0"))
#
# Customize which fit statistic to display
#
# You can change the fit statistics with the argument fitstat
# and you can rename them with the dictionnary
etable(est1, est2, fitstat = ~ r2 + n + G)
# If you use a formula, '.' means the default:
etable(est1, est2, fitstat = ~ ll + .)
#
# Computing a different SE for each model
#
est = feols(Ozone ~ Solar.R + Wind + Temp, data = aq)
#
# Method 1: use summary
s1 = summary(est, "standard")
s2 = summary(est, cluster = ~ Month)
s3 = summary(est, cluster = ~ Day)
s4 = summary(est, cluster = ~ Day + Month)
etable(list(s1, s2, s3, s4))
#
# Method 2: using a list in the argument 'cluster'
est_bis = feols(Ozone ~ Solar.R + Wind + Temp  Month, data = aq)
etable(list(est, est_bis), cluster = list("standard", ~ Month))
#
# Method 3: Using rep()
etable(rep(est, cluster = list("standard", ~ Month)))
# When using rep on 2 or more objects, you need to embed them in .l()
etable(rep(.l(est, est_bis), cluster = list("standard", ~ Month, ~ Day)))
# Using each to order differently
etable(rep(.l(est, est_bis), each = 3, cluster = list("standard", ~ Month, ~ Day)))

Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.