含二次项时,如何用emtrends获取Side因子的二次趋势差异?
问题
我希望以Age为自变量对响应变量RV建立模型,并引入了二次项。通常仅含线性项时,我会使用emmeans包的emtrends()函数获取因子Side两个水平的趋势差异。请问当模型中包含二次项I(Age^2)时,如何计算趋势差异?emtrends()能否实现该需求?
构建的模型及方差分析结果
> mod.quadra<-lmer(RV~Side*(Age + I(Age^2))+(1|ID),data) > Anova(mod.quadra) Chisq Df Pr(>Chisq) Side 2.0791 1 0.1493267 Age 12.0248 1 0.0005250 *** I(Age^2) 10.9917 1 0.0009152 *** Side:Age 1.8857 1 0.1696876 Side:I(Age^2) 2.0099 1 0.1562804
仅含线性项时的操作流程
> mtrend<-emtrends(LM.fit, "Side", var = "Age") Side Age.trend SE df lower.CL upper.CL contra 1.03 0.648 159 -0.251 2.31 ipsi 2.03 0.648 159 0.755 3.31 > pairs(mtrend) contrast estimate SE df t.ratio p.value contra - ipsi -1.01 0.891 149 -1.129 0.2606
解决方案
emtrends()完全可以处理带二次项的模型,核心是理解:二次模型中,响应变量对Age的趋势(即瞬时斜率)是随Age取值变化的线性函数,因此需要指定具体的Age值来计算趋势,再比较Side水平间的差异。
1. 计算指定Age值处的趋势
二次模型的趋势公式为:
$\text{趋势} = \beta_{\text{Age}} + 2\beta_{\text{I(Age^2)}} \times \text{Age} + \beta_{\text{Side:Age}} \times \text{Side} + 2\beta_{\text{Side:I(Age^2)}} \times \text{Side} \times \text{Age}$
使用emtrends()时,通过at参数指定要计算趋势的Age值(比如均值、中位数或业务上感兴趣的关键点):
# 计算Age的均值作为参考点 age_mean <- mean(data$Age, na.rm = TRUE) # 获取Side各水平在Age均值处的趋势 quad_trend <- emtrends(mod.quadra, "Side", var = "Age", at = list(Age = age_mean))
运行后会输出每个Side水平在指定Age处的瞬时趋势、标准误、置信区间等结果。
2. 比较Side水平间的趋势差异
和线性模型的操作一致,直接对emtrends()的结果调用pairs(),就能得到两个Side水平在指定Age处的趋势差异及显著性:
pairs(quad_trend)
3. 可选:在多个Age值处分析趋势差异
如果想观察趋势差异随Age的变化规律,可以指定多个Age值(比如分位数):
# 取Age的25%、50%、75%分位数 age_vals <- quantile(data$Age, c(0.25, 0.5, 0.75), na.rm = TRUE) # 计算多个Age值下的趋势 quad_trends_multi <- emtrends(mod.quadra, "Side", var = "Age", at = list(Age = age_vals)) # 查看所有结果 quad_trends_multi # 按Age分组比较Side的趋势差异 pairs(quad_trends_multi, by = "Age")
注意事项
- 二次模型的趋势依赖于Age的具体取值,不像线性模型中趋势是恒定的,因此必须指定Age值才能得到有意义的趋势估计。
- 从你的方差分析结果来看,
Side:Age和Side:I(Age^2)交互项均无显著性,说明两个Side水平的趋势随Age的变化模式没有显著差异,但仍可按上述方法计算特定Age处的趋势差异。
内容的提问来源于stack exchange,提问作者learners
相关产品推荐
相关产品推荐

