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

如何在嵌套模型中使用emmeans的转换参考网格获取成对均值比率?

解决嵌套模型下emmeans对数转换参考网格的报错问题

这个问题我之前也碰到过,本质是嵌套模型场景下,直接用ref_grid(transform="log")时,emmeans内部对嵌套结构的参数矩阵处理出现了维度不匹配,才导致了下标越界的错误。我们可以换两种方式来处理对数转换,让confint和pairs正常工作:

方案一:先创建普通参考网格,再用regrid转换对数尺度

先基于拟合好的模型创建常规的参考网格,再通过regrid()函数完成对数转换,这样能正确适配嵌套结构的参数维度:

cows <- data.frame ( 
    route = factor(rep(c("injection", "oral"), c(5, 9))), 
    drug = factor(rep(c("Bovineumab", "Charloisazepam", "Angustatin", "Herefordmycin", "Mollycoddle"), c(3,2, 4,2,3))), 
    resp = c(34, 35, 34, 44, 43, 36, 33, 36, 32, 26, 25, 25, 24, 24) 
) 
cows.lm <- lm(resp ~ route + drug, data = cows) 

# 先创建普通参考网格
cows.lrg <- ref_grid(cows.lm)
# 再转换为对数尺度的参考网格
cows.lrg_log <- regrid(cows.lrg, transform = "log")

# 现在可以正常计算置信区间
confint(cows.lrg_log, type="response")

# 成对比较也能正常运行
pairs(cows.lrg_log, type = "response", infer = c(TRUE, TRUE), adjust = "none")

方案二:直接用emmeans函数指定转换

更简洁的方式是直接使用emmeans()函数,在里面指定对数转换,它会自动处理嵌套结构的参数约束:

library(emmeans)
# 获取对数转换后的均值并转换回响应尺度的置信区间
emmeans(cows.lm, ~ drug, transform = "log") %>% 
  confint(type = "response")

# 成对均值比率的比较
emmeans(cows.lm, ~ drug, transform = "log") %>% 
  pairs(type = "response", infer = c(TRUE, TRUE), adjust = "none")

为什么原来的方法会报错?

当你直接在ref_grid()中指定transform="log"时,emmeans没有正确处理嵌套结构下的线性预测矩阵(linfct)的维度,导致后续的confint和pairs函数在访问矩阵元素时出现下标越界。而regrid()或者直接用emmeans(transform=...)会重新计算转换后的参数矩阵,适配嵌套结构的参数约束,从根源上避免了维度不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:24:07