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

使用lmer为何自动纳入二次固定效应项?

问题描述

运行lmer模型时自动生成了额外的二次固定效应项,但并未在公式中指定二次项,预期仅得到线性主效应及所有交互项。代码及模型输出如下,其中出现了Treatment.L(线性项)和Treatment.Q(二次项),请问为何会纳入二次项?

library(lmerTest)
library(sjPlot)

D <- read.csv(file = "data.csv")

D$Participant <- factor(D$Participant,order=FALSE)
D$Treatment   <- factor(D$Treatment,order=TRUE,levels = c("L0","L2","L4"))
D$Timepoint   <- as.numeric(D$Timepoint)

str(D)

'data.frame':   666 obs. of  6 variables:
Participant: Factor w/ 37 levels "O1","O10","O12",..: 19 21 30 4 7 13 21 21 36 36 ...
Treatment  : Ord.factor w/ 3 levels "L0"<"L2"<"L4": 2 1 2 1 3 2 2 3 1 3 ...
Timepoint  : num  1 1 1 1 1 1 1 1 1 1 ...
Rating     : num  6 4 3 NaN 4 4 NaN 2 NaN 4 ...
Wellbeing  : int  8 6 6 7 6 5 5 7 10 8 ...


mdl <- lmer(Rating ~ Treatment * Timepoint * Wellbeing + (Wellbeing | Participant), data = d,REML=F)

summary(mdl)

summary(mdl)的输出:

Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Rating ~ Treatment * Timepoint * Wellbeing + (Wellbeing | Participant)
   Data: d

     AIC      BIC   logLik deviance df.resid 
  1723.3   1793.5   -845.6   1691.3      580 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.6038 -0.6125 -0.0316  0.6088  3.6012 

Random effects:
 Groups      Name        Variance Std.Dev. Corr 
 Participant (Intercept) 1.30174  1.1409        
             Wellbeing   0.05398  0.2323   -0.83
 Residual                0.82435  0.9079        
Number of obs: 596, groups:  Participant, 37

Fixed effects:
                                  Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                      5.424e-01  3.118e-01  6.055e+01   1.739  0.08706 .  
Treatment.L                      4.784e-02  3.705e-01  5.490e+02   0.129  0.89729    
Treatment.Q                     -2.209e-01  3.702e-01  5.617e+02  -0.597  0.55097    
Timepoint                        4.683e-02  5.515e-02  5.156e+02   0.849  0.39627    
Wellbeing                        2.214e-01  6.669e-02  5.828e+01   3.320  0.00156 ** 
Treatment.L:Timepoint           -4.926e-02  9.418e-02  5.085e+02  -0.523  0.60118    
Treatment.Q:Timepoint           -2.663e-02  9.500e-02  5.190e+02  -0.280  0.77932    
Treatment.L:Wellbeing            4.982e-02  7.670e-02  5.509e+02   0.650  0.51623    
Treatment.Q:Wellbeing           -1.197e-03  8.360e-02  5.684e+02  -0.014  0.98858    
Timepoint:Wellbeing              9.874e-02  1.262e-02  5.273e+02   7.827 2.75e-14 ***
Treatment.L:Timepoint:Wellbeing -1.319e-02  2.019e-02  5.139e+02  -0.653  0.51390    
Treatment.Q:Timepoint:Wellbeing  5.632e-04  2.256e-02  5.331e+02   0.025  0.98009    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Trtm.L Trtm.Q Timpnt Wllbng Tr.L:T Tr.Q:T Tr.L:W Tr.Q:W Tmpn:W T.L:T:
Treatment.L -0.118                                                                      
Treatment.Q  0.012 -0.098                                                               
Timepoint   -0.600  0.139 -0.007                                                        
Wellbeing   -0.889  0.078  0.022  0.570                                                 
Trtmnt.L:Tm  0.091 -0.873  0.095 -0.152 -0.053                                          
Trtmnt.Q:Tm -0.006  0.092 -0.865 -0.010 -0.030 -0.110                                   
Trtmnt.L:Wl  0.049 -0.908  0.048 -0.079 -0.004  0.804 -0.053                            
Trtmnt.Q:Wl  0.024  0.047 -0.908 -0.046 -0.061 -0.052  0.803  0.003                     
Tmpnt:Wllbn  0.532 -0.077 -0.044 -0.905 -0.615  0.082  0.070  0.016  0.106              
Trtmn.L:T:W -0.046  0.775 -0.056  0.085  0.006 -0.906  0.065 -0.869  0.015 -0.014        
Trtmn.Q:T:W -0.025 -0.045  0.764  0.069  0.067  0.059 -0.906  0.008 -0.864 -0.141 -0.018
原因分析

因为你把Treatment定义成了有序因子(通过order=TRUE参数),R中线性模型(包括lmer)默认对有序因子采用正交多项式编码。对于有n个水平的有序因子,会自动生成n-1个正交项来拟合不同趋势:

  • 当n=3时,会生成线性趋势项(后缀.L)和二次趋势项(后缀.Q),这就是模型输出中出现二次项的原因。

这种编码方式的目的是检验自变量水平变化时因变量的线性、非线性趋势,但如果你只需要每个处理水平的主效应,就需要修改编码方式。

解决方法

有三种方式可以让模型只输出Treatment的线性主效应(无二次项):

  1. 将Treatment转换为无序因子
    修改数据处理代码,把order=TRUE改成order=FALSE:
D$Treatment <- factor(D$Treatment, order=FALSE, levels = c("L0","L2","L4"))
  1. 在模型公式中强制转成无序因子
    不用修改原始数据,直接在公式里用as.factor()转换:
mdl <- lmer(Rating ~ as.factor(Treatment) * Timepoint * Wellbeing + (Wellbeing | Participant), data = D, REML=F)
  1. 指定处理编码(Treatment Coding)
    保留有序因子的水平顺序,但覆盖默认的正交多项式编码,改用处理编码(以某个水平为参考,对比其他水平):
D$Treatment <- factor(D$Treatment, order=TRUE, levels = c("L0","L2","L4"))
contrasts(D$Treatment) <- contr.treatment(3, base=1) # base参数指定参考水平,这里选L0为参考

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:20:25