更新(评论后):
基本clm
模型是这样定义的(详见clm 教程):
生成数据:
library(ordinal)
set.seed(1)
test.data = data.frame(y=gl(4,5),
x=matrix(c(sample(1:4,20,T)+rnorm(20), rnorm(20)), ncol=2))
head(test.data) # two independent variables
test.data$y # four levels in y
构建模型:
fm.polr <- polr(y ~ x) # using polr
fm.clm <- clm(y ~ x) # using clm
现在我们可以访问thetas
and betas
(见上面的公式):
# Thetas
fm.polr$zeta # using polr
fm.clm$alpha # using clm
# Betas
fm.polr$coefficients # using polr
fm.clm$beta # using clm
获得线性预测变量(仅theta
公式右侧没有的部分):
fm.polr$lp # using polr
apply(test.data[,2:3], 1, function(x) sum(fm.clm$beta*x)) # using clm
新数据生成:
# Contains only independent variables
new.data <- data.frame(x=matrix(c(rnorm(10)+sample(1:4,10,T), rnorm(10)), ncol=2))
new.data[1,] <- c(0,0) # intentionally for demonstration purpose
new.data
有四种类型的预测可用于clm
模型。我们对 感兴趣type=linear.prediction
,它返回一个包含两个矩阵的列表:eta1
和eta2
。它们包含每个观测值的线性预测变量new.data
:
lp.clm <- predict(fm.clm, new.data, type="linear.predictor")
lp.clm
注 1: eta1
和eta2
字面上相等。第二个只是在索引中旋转eta1
1 。j
因此,它们分别打开了线性预测量表的左侧和右侧。
all.equal(lp.clm$eta1[,1:3], lp.clm$eta2[,2:4], check.attributes=FALSE)
# [1] TRUE
注2:第一行的预测new.data
等于thetas
(只要我们将此行设置为零)。
all.equal(lp.clm$eta1[1,1:3], fm.clm$alpha, check.attributes=FALSE)
# [1] TRUE
注 3:我们可以手动构建这样的预测。例如,第二行的预测new.data
:
second.line <- fm.clm$alpha - sum(fm.clm$beta*new.data[2,])
all.equal(lp.clm$eta1[2,1:3], second.line, check.attributes=FALSE)
# [1] TRUE
注 4:如果new.data
包含响应变量,则predict
仅返回指定水平的线性预测变量y
。我们可以再次手动检查它:
new.data$y <- gl(4,3,length=10)
lp.clm.y <- predict(fm.clm, new.data, type="linear.predictor")
lp.clm.y
lp.manual <- sapply(1:10, function(i) lp.clm$eta1[i,new.data$y[i]])
all.equal(lp.clm.y$eta1, lp.manual)
# [1] TRUE