如何在嵌套模型中使用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
相关产品推荐
相关产品推荐

