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

如何将rdd包生成的RDD模型导入modelsummary并解决拟合优度统计量提取报错问题?

我来帮你解决这个问题——报错的核心原因是你把整理好的data.frame直接传给了modelsummary,但这个工具默认是处理模型对象(比如lm、RD这类),而不是普通数据框,所以它会尝试提取拟合优度(gof)但失败了。下面给你两种解决思路,推荐第一种更规范的方法:


方法一:让modelsummary直接支持RD模型(推荐)

rdd包生成的模型属于RD类(你可以用class(ll1_covs)确认),我们只需要给这个类编写符合broom规范的tidy方法,这样modelsummary就能自动识别并处理你的模型列表,不用手动合并数据框。

步骤1:编写适配RD模型的tidy函数

这个函数会提取每个RD模型的核心系数(处理效应),并返回符合modelsummary要求的格式:

# 定义tidy方法,适配RD类模型
tidy.RD <- function(x, ...) {
  # 提取模型的summary结果
  s <- summary(x)
  # 取系数表的第一行(通常是处理效应的估计结果),保留你需要的列(对应你原来的1:4和第6列)
  coef_df <- as.data.frame(s$coefficients[1, c(1:4, 6), drop = FALSE])
  # 重命名列为broom标准命名(方便modelsummary识别)
  colnames(coef_df) <- c("estimate", "std.error", "statistic", "p.value", "conf.high")
  # 给系数命名(这里统一叫"处理效应",你也可以改成其他名称)
  coef_df$term <- "Treatment Effect"
  return(coef_df)
}

步骤2:直接传入模型列表给modelsummary

不用手动合并数据框,直接把你的模型列表(带清晰名称)传给modelsummary,它会自动调用上面的tidy.RD函数处理每个模型:

# 给模型列表命名,对应不同的变量和是否带控制变量
rdd_model <- list(
  "Female Share (with covs)" = ll1_covs,
  "Female Share (no covs)" = ll1_no_covs,
  "Pre-natal care (with covs)" = ll2_covs,
  "Pre-natal care (no covs)" = ll2_no_covs,
  "Daycare enroll (with covs)" = ll3_covs,
  "Daycare enroll (no covs)" = ll3_no_covs,
  "Pre-school enroll (with covs)" = ll4_covs,
  "Pre-school enroll (no covs)" = ll4_no_covs
)

# 生成汇总表格,指定要显示的统计量,并关闭不需要的拟合优度统计
rdd_table <- modelsummary(
  rdd_model,
  statistic = "p.value",  # 仅显示p值,若需要标准误可改为statistic = c("std.error", "p.value")
  gof_omit = ".*"         # RD模型通常没有合适的拟合优度指标,直接省略
)

# 添加表格样式和分组表头(注意列数要匹配!)
# 第一列是"term",后面8个模型各占2列(估计值+ p值),总共1 + 8*2 = 17列
# 每个主题组包含2个模型,所以每个组占4列
rdd_table <- rdd_table %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  add_header_above(
    c(
      " " = 1,  # 对应term列
      "Female Share" = 4,
      "Pre-natal care" = 4,
      "Daycare enroll" = 4,
      "Pre-school enroll" = 4
    )
  )

方法二:用已整理好的data.frame生成表格

如果你坚持要用之前合并好的rd_outputs数据框,可以通过modelsummary的tidy_list参数来传入,同时关闭拟合优度的提取:

步骤1:把data.frame按模型分组

先把你的rd_outputs按模型名称(也就是你原来的term列)拆分成列表:

# 按模型名称分组,生成tidy_list
tidy_list <- split(rd_outputs, rd_outputs$term)

步骤2:传入modelsummary生成表格

rdd_table <- modelsummary(
  tidy_list = tidy_list,
  statistic = "p.value",
  gof_omit = ".*"  # 关闭拟合优度提取,避免报错
) %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  add_header_above(
    c(
      " " = 1,
      "Female Share" = 4,
      "Pre-natal care" = 4,
      "Daycare enroll" = 4,
      "Pre-school enroll" = 4
    )
  )

关键注意点

  • 你之前的add_header_above列数不匹配:8个模型每个占2列(估计值+统计量),加上第一列的term,总共17列。我上面调整后的配置是正确的,之前的配置会导致列数不匹配报错。
  • 如果你的RD模型summary里的第6列不是置信上限,记得调整tidy.RD里的列名,保证和实际数据对应。

内容的提问来源于stack exchange,提问作者Caroline Cavallari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:03:11