Prevedere logit ordinato in R


12

Sto provando a fare una regressione logit ordinata. Sto gestendo il modello in questo modo (solo un piccolo modello stupido che stima il numero di imprese in un mercato da misure di reddito e popolazione). La mia domanda riguarda le previsioni.

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

Quando eseguo predict (che sto cercando di utilizzare per ottenere la y prevista), gli output sono 0, 3 o 27, il che non riflette in alcun modo quella che dovrebbe essere la previsione basata sulle mie previsioni manuali dal coefficiente stime e intercettazioni. Qualcuno sa come ottenere previsioni "accurate" per il mio modello logit ordinato?

MODIFICARE

Per chiarire la mia preoccupazione, i miei dati di risposta contengono osservazioni a tutti i livelli

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

dove come la mia variabile di previsione sembra essere ammassata

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

2
Questo è abbastanza vago. In che modo i valori restituiti dalla predictfunzione differiscono da quelli generati manualmente? Qual è la struttura della tua variabile dipendente? Fornisci un esempio riproducibile.
Sven Hohenstein,


2
Non seguo abbastanza la tua situazione. Dici che stai usando un modello di regressione ordinale, ma dici anche, come meglio capisco, che la tua variabile di risposta è il numero di imprese in un mercato. Questo è un conteggio , è ordinale, ma OLR non è il modo giusto di modellarlo; vuoi usare qualche variante della regressione di Poisson.
gung - Ripristina Monica

2
@gung Sì, capisco il punto su count vs ordinal. Al momento, sto cercando di replicare il documento ideas.repec.org/a/ucp/jpolec/v99y1991i5p977-1009.html e usano una regressione ordinale. Ho anche stimato modelli di conteggio, ma ciò non mi aiuta in questa particolare attività. Inoltre, no, non è che voglio solo che R faccia questo, sto cercando di capire dove il comportamento si discosta dalle mie aspettative (perché sospetto che l'errore sia da parte mia, non R).
prototoast,

1
Hai verificato polr()rispetto ad altre funzioni? Si potrebbe provare lrm()dalla confezione rms: lrmFit <- lrm(y ~ pop0 + inc0); predict(lrmFit, type="fitted.ind"). Un'altra opzione è vglm()dalla confezione VGAM: vglmFit <- vglm(y ~ pop0 + inc0, family=propodds); predict(vglmFit, type="response"). Entrambi restituiscono la matrice delle probabilità di categoria previste. Vedi la mia risposta per ottenere le categorie previste da lì.
Caracal,

Risposte:


23

Per verificare manualmente le previsioni derivate dall'uso polr()dal pacchetto MASS, ipotizzare una situazione con una variabile dipendente categoriale con le categorie ordinate e predittori . assume il modello di probabilità proporzionaleY1,,g,,kX1,,Xj,,Xppolr()

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

Per le possibili scelte implementate in altre funzioni, vedere questa risposta . La funzione logistica è l'inverso della funzione logit, quindi le probabilità previste sonop^(Yg)

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

Le probabilità di categoria previste sono . Ecco un esempio riproducibile in R con due predittori . Per una variabile ordinale , ho tagliato una variabile continua simulata in 4 categorie.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

Ora adatta il modello di probabilità proporzionale utilizzando polr()e ottieni la matrice delle probabilità di categoria previste utilizzando 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

Per verificare manualmente questi risultati, è necessario estrarre le stime dei parametri, da questi calcolare i log previsti, da questi log calcolare le probabilità previste , quindi associare le probabilità della categoria prevista a una matrice .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)

Confronta con il risultato di polr().

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

Per le categorie previste, predict(polr(), type="class")seleziona - per ogni osservazione - la categoria con la più alta probabilità.

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

Confronta i risultati da polr().

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

> all.equal(factor(categHat), facHat, check.attributes=FALSE)  # manual verification
[1] TRUE
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.