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

R语言lmerTest:周几对比改为均值比较及缺失类别疑问

好的,咱们一步步拆解你的问题,帮你理清这个lmer模型输出的细节:

1. 为什么会缺失一个星期几的结果?

你用的contr.sum(7)是和为0对比(sum-to-zero contrasts),这类对比的核心逻辑是:对于k个水平的因子,只需要k-1个独立的对比项就能描述所有水平的差异——因为最后一个水平的效应可以通过“所有水平效应之和为0”这个约束推导出来,所以模型输出里不会单独显示它。这是对比编码的正常现象,不是数据或代码的问题。

2. 怎么确定缺失的是哪一天?

看你设置的因子水平顺序:

data$weekday <- factor(weekday_sales$weekday, levels=c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))

contr.sum默认会把最后一个水平作为“被推导的水平”,也就是这里的Sunday。你也可以直接查看对比矩阵来验证:

contrasts(data$weekday)

输出的矩阵有7行(对应7个星期几),6列(对应模型里的6个对比项)。最后一行(Sunday)的数值是前面6列数值的相反数之和——这就是它的效应,由其他6个水平的效应推导而来。

3. 当前的对比方式是不是将每个星期几与均值对比?

是的!完全符合你的需求。在contr.sum编码下:

  • 模型的(Intercept)对应的是所有星期几销售数据的总均值(4.3681);
  • 每个weekdayX的系数,就是该星期几的销售均值与总均值的差异。比如weekday1(Monday)的系数是-1.0585,意味着周一的平均销售量比总均值低约1.06台;weekday5(Friday)的系数是1.3589,意味着周五的平均销售量比总均值高约1.36台。

4. 怎么修改让输出显示具体的星期几名称?

默认的contr.sum会给对比项命名为weekday1到weekday6,但你可以手动给对比矩阵的列命名,让输出更直观:

# 重新设置因子水平
data$weekday <- factor(data$weekday, levels=c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))
# 给对比矩阵的列指定对应星期几的名称(排除最后一个水平Sunday)
contrasts(data$weekday) <- setNames(contr.sum(7), levels(data$weekday)[-7])
# 重新拟合模型
model <- lmerTest::lmer(devices ~ weekday + (1|outlet), data=data)
summary(model)

这样输出的固定效应部分就会直接显示Monday、Tuesday等名称,而不是weekday1。

如果你想直接看到所有7个星期几与总均值的对比结果(包括Sunday),可以用emmeans包来做事后对比:

library(emmeans)
# 生成每个星期几的边际均值
emm <- emmeans(model, ~ weekday)
# 对比每个水平与总均值
contrast(emm, list(vs_overall_mean = contr.sum(7)))

这个输出会给出所有7个星期几与总均值的差异、标准误、p值,非常清晰。


内容的提问来源于stack exchange,提问作者Mel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:56:10