如何用marginaleffects计算日水平边际效应的总和?
问题描述
我模拟了一个实验场景:将处理(trt)随机分配给一组人群,随后观测连续指标y。处理组的响应先出现峰值,随后急剧下降,控制组响应平稳。我关注的是处理组与控制组在各日的差异之和及其标准误,希望用marginaleffects包实现。从函数形式看,差异总和应约为3.2,但直接调用avg_comparisons得到的结果接近0。
以下是最小可复现代码:
library(nimble) library(tidyverse) library(marginaleffects) set.seed(0) mu <- \(x) 10*ddexp(x, location=7, scale=1) - 7*ddexp(x, location=8, scale=1) d <- crossing( day = 1:14, trt = 0:1, ix = 1:100 ) %>% mutate( y = 10 + mu(day)*trt + rnorm(n(), 0, 1) ) fit <- lm(y ~ factor(day)*trt, data=d) # 手动求和得到接近预期的结果 avg_comparisons(fit, newdata = datagrid(by = c('trt','day')), variables = 'trt', by='day')$estimate %>% sum #> [1] 3.469189 # 直接调用得到的是平均每日差异,不是总和 avg_comparisons(fit, newdata = datagrid(by = c('trt','day')), variables = 'trt') #> #> Term Contrast Estimate Std. Error z Pr(>|z|) S 2.5 % 97.5 % #> trt 1 - 0 0.248 0.0379 6.53 <0.001 33.9 0.173 0.322 #> #> Columns: term, contrast, estimate, std.error, statistic, p.value, s.value, conf.low, conf.high #> Type: response
请问如何用marginaleffects直接估算这个差异总和及其标准误?
解决方案
要计算处理组与控制组各日差异的总和并得到标准误,核心是利用marginaleffects的hypotheses参数定义所有每日处理效应的线性组合(即求和),这样能同时得到总和的估计值和正确的标准误(考虑每日效应间的相关性)。
方法一:基于按日比较结果构造假设
# 先获取按天计算的每日处理效应 daily_effects <- avg_comparisons(fit, newdata = datagrid(by = c('trt', 'day')), variables = 'trt', by = 'day') # 构造"所有每日效应之和"的假设表达式 sum_hypothesis <- paste0("(", paste(daily_effects$term, collapse = " + "), ") = 0") # 计算总和及标准误 avg_comparisons(fit, newdata = datagrid(by = c('trt', 'day')), variables = 'trt', by = 'day', hypotheses = sum_hypothesis)
方法二:直接构造线性组合表达式
由于模型是y ~ factor(day)*trt,每个day对应的处理效应可以直接通过变量名构造,无需先计算每日效应:
# 构造所有每日处理效应的求和表达式 sum_hypothesis <- paste0(paste0("trt1 - 0:factor(day)", 1:14), collapse = " + ") # 计算总和及标准误 avg_comparisons(fit, variables = 'trt', newdata = datagrid(day = 1:14), hypotheses = sum_hypothesis)
方法三:基于预测值计算差异后求和
也可以先计算每组每天的预测值,再构造差异的求和假设:
# 生成控制组和处理组各天的预测值 preds <- predictions(fit, newdata = datagrid(trt = 0:1, day = 1:14)) # 构造"所有日差异之和"的假设 sum_hypothesis <- paste0(paste0("estimate", 1:14, " - estimate", 15:28), collapse = " + ") # 计算总和及标准误 hypotheses(preds, sum_hypothesis)
以上三种方法都能直接得到差异总和的估计值、标准误、置信区间等统计量,避免了手动求和无法正确计算标准误的问题。
内容的提问来源于stack exchange,提问作者Demetri Pananos
相关产品推荐
相关产品推荐

