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

emmeans中实现异水平处理对比:对照设0剂量其余为最优施肥剂量

解决方案

你遇到的错误本质是emmeans()中全局设置的at参数会把指定的协变量值应用到所有处理水平,才会出现无肥对照被错误分配100kg/ha施肥剂量的问题。要实现不同处理对应不同固定剂量的边际均值对比,手动构建自定义参考网格即可,操作步骤如下:

1. 构建目标对比组合的参考数据集

首先明确列出所有需要估计边际均值的「处理-剂量」组合,注意变量名必须和模型拟合时使用的变量名完全一致:

  • 对照处理1_Control固定在dose=0,对应的二次项dose2=0
  • 4个肥料处理(A/B/C/D)固定在最优剂量dose=100,对应的二次项dose2=100^2=10000
    对应代码:
# 自定义参考组合,变量名严格和模型、源数据保持一致
custom_ref <- data.frame(
  treatment = c("1_Control", "2_Fertilizer_A", "3_Fertilizer_B", "4_Fertilizer_C", "5_Fertilizer_D"),
  dose = c(0, 100, 100, 100, 100),
  dose2 = c(0, 10000, 10000, 10000, 10000)
)

注意:如果你模型中剂量相关变量名不是dose/dose2(比如你之前代码里写过rate_mgha),请把上述代码里的列名替换成你实际使用的变量名,因子水平的字符串也要和源数据里的处理命名完全匹配,否则会出现计算错误。

2. 基于自定义参考集计算边际均值

不要全局设置at参数,将你构建的参考集传入emmeans(),同时指定保留所有协变量设置,避免函数自动聚合协变量:

# 计算指定组合下的边际均值
marginal <- emmeans(
  ModelFert, 
  specs = ~ treatment,
  at = custom_ref,
  cov.keep = c("dose", "dose2") # 强制使用你指定的dose、dose2值,不做均值聚合
)

3. 执行对比检验与分组标记

得到正确的边际均值后,即可开展后续的多重比较与显著性分组:

# 如果你只关心各肥料处理和对照的差异,直接指定对照为参照组做检验
comp_vs_ctrl <- contrast(marginal, method = "trt.vs.ctrl", ref = "1_Control")
summary(comp_vs_ctrl, infer = c(TRUE, TRUE)) # 输出p值与置信区间

# 如果你需要输出所有组的显著性字母分组,用原来的cld逻辑即可
CLD <- cld(marginal, alpha=0.05, reversed=TRUE, Letters=LETTERS)
CLD

避坑提示

  • 二次项dose2的值必须和dose严格对应,不能只传dose漏传dose2,否则函数会用数据集中dose的均值计算二次项,导致预测结果完全偏移。
  • 不要尝试在at参数里给dose传长度和处理数一致的向量,这种写法会生成所有处理和剂量的交叉组合,不是你要的一一对应效果。
  • 如果模型里剂量做过单位转换(比如换算成了mg/ha),自定义网格里的剂量值也要用转换后的对应值,不要直接用100、0的原始值。

内容的提问来源于stack exchange,提问作者Matías de Felipe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:54:59