请问avg_comparisons的by参数是否计算分层特定因果风险比?
问题描述
我正在分析刚完成的AB测试数据,结果变量y是二元变量,需要按第三变量g分层。考虑到干预效果可能随g变化,我拟合了带稳健协方差估计的Poisson回归:
library(tidyverse) library(sandwich) library(marginaleffects) fit <- glm(y ~ treatment * g, data=model_data, family=poisson, offset=log(n_users))
为了获取分层特定的因果风险比(行业内称为“lift”),我使用了avg_comparisons函数:
avg_comparisons(fit, variables = 'treatment', newdata = model_data, transform_pre = 'lnratioavg', transform_post = exp, by=c('g'), vcov = 'HC')
目前结果和按g分组手动计算的lift一致,但我想确认:
- 传入
by=c('g')是否确实在计算分层特定的风险比? - 这个方法有没有什么潜在的问题需要注意?
我可以提供数据集和最小工作示例。
回答
1. by=c('g')的有效性确认
是的,你使用by=c('g')的方式确实在计算分层特定的因果风险比。
avg_comparisons的by参数会将数据集按指定变量拆分,在每个g的子组内独立计算处理效应:
- 搭配
transform_pre = 'lnratioavg',函数会在每个分层内先计算处理组与对照组的对数风险比(即ln(E[y|treatment=1, g] / E[y|treatment=0, g])) - 再通过
transform_post = exp将对数转换为风险比(也就是你所说的lift)。
由于你的模型包含treatment * g交互项,模型本身已经估计了组特异性的处理效应,by参数进一步在对应分层内平均这些效应,最终得到的就是每个g层单独的风险比——这和你手动分组计算结果一致的现象也验证了这一点。
2. 潜在问题与注意事项
- 过度离散检查:二元变量的方差是
p(1-p),而Poisson模型假设方差等于均值。当事件概率p不小时,数据容易出现过度离散。虽然你用了HC稳健协方差缓解方差估计偏差,但仍建议用DHARMa等工具做残差分析,验证Poisson模型的适配性,必要时可替换为负二项回归。 - Offset变量的合理性:
offset=log(n_users)是将模型目标设定为事件率(y/n_users)的对数线性关系。要确保n_users是每个观测对应的真实暴露基数,且在各g层的处理组与对照组间分布均衡,否则可能引入混杂偏倚。 - 分层样本量限制:如果某个
g分层的样本量过小,估计出的风险比会因方差过大而不稳定。建议提前检查各分层的样本量及处理组/对照组的比例,避免对样本量不足的层做推断。 - SUTVA假设验证:需确保AB测试满足稳定单位干预值假设(SUTVA)——即单个单位的处理不会影响其他单位的结果,且每个单位只有一种处理状态。若
g分层存在集群效应(如同一组内用户相互影响),需改用集群稳健协方差(例如vcov = ~cluster_id)。
内容的提问来源于stack exchange,提问作者Demetri Pananos
相关产品推荐
相关产品推荐

