使用累积链接混合模型进行概率预测

时间:2013-07-05 14:43:02

标签: r regression ordinal mixed-models

我正在尝试将累积链接混合模型与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()的语法中有什么错误吗?通常哪个概率确实预测.clmm2()输出? Pr(J<j)Pr(J=j)?有人可以向我指出有关使用R专门拟合分类(序数)序数混合模型的信息(网站,书籍)材料。从我在文献和网络中的搜索中,大多数研究人员都使用SAS来拟合这些模型。

1 个答案:

答案 0 :(得分:2)

你没有说你纠正了什么,但是当我使用它时,我没有得到任何错误:

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

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

> 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 & Random=all)