我对计算混合模型的 SE 很感兴趣。为此,首先我在一个更简单的模型中使用了包中包含的数据集之一。
\n\npigs$percent <- as.factor(pigs$percent)\nDoc_lm_1 <- lm(conc~percent, pigs) \nsummary(Doc_lm_1)\nemmeans(Doc_lm_1, pairwise~percent)$emmeans\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\npercent emmean SE df lower.CL upper.CL\n9 32.7 2.92 25 26.7 38.7\n12 38.0 2.76 25 32.3 43.7\n15 40.1 3.12 25 33.7 46.6\n18 39.9 3.70 25 32.3 47.6\nRun Code Online (Sandbox Code Playgroud)\n\n当我尝试使用平衡数据集时,所有组的 SE 都是相同的,并且与手工制作的 SE 不匹配。我想在这种情况下不会考虑任何因素,但它仍然应该与手工制作的SE相匹配
\n\n难道SE就是参数的SE吗?正如我们在表中看到的,当数据不平衡时,组间的 SE 会有所不同。我的假设基于以下事实:该包的 cran 项目网站表明(https://cran.r-project.org/web/packages/emmeans/vignettes/basics.html#backstory):
\n\n估计边际均值基于模型 \xe2\x80\x93,而不是直接基于数据”
\n\n所以我问我,SE是如何计算的?添加随机因子将如何改变这个计算?提前致谢。
\n要回答具体问题,请查看摘要结果:
> summary(Doc_lm_1)
... several lines skipped ...
Residual standard error: 8.267 on 25 degrees of freedom
Multiple R-squared: 0.134, Adjusted R-squared: 0.03011
F-statistic: 1.29 on 3 and 25 DF, p-value: 0.2997
Run Code Online (Sandbox Code Playgroud)
...从中我们可以看出模型的残差 SD 为 8.267。此外,我们需要每个因素级别的观测值数量:
> with(pigs, tapply(conc, percent, length))
9 12 15 18
8 9 7 5
Run Code Online (Sandbox Code Playgroud)
由于平均值的 SE 是 SD 除以样本量的平方根,因此计算:
> 8.267 / sqrt(c(8,9,7,5))
[1] 2.922826 2.755667 3.124632 3.697115
Run Code Online (Sandbox Code Playgroud)
你瞧,这些与emmeans()输出中显示的 SE 相匹配。正如问题中引用的,emmeans()使用模型,所示模型基于所有四个样本具有相同 SD 的假设,并且该共同 SD 的估计值为 8.267,自由度为 25。一次基于一个样本的手工计算使用单独的 SD,这是一个与交付的模型不同的模型emmeans();这就是结果不同的原因。
至于如何计算SE的一般emmeans()问题,它没有使用手工计算公式。它利用了 EMM 是回归系数的线性组合这一事实。它找出需要哪些组合,然后使用涉及 中的回归系数coef()以及这些系数的方差-协方差矩阵 的矩阵计算vcov()来获得 EMM 及其标准误差。对于涉及多个因素、随机效应等的模型,这些计算几乎不可能手动重现。