线性预测器 - 有序概率(ordinal,clm)

时间:2013-01-17 23:33:47

标签: r package ordinal

我对ordinal中的R包或有关predict.clm()功能的问题有疑问。我想计算linear predictor估算的ordered probit。使用MASS包的polr函数,可以通过对象$ lp访问线性预测器。它给了我每条线的价值,并且符合我所理解的线性预测器即X_i'beta。但是,如果我在clm()的有序概率估算中使用predict.clm(object, newdata,"linear.predictor"),我会得到一个包含元素eta1和eta2的列表,

  1. 如果newdata包含因变量
  2. ,则每列一列
  3. 其中每个元素包含与因变量中的级别一样多的列,如果newdata不包含因变量
  4. 不幸的是,我不知道这意味着什么。同样在作者的文件和文件中,我没有找到任何有关它的信息。你们其中一个人会非常高兴能够启发我吗?这会很棒。

    干杯,

    AK

1 个答案:

答案 0 :(得分:3)

更新(评论后):

基本clm模型的定义如下(详见clm tutorial):

生成数据:

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

现在我们可以访问thetasbetas(参见上面的公式):

# 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感兴趣,它返回一个包含两个矩阵的列表:eta1eta2。它们包含new.data中每个观察的线性预测变量:

lp.clm <- predict(fm.clm, new.data, type="linear.predictor")
lp.clm

注1: eta1eta2字面上相同。第二个是在eta1索引中将j轮换为1。因此,它们分别打开线性预测器刻度的左侧和右侧。

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