如何在R的lm()或glmmTMB()模型输出中保留未用作因子的变量
在glmmTMB模型的emmeans结果中保留分组关联的额外变量
问题背景
需要在使用glmmTMB拟合模型后,让emmeans输出结果自动携带输入数据框中与分组变量(如示例中的b)一一对应的额外变量(如country、Solvent_ref)。这些变量无需纳入模型公式,但同一分组下的变量值完全一致。
示例数据
df <- data.frame(a = c(1,2,3,4,5,6,1,2,3), b = c("A", "B", "C","A", "B", "C","A", "B", "C" ), country = c("Malawi", "Malawi","UK", "Malawi"), Solvent_ref = c("DMSO", "DMSO", "H2O") )
注:同一
b值对应的country、Solvent_ref变量值完全一致。
当前代码及结果
运行以下代码后,emmean_df丢失了country和Solvent_ref变量:
library(glmmTMB) library(emmeans) model = glmmTMB(a~b, data = df) emmean_df = as.data.frame(emmeans(model, type = "response", specs = ~ b))
输出结果:
> emmean_df b emmean SE df lower.CL upper.CL 1 A 1.999998 0.8164967 5 -0.09887403 4.098869 2 B 2.999995 0.8164967 5 0.90112308 5.098866 3 C 4.000004 0.8164967 5 1.90113222 6.098876
期望输出
b emmean SE df lower.CL upper.CL country Solvent_ref 1 A 1.999998 0.8164967 5 -0.09887403 4.098869 Malawi DMSO 2 B 2.999995 0.8164967 5 0.90112308 5.098866 Malawi DMSO 3 C 4.000004 0.8164967 5 1.90113222 6.098876 UK H2O
解决方案
方法1:分组汇总后关联(最稳妥通用)
先按分组变量b对原数据汇总,提取每个分组对应的唯一额外变量值,再通过left_join合并到emmeans结果中:
library(dplyr) # 生成分组-额外变量映射表 df_summary <- df %>% group_by(b) %>% summarise( country = unique(country), Solvent_ref = unique(Solvent_ref), .groups = "drop" # 取消分组状态 ) # 合并结果 emmean_df <- emmean_df %>% left_join(df_summary, by = "b")
方法2:将额外变量纳入模型(间接保留)
如果希望模型数据中直接携带这些变量,可以将它们以共线性形式纳入模型公式(因为同一b下变量值唯一,不会影响模型拟合结果),之后再关联:
# 纳入额外变量(共线性,模型不会估计其效应) model <- glmmTMB(a ~ b + country + Solvent_ref, data = df) # 生成emmeans结果并关联原始变量 emm <- emmeans(model, ~ b, type = "response") emmean_df <- as.data.frame(emm) %>% left_join(unique(df[, c("b", "country", "Solvent_ref")]), by = "b")
注:此方法本质仍需关联数据,但模型的
fit$model会保留额外变量,适合需要从模型对象直接提取相关信息的场景。
内容的提问来源于stack exchange,提问作者Annick
相关产品推荐
相关产品推荐

