在 `huxreg` 中省略因子变量
Omit factor variables in `huxreg`
我是 运行 R 中的回归,具有大量时间和位置固定效应。我尝试将一个很好的摘要 table 输出到 Latex 中。我从 stargazer
包切换到 huxtable
,因为 stargazer
在忽略固定效应时表现不一致(参见 )。
这是一个简单的例子:
library(huxtable)
reg1 <- lm(mpg ~ disp, data = mtcars)
reg2 <- lm(mpg ~ disp + factor(gear) + factor(carb), data = mtcars)
huxreg(reg1, reg2)
huxreg
的输出是:
> huxreg(reg1, reg2)
────────────────────────────────────────────────────
(1) (2)
───────────────────────────────────
(Intercept) 29.600 *** 25.533 ***
(1.230) (2.996)
disp -0.041 *** -0.018
(0.005) (0.011)
factor(gear)4 3.988
(2.495)
factor(gear)5 5.391 *
(2.591)
factor(carb)2 -1.979
(1.667)
factor(carb)3 -4.161
(2.131)
factor(carb)4 -6.199 *
(2.221)
factor(carb)6 -8.557 *
(3.653)
factor(carb)8 -10.389 *
(4.268)
───────────────────────────────────
N 32 32
R2 0.718 0.828
logLik -82.105 -74.186
AIC 170.209 168.372
────────────────────────────────────────────────────
*** p < 0.001; ** p < 0.01; * p < 0.05.
Column names: names, model1, model2
这是所需的输出:
────────────────────────────────────────────────────
(1) (2)
───────────────────────────────────
(Intercept) 29.600 *** 25.533 ***
(1.230) (2.996)
disp -0.041 *** -0.018
(0.005) (0.011)
───────────────────────────────────
Gear FE No Yes
Carb FE No Yes
───────────────────────────────────
N 32 32
R2 0.718 0.828
logLik -82.105 -74.186
AIC 170.209 168.372
────────────────────────────────────────────────────
*** p < 0.001; ** p < 0.01; * p < 0.05.
Column names: names, model1, model2
我知道我可以使用 add_rows()
简单地编辑 huxtable,但我正在寻找更强大的解决方案,允许使用正则表达式查找行名(例如 stargazer 的 omit.labels
选项)。
我自己写了答案,以 this 为灵感。
函数 check_factors()
确定模型中是否存在特定变量,然后 sapply()
用于创建添加到 table 中的行。不过,这不是 完全 自动的,因为我仍然必须检查 omit_coef
列出的所有变量是否后来由 check_factors()
测试。可以省略一个变量然后忘记添加相应的行。
library(huxtable)
reg1 <- lm(mpg ~ disp, data = mtcars)
reg2 <- lm(mpg ~ disp + factor(gear) + factor(carb), data = mtcars)
huxreg(reg1, reg2)
gear_factors <- tidy(reg2) %>%
filter(str_detect(term, "factor\(gear\)")) %>% ## in R, you have to escape the escape, hence \
pull(term)
carb_factors <- tidy(reg2) %>%
filter(str_detect(term, "factor\(carb\)")) %>%
pull(term)
check_factors <- function(model, factors) {
return(all(factors %in% (tidy(model) %>% pull(term))))
}
models_report <- list(reg1 , reg2)
huxreg(models_report,
omit_coefs = c(gear_factors, carb_factors)) %>%
# add the rows with with True/false returned by check_factors() replased with "Yes"/"No"
add_rows(rbind(c("Gear FE",
ifelse(sapply(models_report,
check_factors,
factors=gear_factors),
"Yes", "No")),
c("Carb FE",
ifelse(sapply(models_report,
check_factors,
factors=carb_factors),
"Yes", "No"))),
copy_cell_props = FALSE, # this will prevent horizontal lines from appearing
after = nrow(.) - 5)
这会产生以下结果 table:
────────────────────────────────────────────────────
(1) (2)
───────────────────────────────────
(Intercept) 29.600 *** 25.533 ***
(1.230) (2.996)
disp -0.041 *** -0.018
(0.005) (0.011)
───────────────────────────────────
Gear FE No Yes
Carb FE No Yes
N 32 32
R2 0.718 0.828
logLik -82.105 -74.186
AIC 170.209 168.372
────────────────────────────────────────────────────
*** p < 0.001; ** p < 0.01; * p < 0.05.
Column names: names, model1, model2
我是 运行 R 中的回归,具有大量时间和位置固定效应。我尝试将一个很好的摘要 table 输出到 Latex 中。我从 stargazer
包切换到 huxtable
,因为 stargazer
在忽略固定效应时表现不一致(参见
这是一个简单的例子:
library(huxtable)
reg1 <- lm(mpg ~ disp, data = mtcars)
reg2 <- lm(mpg ~ disp + factor(gear) + factor(carb), data = mtcars)
huxreg(reg1, reg2)
huxreg
的输出是:
> huxreg(reg1, reg2)
────────────────────────────────────────────────────
(1) (2)
───────────────────────────────────
(Intercept) 29.600 *** 25.533 ***
(1.230) (2.996)
disp -0.041 *** -0.018
(0.005) (0.011)
factor(gear)4 3.988
(2.495)
factor(gear)5 5.391 *
(2.591)
factor(carb)2 -1.979
(1.667)
factor(carb)3 -4.161
(2.131)
factor(carb)4 -6.199 *
(2.221)
factor(carb)6 -8.557 *
(3.653)
factor(carb)8 -10.389 *
(4.268)
───────────────────────────────────
N 32 32
R2 0.718 0.828
logLik -82.105 -74.186
AIC 170.209 168.372
────────────────────────────────────────────────────
*** p < 0.001; ** p < 0.01; * p < 0.05.
Column names: names, model1, model2
这是所需的输出:
────────────────────────────────────────────────────
(1) (2)
───────────────────────────────────
(Intercept) 29.600 *** 25.533 ***
(1.230) (2.996)
disp -0.041 *** -0.018
(0.005) (0.011)
───────────────────────────────────
Gear FE No Yes
Carb FE No Yes
───────────────────────────────────
N 32 32
R2 0.718 0.828
logLik -82.105 -74.186
AIC 170.209 168.372
────────────────────────────────────────────────────
*** p < 0.001; ** p < 0.01; * p < 0.05.
Column names: names, model1, model2
我知道我可以使用 add_rows()
简单地编辑 huxtable,但我正在寻找更强大的解决方案,允许使用正则表达式查找行名(例如 stargazer 的 omit.labels
选项)。
我自己写了答案,以 this 为灵感。
函数 check_factors()
确定模型中是否存在特定变量,然后 sapply()
用于创建添加到 table 中的行。不过,这不是 完全 自动的,因为我仍然必须检查 omit_coef
列出的所有变量是否后来由 check_factors()
测试。可以省略一个变量然后忘记添加相应的行。
library(huxtable)
reg1 <- lm(mpg ~ disp, data = mtcars)
reg2 <- lm(mpg ~ disp + factor(gear) + factor(carb), data = mtcars)
huxreg(reg1, reg2)
gear_factors <- tidy(reg2) %>%
filter(str_detect(term, "factor\(gear\)")) %>% ## in R, you have to escape the escape, hence \
pull(term)
carb_factors <- tidy(reg2) %>%
filter(str_detect(term, "factor\(carb\)")) %>%
pull(term)
check_factors <- function(model, factors) {
return(all(factors %in% (tidy(model) %>% pull(term))))
}
models_report <- list(reg1 , reg2)
huxreg(models_report,
omit_coefs = c(gear_factors, carb_factors)) %>%
# add the rows with with True/false returned by check_factors() replased with "Yes"/"No"
add_rows(rbind(c("Gear FE",
ifelse(sapply(models_report,
check_factors,
factors=gear_factors),
"Yes", "No")),
c("Carb FE",
ifelse(sapply(models_report,
check_factors,
factors=carb_factors),
"Yes", "No"))),
copy_cell_props = FALSE, # this will prevent horizontal lines from appearing
after = nrow(.) - 5)
这会产生以下结果 table:
────────────────────────────────────────────────────
(1) (2)
───────────────────────────────────
(Intercept) 29.600 *** 25.533 ***
(1.230) (2.996)
disp -0.041 *** -0.018
(0.005) (0.011)
───────────────────────────────────
Gear FE No Yes
Carb FE No Yes
N 32 32
R2 0.718 0.828
logLik -82.105 -74.186
AIC 170.209 168.372
────────────────────────────────────────────────────
*** p < 0.001; ** p < 0.01; * p < 0.05.
Column names: names, model1, model2