Predicción de logit ordenado en R

12

Estoy tratando de hacer una regresión logit ordenada. Estoy ejecutando el modelo así (solo un pequeño modelo tonto que estima el número de empresas en un mercado a partir de medidas de ingresos y población). Mi pregunta es sobre predicciones.

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

Cuando ejecuto predicción (que estoy tratando de usar para obtener la predicción y), las salidas son 0, 3 o 27, lo que de ninguna manera refleja lo que parece ser la predicción basada en mis predicciones manuales del coeficiente estimaciones e interceptaciones. ¿Alguien sabe cómo obtener predicciones "precisas" para mi modelo logit ordenado?

EDITAR

Para aclarar mi preocupación, mis datos de respuesta tienen observaciones en todos los niveles.

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

donde como mi variable de predicción parece estar acumulando

> head(table(pr_out))
pr_out
0     1   2   3   4   5 
117   0   0 114   0   0 
prototoast
fuente
2
Esto es bastante vago. ¿Cómo predictdifieren los valores devueltos por la función de los que generó manualmente? ¿Cuál es la estructura de su variable dependiente? Proporcione un ejemplo reproducible.
Sven Hohenstein
1
Creo que te gustaría ver esto: stats.stackexchange.com/questions/18119/…
Blain Waan
2
No entiendo bien tu situación. Usted dice que está utilizando un modelo de regresión ordinal, pero también dice, según tengo entendido, que su variable de respuesta es el número de empresas en un mercado. Eso es un recuento , es ordinal, pero OLR no es la forma correcta de modelar eso; Desea utilizar alguna variante de regresión de Poisson.
gung - Restablece a Monica
2
@gung Sí, entiendo el punto sobre conteo vs ordinal. En este momento, estoy tratando de replicar el documento ideas.repec.org/a/ucp/jpolec/v99y1991i5p977-1009.html y usan una regresión ordinal. También he estimado modelos de conteo, pero eso no me ayuda con esta tarea en particular. Además, no, no es que solo quiera que R haga esto, estoy tratando de entender dónde el comportamiento se está desviando de mis expectativas (porque sospecho que el error es de mi parte, no de R).
prototoast
1
¿Verificaste polr()contra otras funciones? Usted podría tratar lrm()de paquete rms: lrmFit <- lrm(y ~ pop0 + inc0); predict(lrmFit, type="fitted.ind"). Otra opción es vglm()desde el paquete VGAM: vglmFit <- vglm(y ~ pop0 + inc0, family=propodds); predict(vglmFit, type="response"). Ambos devuelven la matriz de probabilidades de categoría predichas. Vea mi respuesta para obtener las categorías predichas a partir de ahí.
caracal

Respuestas:

23

Para verificar manualmente las predicciones derivadas del uso polr()del paquete MASS, suponga una situación con una variable dependiente categórica con categorías ordenadas y predictores . asume el modelo de probabilidades proporcionales1 , ... , g , ... , k X 1 , ... , X j , ... , X pY1,,g,,kX1,,Xj,,Xppolr()

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

Para posibles opciones implementadas en otras funciones, vea esta respuesta . La función logística es la inversa de la función logit, por lo que las probabilidades predichas sonp^(Yg)

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

Las probabilidades de categoría predichas son . Aquí hay un ejemplo reproducible en R con dos predictores . Para una variable ordinal , corté una variable continua simulada en 4 categorías.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

Ahora ajuste el modelo de probabilidades proporcionales usando polr()y obtenga la matriz de probabilidades de categoría predichas usando 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

Para verificar manualmente estos resultados, necesitamos extraer las estimaciones de los parámetros, de estos calcular los logits pronosticados, de estos logits calcular las probabilidades predichas , y luego vincular las probabilidades de categoría predichas a una matriz .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)

Compare con el resultado de polr().

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

Para las categorías predichas, predict(polr(), type="class")solo elige, para cada observación, la categoría con la mayor probabilidad.

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

Comparar con el resultado de polr().

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

> all.equal(factor(categHat), facHat, check.attributes=FALSE)  # manual verification
[1] TRUE
lince
fuente