如何在非平衡数据集下按多变量分组获取性状的emmeans?
解决非平衡数据下emmeans仅输出实际存在分组组合的问题
问题核心
你当前的问题在于:即便设置cov.reduce=FALSE将数值型变量视为离散水平,emmeans仍会默认生成所有因子水平的笛卡尔积组合,而非仅保留数据中实际存在的分组。weights="proportional"是用于加权边际均值计算的参数(按各组样本量比例加权),并不适用于筛选实际存在的组合。
解决方案步骤
1. 先将数值型分类变量转为因子类型
你的experiment(3组实验)和plant repetition(重复个体)本质是分类变量,先转换类型能避免后续混淆:
# 转换变量类型 rosette$experiment <- as.factor(rosette$experiment) rosette$plant_repetition <- as.factor(rosette$plant_repetition) # 重新拟合模型(变量类型变更后需重新拟合) fit_rosette <- lmer(leaf_area ~ genotype + night_temperature + experiment + plant_repetition + (1|experiment_setup), data = rosette)
2. 提取数据中实际存在的分组组合
从原始数据中筛选出genotype、night_temperature、experiment、plant_repetition的唯一组合:
# 方法1:使用dplyr library(dplyr) actual_groups <- rosette %>% distinct(genotype, night_temperature, experiment, plant_repetition) # 方法2:使用base R actual_groups <- unique(rosette[, c("genotype", "night_temperature", "experiment", "plant_repetition")])
3. 用at参数指定实际组合计算emmeans
通过emmeans的at参数,精准传入实际存在的分组组合,即可只输出对应结果:
fit_rosette_emm <- emmeans(fit_rosette, ~ genotype + night_temperature + experiment + plant_repetition, at = actual_groups)
补充说明
cov.reduce=FALSE的作用是阻止数值型变量被当作协变量做回归拟合,而是按离散水平处理,但不会限制组合生成范围;weights="proportional"适用于需要根据样本量加权计算合并均值的场景,比如跨实验合并某基因型的均值时,给样本量多的实验更高权重,和你的需求不匹配。
内容的提问来源于stack exchange,提问作者Nils
相关产品推荐
相关产品推荐

