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
相关产品推荐
相关产品推荐

