You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:49:36