FAQs for emmeans emmeans教程
emmeans的包和交互作用相关

如果需要考虑协变量或者其他因素 需要考虑线性混合模型

🔹 group_by(dose) %>% t_test()
多个独立的 t-test。

  • ❌ 缺点:误差估计是基于每个子集独立计算的,忽略了全局结构,统计功效较低;容易积累 Type I 错误。

🔹 emmeans(model, pairwise ~ supp)

  • 做了什么?
    它首先拟合一个线性模型(如 len ~ supp * dose),然后用这个模型估计 supp 的边际均值(即在其他变量控制下的平均值),最后做 pairwise 比较(默认 Tukey 校正)。

    • 若你写的是 emmeans(model, pairwise ~ supp):它比较的是 supp 的主效应,即在所有 dose 的平均下 OJ vs VC。
    • 若你写的是 emmeans(model, pairwise ~ supp | dose):就等价于在每个 dose 下对 supp 进行比较,这就等价于 group_by(dose) %>% t_test() 的思路,但更稳健。
model <- lm(len ~ supp * dose, data = df)
emmeans(model, pairwise ~ supp | dose, adjust = "bonferroni")
emmeans(model, pairwise ~ factor1 | factor2)  
# vs
emmeans(model, pairwise ~ factor1 * factor2)

你看到两个结果不同,是因为 对比(comparisons)和均值(EMMs)计算的基准不同,这两种写法实际上有本质上的区别:

✅ 1. pairwise ~ factor1 | factor2

对 factor2 的每个水平,分别比较 factor1 的各水平。

  • 这是按组(conditional)比较 factor1。
  • 即 分层比较 factor1。
  • 得到的结果是 在 factor2 固定时,factor1 的 pairwise 比较。

💡适用于:你关心 factor1 的效应在 factor2 的不同水平上如何变化(也就是是否有交互的趋势)。


✅ 2. pairwise ~ factor1 * factor2

这表示:

同时比较 factor1、factor2 及其交互组合的所有 pairwise 对比。

  • 会输出:

    • 主效应比较:factor1、factor2
    • 所有交互组合的对比:如 A1:B1 vs A2:B2 等
  • 更全局、详尽,但解释会更复杂。

💡适用于:你要获得 完整的对比信息,包括交互项对比。

比较说明书

emmeans 的目的是计算 在控制其他变量(或固定某些变量为特定值)时,某一因子(group1 或 group2)的预测均值及其比较。它依赖于拟合的统计模型,而非直接操作原始数据。


2. 关键步骤

(1) 模型拟合

首先需要一个已拟合的模型(如线性模型、GLM、混合模型等),例如:

model <- lm(Y ~ group1 * group2 + covariate, data = df)

模型可能包含:

  • 主效应(group1, group2)
  • 交互项(group1 * group2)
  • 协变量(covariate)

(2) 预测网格(Reference Grid)

