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的边际均值(控制或平均其他变量)
你可以获得:
| B | A | emmean |
|---|---|---|
| Male | A1 | 5.2 |
| Male | A2 | 6.1 |
| Female | A1 | 7.3 |
| Female | A2 | 8.4 |
👉 你可以做:
emmeans(model, pairwise ~ A | B)💡 emmeans(model, ~ A * B) 表示:
每个 A:B 组合的预测均值(基于交互项,不平均)
| A | B | emmean |
|---|---|---|
| A1 | Male | 5.2 |
| A2 | Male | 6.1 |
| A1 | Female | 7.3 |
| A2 | Female | 8.4 |
这里你也可以做:
contrast(emmeans(model, ~ A * B), method = "pairwise", by = "B")| 形式 | 表示 | 是否平均其他变量 | 推荐用于 | |
|---|---|---|---|---|
| `emmeans(~ A | B)` | A 在 B 条件下的边际均值 | ✅ 会平均其他变量(协变量、主效应) | 解释清晰、对比稳健 |
emmeans(~ A * B) | 每个 A:B 组合的预测值 | ❌ 不平均 | 更精确、但可能受交互影响较大 |
逐步回归 不包含交互项 并且由于大量检验 容易有假阳性
有时候从前到后 从后到前筛选的结果不一致
4个准则:
- PRESS 省略一个样本 多次拟合 求残差的均值
- Cp
- R2
- 调整后的R2
如何提前判断拟合的是几阶?
- 散点图+诊断回归图