线性混合效应模型与有序 Probit 与有序 Logit 与序数响应

机器算法验证 混合模式 线性模型 概率 有序的logit
2022-04-10 13:40:19

我有一组数据,其序数响应范围从1-5(最差到最好)和一个具有五个无序级别的分类预测变量。该实验是一项语言实验,要求受试者对不同的句子类型进行评分。在文献中,人们似乎lmer()大部分时间都通过缩放每个受试者的序数反应来适应(即取该受试者的平均反应和标准偏差并将每个单一反应除以它。)。另一方面,使用有序线性混合效应概率模型或有序线性混合效应 logit 模型似乎是一种合理的方法,如在 egMCMCglmm()或中实现的clmm()

(1) 我发现自己在问最好的方法是什么。正如我上面所描绘的那样,在实验中,什么时候一种方法比另一种方法更受欢迎?

(2) 为什么人们更喜欢拟合lmer()具有比例响应的模型?有什么好处?

(3) 如果建议使用有序 probit 或 logit 模型,我如何在有序 probit 或有序 logit 模型之间做出选择?

谢谢你的帮助!

1个回答

这充其量只是部分答案,但希望它有所帮助。

鉴于您的回答是有序的,您必须问自己不同类别之间的距离是否因起始位置而异。换句话说。如果您认为 1 和 3 之间的差距不一定与 2 和 4 之间的差距相同,那么使用累积链接模型(例如 logit 或 probit)是最佳选择。我建议您阅读 Christensen (2013) 的教程和额外信息,ordinal以帮助您一路走好。

为什么人们更喜欢 lmer() 可能与良好的统计数据或计量经济学关系不大,而更多地与习惯和方法制度化有关。我从经验中知道,在大多数人使用 GLS 或 OLS 时提出 CLM 模型可能是不明智的,不是因为 CLM 不是更好的模型,而是因为您基本上是在告诉您的读者社区“到目前为止,您伙计们错了”这不是那么容易接受的。

通常会进行居中和标准化,因为人们认为这会减轻对共线性等的具体担忧。关于这是否属实,到处都有很多争论,但在我看来(对数转换也是如此),您正在减少方差并更改数据,如果您对此有理论动机,这只是一个好主意,如果没有,请使用实际数据并更改您的模型。

至于 logit 与 probit 的选择。差别一般不大。我将再次以数据为指导。您可以按以下方式开始:

# Finding the best matching link function
links <- c("logit", "probit", "cloglog", "loglog", "cauchit")
sapply(links, function(link){
  clm(formula, data=df, link=link)$logLik})
    # See which one fits best

# Finding the best threshold function
thresholds <- c("symmetric", "flexible", "equidistant")
sapply(thresholds, function(threshold){
  clm(formula, data=df, link="select best fitting link function",threshold=threshold)$logLik
})

这将为您提供取决于模型的数据之间的最佳拟合(最低对数似然)。一般来说,如果你有很多“极端”值(即在你的情况下最坏和最好),概率会更好,因为它与正态分布相关,而正态分布的尾部比逻辑分布(logit)更胖。

最后,这里有一些简单的代码,可以让您很好地了解您的模型(和 X 变量)如何让您预测响应变量。此代码将绘制模型中正确响应的发生率和错误预测的数量(以及它们的错误程度)。

pred. <- predict(FORMULA, type = "class")$fit
    plot(df$RESPONSE,pred.,type="p", pch=15,cex = sqrt(table(df$RESPONSE,pred.))/5)
     # YOU WILL SEE THIS PLOT IS NOT THAT USEFUL
    results <- data.frame(cbind(as.numeric(as.character(df$RESPONSE)),as.numeric(as.character(pred.)),as.numeric(as.character(df$RESPONSE))-as.numeric(as.character(pred.))))
      sum(results[,3]) # THIS WILL GIVE YOU A FAST IDEA ABOUT WHETHER YOU OVERESTIMATE (LARGE POSITIVE VALUE, OR UNDERESTIMATE, THE ACTUAL RESPONSE
      results$dum <- 1
  tmp <- data.frame(with(results, tapply(dum, results[,3],sum)))
  tmp$z <- seq(min(results[,3]),max(results[,3]),by=1) 
      plot(tmp$z,tmp[,1], type="h", xlab ="Deviation from correct prediction",ylab="Number of Predictions")

让我知道你的想法!

西蒙