预测R中的有序logit


12

我正在尝试进行有序的logit回归。我正在像这样运行模型(只是一个愚蠢的小模型,它根据收入和人口指标来估算市场中的公司数量)。我的问题是关于预测。

nfirm.opr<-polr(y~pop0+inc0, Hess = TRUE)
pr_out<-predict(nfirm.opr)

当我运行预测(我试图使用它来获取预测的y)时,输出为0、3或27,这决不会反映基于我根据系数的人工预测应该看起来像是预测估计和截距。有谁知道如何为我订购的logit模型获得“准确”的预测?

编辑

为了澄清我的担忧,我的回答数据包含所有级别的观察结果

>head(table(y))
y
0  1  2  3  4  5 
29 21 19 27 15 16 

正如我的预测变量似乎在聚集

> head(table(pr_out))
pr_out
0     1   2   3   4   5 
117   0   0 114   0   0 

2
这是相当模糊的。predict函数返回的值与您手动生成的值有何不同?您的因变量的结构是什么?请提供一个可复制的示例。
Sven Hohenstein


2
我不太了解你的情况。您说您正在使用序数回归模型,但是据我所知,您还说您的响应变量是市场中的公司数量。这是一个,它是有序的,但OLR不是模型的正确方法; 您想使用泊松回归的某种变体。
gung-恢复莫妮卡

2
@gung是的,我了解计数与顺序的关系。目前,我正在尝试复制纸上的idea.repec.org/a/ucp/jpolec/v99y1991i5p977-1009.html,它们使用有序回归。我还估算了计数模型,但这对我完成这项特定任务没有帮助。另外,不,不是我只想让R执行此操作,而是试图了解行为在哪里偏离了我的期望(因为我怀疑错误是我自己而不是R造成的)。
prototoast 2012年

1
您是否polr()针对其他功能进行了验证?你可以尝试lrm()从包rmslrmFit <- lrm(y ~ pop0 + inc0); predict(lrmFit, type="fitted.ind")。另一种选择是vglm()从包VGAMvglmFit <- vglm(y ~ pop0 + inc0, family=propodds); predict(vglmFit, type="response")。两者都返回预测类别概率的矩阵。查看我的答案以从中获取预测的类别。
caracal 2012年

Answers:


23

polr()MASSY1,,g,,kX1,,Xj,,Xppolr()

logit(p(Yg))=lnp(Yg)p(Y>g)=β0g(β1X1++βpXp)

有关其他功能中可能实现的选择,请参见此答案。逻辑函数是逻辑函数的逆函数,因此预测概率为p^(Yg)

p^(Yg)=eβ^0g(β^1X1++β^pXp)1+eβ^0g(β^1X1++β^pXp)

预测类别概率为。这是R中具有两个预测变量的可复制示例。对于序数变量,我将模拟的连续变量分为4类。P^(Y=g)=P^(Yg)P^(Yg1)X1,X2Y

set.seed(1.234)
N     <- 100                                    # number of observations
X1    <- rnorm(N, 5, 7)                         # predictor 1
X2    <- rnorm(N, 0, 8)                         # predictor 2
Ycont <- 0.5*X1 - 0.3*X2 + 10 + rnorm(N, 0, 6)  # continuous dependent variable
Yord  <- cut(Ycont, breaks=quantile(Ycont), include.lowest=TRUE,
             labels=c("--", "-", "+", "++"), ordered=TRUE)    # ordered factor

现在使用拟合比例赔率模型,polr()并使用来获得预测类别概率的矩阵predict(polr(), type="probs")

> library(MASS)                              # for polr()
> polrFit <- polr(Yord ~ X1 + X2)            # ordinal regression fit
> Phat    <- predict(polrFit, type="probs")  # predicted category probabilities
> head(Phat, n=3)
         --         -         +        ++
1 0.2088456 0.3134391 0.2976183 0.1800969
2 0.1967331 0.3068310 0.3050066 0.1914293
3 0.1938263 0.3051134 0.3067515 0.1943088

要手动验证这些结果,我们需要提取参数估计值,从这些参数估计值中计算出预测的对数,从这些逻辑值中计算出预测的概率,然后将预测的类别概率绑定到矩阵。p^(Yg)

ce <- polrFit$coefficients         # coefficients b1, b2
ic <- polrFit$zeta                 # intercepts b0.1, b0.2, b0.3
logit1 <- ic[1] - (ce[1]*X1 + ce[2]*X2)
logit2 <- ic[2] - (ce[1]*X1 + ce[2]*X2)
logit3 <- ic[3] - (ce[1]*X1 + ce[2]*X2)
pLeq1  <- 1 / (1 + exp(-logit1))   # p(Y <= 1)
pLeq2  <- 1 / (1 + exp(-logit2))   # p(Y <= 2)
pLeq3  <- 1 / (1 + exp(-logit3))   # p(Y <= 3)
pMat   <- cbind(p1=pLeq1, p2=pLeq2-pLeq1, p3=pLeq3-pLeq2, p4=1-pLeq3)  # matrix p(Y = g)

与的结果进行比较polr()

> all.equal(pMat, Phat, check.attributes=FALSE)
[1] TRUE

对于预测的类别,predict(polr(), type="class")只需为每个观察选择一个概率最高的类别。

> categHat <- levels(Yord)[max.col(Phat)]   # category with highest probability
> head(categHat)
[1] "-"  "-"  "+"  "++" "+"  "--"

比较的结果polr()

> facHat <- predict(polrFit, type="class")  # predicted categories
> head(facHat)
[1] -  -  +  ++ +  --
Levels: -- - + ++

> all.equal(factor(categHat), facHat, check.attributes=FALSE)  # manual verification
[1] TRUE
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.