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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:00:32