【问题标题】:Probability predictions with cumulative link mixed models累积链接混合模型的概率预测
【发布时间】:2013-07-05 14:43:01
【问题描述】:

我正在尝试使用 ordinal 包拟合累积链接混合模型,但对于获取预测概率,我有一些不明白的地方。我使用ordinal 包中的以下示例:

   library(ordinal)
data(soup)
## More manageable data set:
dat <- subset(soup, as.numeric(as.character(RESP)) <=  24)
dat$RESP <- dat$RESP[drop=TRUE]
m1 <- clmm2(SURENESS ~ PROD, random = RESP, data = dat, link="logistic",  Hess = TRUE,doFit=T)
summary(m1)
str(dat)

现在我正在尝试预测新数据集的概率

newdata1=data.frame(PROD=factor(c("Ref", "Ref")), SURENESS=factor(c("6","6")))

predict(m1, newdata=newdata1)

但我收到以下错误

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels

为什么会出现此错误? predict.clmm2() 的语法有什么问题吗?通常 predict.clmm2() 输出哪些概率? Pr(J&lt;j) 还是 Pr(J=j)?有人可以向我指出有关使用 R 拟合分类(序数)序数混合模型的信息(网站、书籍)材料。根据我在文献和网络中的搜索,大多数研究人员都将这类模型与 SAS 拟合。

【问题讨论】:

  • 可能需要执行类似newdata1=data.frame(PROD=factor(c("Ref","Ref") , levels = c("Ref","Somethingelse"), ... ) 的操作 - 错误表明您无法预测少于 2 个因子水平(您拥有)的事物。
  • (免责声明:我对 CLMM 一无所知)在您的模型公式中,SURENESS 似乎是您的响应变量,但您在 newdata 中使用它而不是 SOUPTYPE。此外,您将 PROD 排除在原始公式之外,但将其包含在新数据中。那是故意的吗?无论如何,当我运行代码时,无论我在 newdata 中使用 SOUPTYPE 还是 SURENESS,R 都会告诉我另一个变量丢失(即我从你那里得到一个不同的错误,R 2.15.0)
  • 谢谢。我纠正了它,但仍然吐出同样的错误。
  • @DavidMarx:predict.clmm2 要求响应变量在 newdata 参数中,并且要求因子水平与原始数据匹配。

标签: r regression ordinal mixed-models


【解决方案1】:

你没有说你更正了什么,但是当我使用这个时,我没有收到错误:

newdata1=data.frame(PROD=factor(c("Test", "Test"), levels=levels(dat$PROD)), 
                    SURENESS=factor(c("1","1")) )
predict(m1, newdata=newdata1)

带有 newdata 参数的 predict.clmm2 的输出没有多大意义,除非您将所有因子水平对齐以使它们与输入数据一致:

> newdata1=data.frame(
                PROD=factor(c("Ref", "Test"), levels=levels(dat$PROD)), 
                SURENESS=factor(c("1","1")) )
> predict(m1, newdata=newdata1)
 [1] 1 1 1 1 1 1 1 1 1 1 1 1

不是很有趣。预测是针对只有一个级别的结果,其处于该级别的概率为 1。 (一个空洞的预测。)但是重新创建原始有序结果的结构更有意义:

> newdata1=data.frame(
             PROD=factor(c("Ref", "Test"), levels=levels(dat$PROD)), 
             SURENESS=factor(c("1","1"), levels=levels(dat$SURENESS)) , )
> predict(m1, newdata=newdata1)
[1] 0.20336975 0.03875713

您可以通过汇总各个级别的所有预测来回答 cmets 中的问题:

> sapply(as.character(1:6), function(x){ newdata1=data.frame(PROD=factor(c("Ref", "Test"), levels=levels(dat$PROD)), SURENESS=factor(c(x,x), levels=levels(dat$SURENESS))  );predict(m1, newdata=newdata1)})
              1          2          3          4         5         6
[1,] 0.20336975 0.24282083 0.10997039 0.07010327 0.1553313 0.2184045
[2,] 0.03875713 0.07412618 0.05232823 0.04405965 0.1518367 0.6388921
> out <- .Last.value
> rowSums(out)
[1] 1 1

概率是Pr(J=j|X=x &amp; Random=all)

【讨论】:

  • 谢谢。我想我错过了这样一个事实,即为分类回归变量分隔匹配值 标签很重要。这是特定于 predict.clmm2() 的吗?你是否也碰巧知道predict.clmm2() 的输出中有什么样的概率?它们是 Pr(J
  • 不仅是回归量,还有结果。
  • 非常感谢。只是为了检查一下,适合模型log(odds)=a+bx 对吗?我问是因为其他程序往往适合log(odds)=a-bx
  • 你应该研究一下这个小插图:cran.r-project.org/web/packages/ordinal/vignettes/clm_intro.pdf。看起来 clm 包使用遵循您归因于“其他程序”的约定。我认为它让概率总和为一。
  • @42- 感谢您提供的指导性示例。我想知道是否可以将随机效应的后验均值包含在预测中。当将第二级RESP 包含到数据帧中:newdata1=data.frame( PROD=factor(c("Ref", "Test"), levels=levels(dat$PROD)), RESP=factor(c("1", "3"), levels=levels(dat$RESP)), SURENESS=factor(c("1","1"), levels=levels(dat$SURENESS))) 并将其输入到各种 RESP 级别的预测序列中时,概率保持不变,这意味着预测只评估固定部分?
猜你喜欢
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多