emtrends提取分段回归分组分区间斜率仅返回单值问题咨询
问题原因
你的代码拿不到4个分段斜率,核心出在三个问题:
emtrends()默认对原始自变量tsr计算全区间的平均边际斜率,不会自动按你设置的365断点拆分区间计算分段斜率,因此每个release_type只会返回1个整体斜率值- 你传入的
params = "bp"不是emtrends()的合法有效参数,运行时会被直接忽略,根本不会按你设定的断点拆分计算 - 你在模型公式里嵌套调用自定义
b1()/b2()函数生成基函数,会导致emmeans无法正确映射变量和模型项的对应关系,进一步干扰斜率计算
修正步骤
1. 提前在数据集内生成分段变量
不要在模型公式内部套自定义函数生成基项,先把断点前后的两个斜率变量直接写入数据集,保证模型项和变量可被emmeans识别:
bp <- 365 # 生成断点前、断点后两个分段斜率项 df$tsr_pre <- ifelse(df$tsr < bp, bp - df$tsr, 0) df$tsr_post <- ifelse(df$tsr < bp, 0, df$tsr - bp) # 加载依赖包、重新拟合混合效应模型 library(emmeans) library(lme4) m1 <- lmer(cond ~ tsr_pre + tsr_post + tsr_pre:release_type + tsr_post:release_type + release_type + (1|notch), data = df)
2. 构造参考网格指定分段计算位置
分段线性模型在同一段内的斜率是固定值,只需要分别在断点前、断点后各选一个落在段内的tsr值,构造参考网格,再计算对应位置的边际斜率,就能得到对应分段的斜率:
# 构造参考网格:tsr选100(断点前)、500(断点后)即可,只要落在对应分段内,取值不影响斜率估计结果 rg <- ref_grid(m1, at = list(tsr = c(100, 500))) # 按release_type、分段位置分组计算斜率,同时输出组间对比 res <- emtrends(rg, pairwise ~ release_type | tsr, var = "tsr") # 输出估计结果 summary(res)
结果里tsr = 100分组下的两个估计值就是两类release_type在365天断点前的斜率,tsr = 500分组下的两个估计值就是断点后的斜率,刚好是你需要的4个斜率值,同时会自动输出标准误、置信区间、组间斜率差异的检验结果。
备注:这种计算方式不需要手动从
summary(m1)里加总主效应和交互项系数,避免手动计算出错,得到的就是各分组在对应分段的纯粹斜率估计。
内容的提问来源于stack exchange,提问作者Rnoobie
相关产品推荐
相关产品推荐

