如何提取R中ordinal::clmm多层有序模型各层级截距与系数
问题概述
在R中使用ordinal::clmm函数拟合多层有序响应模型时,需要提取每个层级对应的截距与系数。
对于lme4::lmer估计的多层线性模型,直接调用coef函数即可完成该操作,但clmm拟合的有序模型暂未找到对应的直接提取方法。
示例
可复现数据集
以下为随机生成的可复现数据集,包含自变量(indv)、因变量(depv)、有序版因变量(depv2)以及层级分组变量(level)。
library(tidyverse) library(lme4) library(ordinal) test <- data.frame(depv = sample(1:4, 250, replace = TRUE), indv = runif(250), level = sample(1:4, 250, replace = TRUE)) %>% mutate(depv2 = factor(depv, levels = 1:4, labels = c("bad", "okay", "good", "great")), level = factor(level, levels = 1:4, labels = c("USA", "France", "China", "Brazil")))
模型拟合
首先估计多层线性模型:
test1 <- lmer(depv ~ indv + (1 + indv | level), data = test)
接下来拟合多层有序响应模型:
test2 <- clmm(depv2 ~ indv + (1 + indv | level), data = test)
系数提取差异
对线性模型直接调用coef即可得到各层级对应的截距与自变量系数:
> coef(test1) $level (Intercept) indv USA 2.239171 0.6238428 France 2.766888 -0.4173206 China 1.910860 1.2715852 Brazil 2.839156 -0.5599012
但对clmm拟合的有序模型执行相同操作时,仅返回总体阈值截距与固定效应系数,无法得到分组层级的对应系数:
> coef(test2) bad|okay okay|good good|great indv -1.13105544 0.09101709 1.32240904 0.37157688
解决方法
ordinal包没有为clmm对象实现和lmer一致的分组系数自动合并逻辑,按照lmer中coef的计算规则(固定效应 + 对应分组的随机效应偏移量)手动计算即可:
# 提取自变量的固定斜率 fix_slope <- coef(test2)["indv"] # 提取各层级的随机效应 ran_eff <- ranef(test2)$level # 合并得到各层级的实际系数 level_coef <- data.frame( `(Intercept)` = ran_eff[, 1], indv = fix_slope + ran_eff[, 2], row.names = rownames(ran_eff) )
最终输出的level_coef格式和coef(test1)返回的层级系数完全一致,行名对应各个分组层级。
注意:多层有序累积链接模型不存在线性模型中的总体固定截距,coef(test2)返回的bad|okay/okay|good/good|great是响应变量不同有序类别间的固定阈值切点,不会随分组层级变化;分组层面的随机效应仅调整潜变量的基准位置(随机截距)和自变量的效应幅度(随机斜率)。
内容的提问来源于stack exchange,提问作者Yasha
相关产品推荐
相关产品推荐

