Provides how the small sample correction should be calculated in vcov.fixest/summary.fixest.
Usage
ssc(
K.adj = TRUE,
K.fixef = "nonnested",
K.exact = FALSE,
G.adj = TRUE,
G.df = "min",
t.df = "min",
...
)
setFixest_ssc(ssc.type = ssc())
getFixest_ssc()Arguments
- K.adj
Logical scalar, defaults to
TRUE. Whether to apply a small sample adjustment of the form(n - 1) / (n - K), withKthe number of estimated parameters. IfFALSE, then no adjustment is made.- K.fixef
Character scalar equal to
"nonnested"(default),"none"or"full". In the small sample adjustment, how to account for the fixed-effects parameters. If"none", the fixed-effects parameters are discarded, meaning the number of parameters (K) is only equal to the number of variables. If"full", then the number of parameters is equal to the number of variables plus the number of fixed-effects. Finally, if"nonnested", then the number of parameters is equal to the number of variables plus the number of fixed-effects that are not nested in the clusters used to cluster the standard-errors.- K.exact
Logical, default is
FALSE. If there are 2 or more fixed-effects, these fixed-effects they can be irregular, meaning they can provide the same information. If so, the "real" number of parameters should be lower than the total number of fixed-effects. IfK.exact = TRUE, thenfixef.fixestis first run to determine the exact number of parameters among the fixed-effects. Mostly, panels of the type individual-firm requireK.exact = TRUE(but it adds computational costs).- G.adj
Logical scalar, default is
TRUE. How to make the small sample correction when clustering the standard-errors? IfTRUEaG/(G-1)correction is performed withGthe number of cluster values.- G.df
Either "conventional" or "min" (default). Only relevant when the variance-covariance matrix is two-way clustered (or higher). It governs how the small sample adjustment for the clusters is to be performed. [Sorry for the jargon that follows.] By default a unique adjustment is made, of the form G_min/(G_min-1) with G_min the smallest G_i. If
G.df="conventional"then the i-th "sandwich" matrix is adjusted with G_i/(G_i-1) with G_i the number of unique clusters.- t.df
Either "conventional", "min" (default) or an integer scalar. Only relevant when the variance-covariance matrix is clustered. It governs how the p-values should be computed. By default, the degrees of freedom of the Student t distribution is equal to the minimum size of the clusters with which the VCOV has been clustered minus one. If
t.df="conventional", then the degrees of freedom of the Student t distribution is equal to the number of observations minus the number of estimated variables. You can also pass a number to manually specify the DoF of the t-distribution.- ...
Only used internally (to catch deprecated parameters).
- ssc.type
An object of class
ssc.typeobtained with the functionssc.
Details
The following vignette: On standard-errors,
describes in details how the standard-errors are computed in fixest and how you can
replicate standard-errors from other software.
Examples
#
# Equivalence with lm/glm standard-errors
#
# LM
# In the absence of fixed-effects,
# by default, the standard-errors are computed in the same way
res = feols(Petal.Length ~ Petal.Width + Species, iris)
res_lm = lm(Petal.Length ~ Petal.Width + Species, iris)
vcov(res) / vcov(res_lm)
#> (Intercept) Petal.Width Speciesversicolor Speciesvirginica
#> (Intercept) 1 1 1 1
#> Petal.Width 1 1 1 1
#> Speciesversicolor 1 1 1 1
#> Speciesvirginica 1 1 1 1
# GLM
# By default, there is no small sample adjustment in glm, as opposed to feglm.
# To get the same SEs, we need to use ssc(K.adj = FALSE)
res_pois = fepois(round(Petal.Length) ~ Petal.Width + Species, iris)
res_glm = glm(round(Petal.Length) ~ Petal.Width + Species, iris, family = poisson())
vcov(res_pois, ssc = ssc(K.adj = FALSE)) / vcov(res_glm)
#> (Intercept) Petal.Width Speciesversicolor Speciesvirginica
#> (Intercept) 1 1 1 1
#> Petal.Width 1 1 1 1
#> Speciesversicolor 1 1 1 1
#> Speciesvirginica 1 1 1 1
# Same example with the Gamma
res_gamma = feglm(round(Petal.Length) ~ Petal.Width + Species, iris, family = Gamma())
res_glm_gamma = glm(round(Petal.Length) ~ Petal.Width + Species, iris, family = Gamma())
vcov(res_gamma, ssc = ssc(K.adj = FALSE)) / vcov(res_glm_gamma)
#> (Intercept) Petal.Width Speciesversicolor Speciesvirginica
#> (Intercept) 1 1 1 1
#> Petal.Width 1 1 1 1
#> Speciesversicolor 1 1 1 1
#> Speciesvirginica 1 1 1 1
#
# Fixed-effects corrections
#
# We create "irregular" FEs
base = data.frame(x = rnorm(10))
base$y = base$x + rnorm(10)
base$fe1 = rep(1:3, c(4, 3, 3))
base$fe2 = rep(1:5, each = 2)
est = feols(y ~ x | fe1 + fe2, base)
# fe1: 3 FEs
# fe2: 5 FEs
#
# Clustered standard-errors: by fe1
#
# Default: K.fixef = "nonnested"
# => adjustment K = 1 + 5 (i.e. x + fe2)
summary(est)
#> OLS estimation, Dep. Var.: y
#> Observations: 10
#> Fixed-effects: fe1: 3, fe2: 5
#> Standard-errors: Clustered (fe1)
#> Estimate Std. Error t value Pr(>|t|)
#> x 0.704281 0.222128 3.1706 0.08673 .
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> RMSE: 0.360579 Adj. R2: -0.101955
#> Within R2: 0.538111
attributes(vcov(est, attr = TRUE))[c("ssc", "df.K")]
#> $ssc
#> $K.adj
#> [1] TRUE
#>
#> $K.fixef
#> [1] "nonnested"
#>
#> $G.adj
#> [1] TRUE
#>
#> $G.df
#> [1] "min"
#>
#> $t.df
#> [1] "min"
#>
#> $K.exact
#> [1] FALSE
#>
#> attr(,"class")
#> [1] "ssc.type"
#>
#> $df.K
#> [1] 6
#>
# K.fixef = FALSE
# => adjustment K = 1 (i.e. only x)
summary(est, ssc = ssc(K.fixef = "none"))
#> OLS estimation, Dep. Var.: y
#> Observations: 10
#> Fixed-effects: fe1: 3, fe2: 5
#> Standard-errors: Clustered (fe1)
#> Estimate Std. Error t value Pr(>|t|)
#> x 0.704281 0.148086 4.75591 0.04148 *
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> RMSE: 0.360579 Adj. R2: -0.101955
#> Within R2: 0.538111
attr(vcov(est, ssc = ssc(K.fixef = "none"), attr = TRUE), "df.K")
#> [1] 1
# K.fixef = TRUE
# => adjustment K = 1 + 3 + 5 - 1 (i.e. x + fe1 + fe2 - 1 restriction)
summary(est, ssc = ssc(K.fixef = "full"))
#> OLS estimation, Dep. Var.: y
#> Observations: 10
#> Fixed-effects: fe1: 3, fe2: 5
#> Standard-errors: Clustered (fe1)
#> Estimate Std. Error t value Pr(>|t|)
#> x 0.704281 0.314137 2.24196 0.15421
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> RMSE: 0.360579 Adj. R2: -0.101955
#> Within R2: 0.538111
attr(vcov(est, ssc = ssc(K.fixef = "full"), attr = TRUE), "df.K")
#> [1] 8
# K.fixef = TRUE & K.exact = TRUE
# => adjustment K = 1 + 3 + 5 - 2 (i.e. x + fe1 + fe2 - 2 restrictions)
summary(est, ssc = ssc(K.fixef = "full", K.exact = TRUE))
#> OLS estimation, Dep. Var.: y
#> Observations: 10
#> Fixed-effects: fe1: 3, fe2: 5
#> Standard-errors: Clustered (fe1)
#> Estimate Std. Error t value Pr(>|t|)
#> x 0.704281 0.256492 2.74582 0.11099
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> RMSE: 0.360579 Adj. R2: -0.101955
#> Within R2: 0.538111
attr(vcov(est, ssc = ssc(K.fixef = "full", K.exact = TRUE), attr = TRUE), "df.K")
#> [1] 7
# There are two restrictions:
attr(fixef(est), "references")
#> NOTE: The fixed-effects are not regular, they cannot be straightforwardly interpreted.
#> fe1 fe2
#> 0 2
#
# To permanently set the default ssc:
#
# eg no small sample adjustment:
setFixest_ssc(ssc(K.adj = FALSE))
# Factory default
setFixest_ssc()