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

如何提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:39:12