寻求micEconAids模型回归输出的美观替代方案(非stargazer)
搞定micEconAids模型的美观输出问题
刚好用过micEconAids,太懂你遇到的痛点了——stargazer对这个包的输出对象完全不兼容,总不能为了好看的表格就用lm硬套(关键是还复现不了AIDS模型的特定方法)。别慌,这里有三个靠谱的替代方案,不用重写模型就能生成整洁美观的回归结果:
方案1:用texreg自定义适配(最接近stargazer风格)
texreg比stargazer灵活得多,支持自定义模型提取逻辑。我们可以手动从aidsEst的结果里抠出系数、标准误、R²这些关键信息,再喂给texreg生成标准回归表格。
示例代码:
library(micEconAids) library(texreg) data(Blanciforti86) priceNames = c("pFood1", "pFood2", "pFood3", "pFood4") shareNames = c("wFood1", "wFood2", "wFood3", "wFood4") # 拟合三个模型 laaidsResult1 = aidsEst(priceNames, shareNames, "xFood", data = Blanciforti86, priceIndex = "S") laaidsResult2 = aidsEst(priceNames, shareNames, "xFood", data = Blanciforti86, priceIndex = "P") laaidsResult3 = aidsEst(priceNames, shareNames, "xFood", data = Blanciforti86, priceIndex = "SL") # 写个函数提取单个方程的结果 extract_aids_stats <- function(model, eq_num) { coefs <- coef(model)[[eq_num]] se_vals <- sqrt(diag(vcov(model)[[eq_num]])) df <- nrow(model$data) - length(coefs) p_vals <- 2 * pt(abs(coefs / se_vals), df = df, lower.tail = FALSE) # 整理成texreg需要的格式 list( coef.names = names(coefs), coef = coefs, se = se_vals, pvalues = p_vals, rsquared = model$r.squared[[eq_num]], n = nrow(model$data) ) } # 提取第一个方程的三个模型结果 model_s_eq1 <- extract_aids_stats(laaidsResult1, 1) model_p_eq1 <- extract_aids_stats(laaidsResult2, 1) model_sl_eq1 <- extract_aids_stats(laaidsResult3, 1) # 生成文本格式的表格(也可以选"latex"或"html") texreg(list(model_s_eq1, model_p_eq1, model_sl_eq1), type = "text", custom.model.names = c("Price Index: S", "Price Index: P", "Price Index: SL"))
方案2:手动整理成数据框,用kableExtra美化(自由度最高)
如果需要更个性化的格式(比如分方程分组、高亮显著系数),可以把所有模型的结果提取到数据框,再用kableExtra生成HTML或PDF表格,想怎么调就怎么调。
示例代码:
library(micEconAids) library(dplyr) library(kableExtra) # 批量提取所有模型的所有方程结果 get_full_aids_results <- function(model, model_name) { map_dfr(1:length(model$coef), function(eq) { coefs <- coef(model)[[eq]] se_vals <- sqrt(diag(vcov(model)[[eq]])) tibble( Model = model_name, Equation = paste0("Share Equation ", eq), Variable = names(coefs), Coefficient = round(coefs, 4), `Std. Error` = round(se_vals, 4), `t-Statistic` = round(coefs / se_vals, 2), `R²` = round(model$r.squared[[eq]], 4) ) }) } # 合并三个模型的结果 all_results <- bind_rows( get_full_aids_results(laaidsResult1, "Price Index S"), get_full_aids_results(laaidsResult2, "Price Index P"), get_full_aids_results(laaidsResult3, "Price Index SL") ) # 生成带分组的HTML表格 all_results %>% kbl(caption = "AIDS Model Estimation Results", format = "html") %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed")) %>% group_rows("Equation 1", 1, 12) %>% # 行数根据实际变量数调整 group_rows("Equation 2", 13, 24) %>% group_rows("Equation 3", 25, 36) %>% group_rows("Equation 4", 37, 48) %>% column_spec(4, bold = ifelse(abs(all_results$`t-Statistic`) > 1.96, TRUE, FALSE)) # 高亮显著系数
方案3:给broom写自定义方法(适合长期使用)
broom能把各种模型转成整洁的数据框,但默认不支持micEconAids。我们可以给aidsEst类写个自定义的tidy和glance方法,之后就能用broom配合gt或kableExtra轻松生成表格了。
示例代码:
library(micEconAids) library(broom) library(gt) # 自定义tidy方法,提取系数层面的结果 tidy.aidsEst <- function(x, ...) { bind_rows(lapply(1:length(x$coef), function(eq) { coefs <- coef(x)[[eq]] se_vals <- sqrt(diag(vcov(x)[[eq]])) df <- nrow(x$data) - length(coefs) tibble( equation = eq, term = names(coefs), estimate = coefs, std.error = se_vals, statistic = coefs / se_vals, p.value = 2 * pt(abs(statistic), df = df, lower.tail = FALSE) ) })) } # 自定义glance方法,提取模型整体统计量 glance.aidsEst <- function(x, ...) { bind_rows(lapply(1:length(x$r.squared), function(eq) { tibble( equation = eq, r.squared = x$r.squared[[eq]], nobs = nrow(x$data) ) })) } # 现在可以直接用broom处理了 tidy(laaidsResult1) # 系数结果 glance(laaidsResult1) # 整体统计量 # 结合gt生成美观表格 combined_tidy <- bind_rows( tidy(laaidsResult1) %>% mutate(model = "Price Index S"), tidy(laaidsResult2) %>% mutate(model = "Price Index P"), tidy(laaidsResult3) %>% mutate(model = "Price Index SL") ) combined_tidy %>% gt(groupname_col = "model") %>% fmt_number(columns = c(estimate, std.error), decimals = 4) %>% fmt_number(columns = statistic, decimals = 2) %>% fmt_pvalue(columns = p.value) %>% tab_header(title = "AIDS Model Coefficient Estimates") %>% tab_spanner(label = "Equation 1", columns = where(~ .$equation == 1)) %>% tab_spanner(label = "Equation 2", columns = where(~ .$equation == 2)) %>% tab_spanner(label = "Equation 3", columns = where(~ .$equation == 3)) %>% tab_spanner(label = "Equation 4", columns = where(~ .$equation == 4))
这三个方案各有侧重:texreg最快最接近stargazer的风格;kableExtra自由度最高,适合做个性化表格;broom的自定义方法适合长期用这个包的人,一劳永逸。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

