为何R中MASS包polr()的重复测量随机效应模型预测值完全一致?
问题根源与解决方案
为什么预测值完全一致?
MASS包的polr()函数不支持随机效应语法,你写的(1 | ID)并没有被识别为随机截距项,实际拟合的是仅包含固定截距的有序logit模型(等价于polr(value ~ 1, data = subset_data))。这类模型对所有观测都输出相同的预测概率,自然不会体现被试间的差异。
正确拟合带随机效应的有序logit模型
要建模重复测量的随机效应,推荐使用以下两个工具:
方案1:使用ordinal包的clmm()函数
clmm()专门用于拟合条件logistic混合模型,完美支持有序因变量和随机效应:
# 安装并加载包 install.packages("ordinal") library(ordinal) # 拟合带被试随机截距的模型 random_effects_model_clmm <- clmm(value ~ 1 + (1 | ID), data = subset_data) # 生成每个观测的预测概率 predicted_values_clmm <- predict(random_effects_model_clmm, type = "prob")
此时不同被试(ID)的预测概率会呈现差异,因为模型捕捉了被试间的随机变异。
方案2:使用brms包的brm()函数(贝叶斯方法)
如果你倾向于贝叶斯框架,brms支持灵活的混合效应有序模型,结果解释更直观:
# 安装并加载包 install.packages("brms") library(brms) # 拟合贝叶斯有序logit混合模型 random_effects_model_brms <- brm( formula = value ~ 1 + (1 | ID), data = subset_data, family = cumulative() # 指定有序因变量的分布类型 ) # 生成预测概率 predicted_values_brms <- predict(random_effects_model_brms, type = "prob")
后续扩展
之后你还可以加入研究中的固定效应(Prompt_Condition和Response_Condition),比如修改公式为:
# clmm版本 clmm(value ~ Prompt_Condition * Response_Condition + (1 | ID), data = subset_data) # brms版本 brm(value ~ Prompt_Condition * Response_Condition + (1 | ID), data = subset_data, family = cumulative())
内容的提问来源于stack exchange,提问作者Peter Kortenkamp
相关产品推荐
相关产品推荐