emmeans 会生成一个 参考网格(reference grid),即所有因子的组合(如 group1 和 group2 的所有水平),并固定协变量(如取均值或指定值):

  • 例如,若 covariate 是连续变量,默认取其均值。
  • 用户也可手动指定协变量的值(如 emmeans(model, ~group1, at = list(covariate = 30))。

(3) 计算边际均值

基于模型系数和参考网格,计算每个因子组合的 预测均值(即边际均值):

  • 对于线性模型,直接使用模型公式计算预测值。

(4) 比较与检验

  • 对比分析(如 pairwise ~ group1 | group2)会计算不同组间的差异,并基于模型的标准误差进行 t 检验或 z 检验。
  • 结果会考虑模型的自由度、多重比较校正(如 Tukey HSD)。

4. 为什么不是“剔除变量后做 t 检验”?

  • emmeans 不直接操作原始数据,而是通过模型预测调整后的均值。例如:
    • 如果模型包含协变量 covariate,emmeans 会固定 covariate 的值(如均值),然后预测 group1 的均值。
    • 这种调整是通过模型系数完成的,而非简单地剔除协变量的影响。
  • 数学本质:
    对于线性模型 Y = β₀ + β₁·group1 + β₂·covariate + ε,emmeans 计算的是:

    而非对原始 Y 值进行过滤。

5. 实际示例

假设模型为 Y ~ group1 * group2 + age:

model <- lm(Y ~ group1 * group2 + age, data = df)
emmeans(model, pairwise ~ group1 | group2)
  • 输出:会给出在 group2 的每一水平下,group1 两组的调整均值(控制 age 为均值)及其差异的 p 值。
  • 对比:若直接用 t.test 比较 group1 在 group2 = "A" 下的差异,会忽略 age 的影响和交互作用。

1. 什么是边际均值(Marginal Means)?

边际均值(Estimated Marginal Means, EMMs)是指在控制(或固定)其他变量的情况下,某一分类变量(如 group1 或 group2)的预测均值。它的核心思想是:

  • “边际” 表示“平均掉”或“固定”其他变量的影响(如协变量、其他因子)。
  • “均值” 是基于统计模型预测的调整值,而非原始数据的简单算术平均。

关键特性

  • 调整协变量:如果模型中有连续型协变量(如 age),边际均值会固定该变量(默认取均值)后再计算预测值。
  • 处理交互作用:如果模型包含交互项(如 group1 * group2),边际均值会分别计算各组合条件下的预测值。
  • 模型依赖:结果完全依赖于拟合的模型(如线性回归、混合模型等)。

示例

假设模型为:

  • 原始均值:直接计算 group1 各组的 Y 平均值(忽略 age 的影响)。
  • 边际均值:固定 age = mean(age),预测 group1 各组的 Y 值(即 )。

2. emmeans 是否直接预测新值然后做 t 检验?

不是简单的“预测新值 → t 检验”,但逻辑上类似。具体步骤如下:

(1)预测参考网格(Reference Grid)

  • 根据模型,生成所有因子组合的预测值(如 group1 和 group2 的所有水平),固定协变量为默认值(如均值)。
  • 数学表达:
    对于模型 ,预测值为:

(2)计算边际均值

  • 对每个因子水平(如 group1 = A 和 group1 = B),求预测值的平均(即边际均值)。

(3)对比分析与检验

  • 差异比较:计算两组边际均值的差值(如 A - B)。
  • 统计检验:基于模型的标准误差(SE)和自由度,进行 t 检验或 z 检验(广义线性模型)。
    • 检验统计量:
    • p 值来自 t 分布或正态分布。

3. 通俗类比

  • 原始 t 检验:比较两个班级的考试平均分,忽略学生背景差异。
  • emmeans:假设两个班级的“学生年龄相同”,再比较调整后的平均分(排除年龄影响)。

❓1. 单因素比较 ANOVA,还需要用 emmeans() 吗?

不是必须,但在以下情况仍然推荐使用 emmeans():

🔍 情况 1:组样本数不平衡

  • 那么直接看组的均值差异或 TukeyHSD() 输出,可能受样本数影响;
  • emmeans() 会给出 边际均值(adjusted for imbalance),更稳健。

在有交互作用时,emmeans(group1 | group2) 和 emmeans(group1 * group2) 中,group2 条件下 group1 的比较结果是否一样?

结果也**⚠️往往不同!

🧩 写法 1:emmeans(model, ~ group1 | group2)

  • 解释:在每个 group2 水平下,估算 group1 的边际均值。
  • 重点:这是一种条件式比较(conditioned on group2)
  • 输出形式:每个 group2 水平下的 group1 对比(也就是你说的“在 group2 下比较 group1”)

🧩 写法 2:emmeans(model, ~ group1 * group2)

  • 解释:输出的是 group1:group2 所有交互组合的边际均值。

  • 后续你若用:

    contrast(emmeans(model, ~ group1 * group2), method = "pairwise", by = "group2")

    才能实现类似于“在 group2 下比较 group1”。

  • 在 ~ group1 | group2 中,group2 是条件变量:你关注在每一个 group2 的背景下 group1 的效果。

  • 在 ~ group1 * group2 中,两者被当作交互因子,会自动估计每个组合水平下的预测值,且不做“边缘化”。


📌 为什么结果会不同(尤其在有交互项时):

  • 因为 group1 | group2 会边缘化掉 group2 的主效应/交互效应(取平均)
  • 而 group1 * group2 是每一个组合单独估计出来的效应值,没有平均任何东西
model <- lm(Y ~ A * B, data = df)

假设:

  • A:治疗方式(3 组)
  • B:性别(男女)
  • 有显著交互项 A:B

💡 emmeans(model, ~ A | B) 表示:

在 每个性别水平 下,A 的边际均值(控制或平均其他变量)

你可以获得:

BAemmean
MaleA15.2
MaleA26.1
FemaleA17.3
FemaleA28.4

👉 你可以做:

emmeans(model, pairwise ~ A | B)

💡 emmeans(model, ~ A * B) 表示:

每个 A:B 组合的预测均值(基于交互项,不平均)

ABemmean
A1Male5.2
A2Male6.1
A1Female7.3
A2Female8.4

这里你也可以做:

contrast(emmeans(model, ~ A * B), method = "pairwise", by = "B")
形式表示是否平均其他变量推荐用于
`emmeans(~ AB)`A 在 B 条件下的边际均值✅ 会平均其他变量(协变量、主效应)解释清晰、对比稳健
emmeans(~ A * B)每个 A:B 组合的预测值❌ 不平均更精确、但可能受交互影响较大

逐步回归 不包含交互项 并且由于大量检验 容易有假阳性
有时候从前到后 从后到前筛选的结果不一致
4个准则:

  1. PRESS 省略一个样本 多次拟合 求残差的均值
  2. Cp
  3. R2
  4. 调整后的R2

如何提前判断拟合的是几阶?

  1. 散点图+诊断回归图