如何将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
相关产品推荐
相关产品推荐

