Il controllo delle probabilità proporzionali presuppone una regressione logistica ordinale usando la funzione polr


9

Ho usato la funzione 'polr' nel pacchetto MASS per eseguire una regressione logistica ordinale per una variabile di risposta categoriale ordinale con 15 variabili esplicative continue.

Ho usato il codice (mostrato sotto) per verificare che il mio modello soddisfi il presupposto delle quote proporzionali seguendo i consigli forniti nella guida dell'UCLA . Tuttavia, sono un po 'preoccupato per l'output che implica che non solo i coefficienti tra i vari punti di taglio sono simili, ma sono esattamente gli stessi (vedi grafico sotto).

FGV1b <- data.frame(FG1_val_cat=factor(FGV1b[,"FG1_val_cat"]), 
                    scale(FGV1[,c("X","Y","Slope","Ele","Aspect","Prox_to_for_FG", 
                          "Prox_to_for_mL", "Prox_to_nat_border", "Prox_to_village", 
                          "Prox_to_roads", "Prox_to_rivers", "Prox_to_waterFG", 
                          "Prox_to_watermL", "Prox_to_core", "Prox_to_NR", "PCA1", 
                          "PCA2", "PCA3")]))
b     <- polr(FG1_val_cat ~ X + Y + Slope + Ele + Aspect + Prox_to_for_FG + 
                            Prox_to_for_mL + Prox_to_nat_border + Prox_to_village + 
                            Prox_to_roads + Prox_to_rivers + Prox_to_waterFG + 
                            Prox_to_watermL + Prox_to_core + Prox_to_NR, 
              data=FGV1b, Hess=TRUE)

Visualizza un riepilogo del modello:

summary(b)
(ctableb <- coef(summary(b)))
q        <- pnorm(abs(ctableb[, "t value"]), lower.tail=FALSE) * 2
(ctableb <- cbind(ctableb, "p value"=q))

E ora possiamo guardare gli intervalli di confidenza per le stime dei parametri:

(cib <- confint(b)) 
confint.default(b)

Ma questi risultati sono ancora abbastanza difficili da interpretare, quindi convertiamo i coefficienti in rapporti di probabilità

exp(cbind(OR=coef(b), cib))

Verifica del presupposto. Quindi il seguente codice stimerà i valori da rappresentare graficamente. Innanzitutto ci mostra le trasformazioni logit delle probabilità di essere maggiore o uguale a ciascun valore della variabile target

FG1_val_cat <- as.numeric(FG1_val_cat)
sf <- function(y) {
  c('VC>=1' = qlogis(mean(FG1_val_cat >= 1)),
    'VC>=2' = qlogis(mean(FG1_val_cat >= 2)),
    'VC>=3' = qlogis(mean(FG1_val_cat >= 3)),
    'VC>=4' = qlogis(mean(FG1_val_cat >= 4)),
    'VC>=5' = qlogis(mean(FG1_val_cat >= 5)),
    'VC>=6' = qlogis(mean(FG1_val_cat >= 6)),
    'VC>=7' = qlogis(mean(FG1_val_cat >= 7)),
    'VC>=8' = qlogis(mean(FG1_val_cat >= 8)))
}
(t <- with(FGV1b, summary(as.numeric(FG1_val_cat) ~ X + Y + Slope + Ele + Aspect + 
                             Prox_to_for_FG + Prox_to_for_mL + Prox_to_nat_border + 
                             Prox_to_village + Prox_to_roads + Prox_to_rivers + 
                             Prox_to_waterFG + Prox_to_watermL + Prox_to_core + 
                             Prox_to_NR, fun=sf)))

La tabella sopra mostra i valori (lineari) previsti che otterremmo se regredivamo la nostra variabile dipendente sulle variabili del predittore una alla volta, senza l'assunzione di pendenze parallele. Quindi ora possiamo eseguire una serie di regressioni logistiche binarie con diversi punti di taglio sulla variabile dipendente per verificare l'uguaglianza dei coefficienti attraverso i punti di taglio

par(mfrow=c(1,1))
plot(t, which=1:8, pch=1:8, xlab='logit', main=' ', xlim=range(s[,7:8]))

controllo di assunzione polr

Mi scuso se non sono un esperto di statistica e forse mi manca qualcosa di ovvio qui. Tuttavia, ho passato molto tempo a cercare di capire se c'è un problema nel modo in cui ho testato l'ipotesi del modello e anche a cercare altri modi per eseguire lo stesso tipo di modello.

Ad esempio, ho letto in molte mailing list della guida che altri usano la funzione vglm (nel pacchetto VGAM) e la funzione lrm (nel pacchetto rms) (per esempio vedi qui: ipotesi di quote proporzionali nella regressione logistica ordinale in R con i pacchetti VGAM e rms ). Ho provato a utilizzare gli stessi modelli, ma continuo a confrontarmi con avvisi ed errori.

Ad esempio, quando provo ad adattare il modello vglm con l'argomento 'parallel = FALSE' (poiché il link precedente menziona è importante per testare il presupposto delle probabilità proporzionali), incontro il seguente errore:

Errore in lm.fit (X.vlm, y = z.vlm, ...): NA / NaN / Inf in 'y'
Inoltre: Messaggio di avviso:
In Deviance.categorical.data.vgam (mu = mu, y = y, w = w, residui = residui,: valori adattati vicini a 0 o 1

Vorrei chiedere per favore se c'è qualcuno che potrebbe capire ed essere in grado di spiegarmi perché il grafico che ho prodotto sopra sembra così. Se davvero significa che qualcosa non va, potresti aiutarmi a trovare un modo per testare il presupposto delle probabilità proporzionali quando usi semplicemente la funzione polr. O se ciò non fosse possibile, ricorrerei al tentativo di utilizzare la funzione vglm, ma avrei quindi bisogno di aiuto per spiegare perché continuo a ricevere l'errore indicato sopra.

NOTA: come sfondo, ci sono 1000 punti dati qui, che sono in realtà punti di posizione in un'area di studio. Sto cercando di vedere se ci sono relazioni tra la variabile di risposta categoriale e queste 15 variabili esplicative. Tutte queste 15 variabili esplicative sono caratteristiche spaziali (ad esempio altezza, coordinate xy, vicinanza alla foresta, ecc.). I 1000 punti dati sono stati assegnati in modo casuale utilizzando un GIS, ma ho adottato un approccio di campionamento stratificato. Mi sono assicurato che 125 punti fossero scelti casualmente all'interno di ciascuno degli 8 diversi livelli di risposta categorici. Spero che questa informazione sia anche utile.

Risposte:


1

La variabile dipendente ha 8 livelli ordinati, quindi nel grafico per testare l'assunzione di probabilità proporzionale dovresti vedere 8 simboli diversi per ogni variabile indipendente. Vedi solo 2 simboli per ogni variabile indipendente probabilmente perché hai scelto un intervallo troppo breve per i valori dell'asse x. Se la mia congettura è corretta, devi solo usare un intervallo più ampio per i valori dell'asse x. Prova questo codice:

par(mfrow=c(1,1))
plot(t, which=1:8, pch=1:8, xlab='logit', main=' ', xlim=range(s[,3:9]))

5
Questo non è abbastanza per essere una risposta dai nostri standard. Puoi elaborare? Cosa fa questo codice / come funziona per verificare l'assunzione dell'OP? (Ad esempio, in che modo qualcuno che utilizza software diverso userebbe questo stesso approccio?)
gung - Ripristina Monica

Ho appena migliorato la mia risposta. Per favore, dimmi se è soddisfacente
John M

1

Quindi, l'ho trovato su Google e penso che una risposta potrebbe essere ancora utile per questo motivo. Penso che l'errore sia dentro

sf <- function(y) {
  c('VC>=1' = qlogis(mean(FG1_val_cat >= 1)),
    'VC>=2' = qlogis(mean(FG1_val_cat >= 2)),
    'VC>=3' = qlogis(mean(FG1_val_cat >= 3)),
    'VC>=4' = qlogis(mean(FG1_val_cat >= 4)),
    'VC>=5' = qlogis(mean(FG1_val_cat >= 5)),
    'VC>=6' = qlogis(mean(FG1_val_cat >= 6)),
    'VC>=7' = qlogis(mean(FG1_val_cat >= 7)),
    'VC>=8' = qlogis(mean(FG1_val_cat >= 8)))
}

dove usi FG1_val_catpiuttosto che y. Utilizzando l'esempio delle strategie di modellazione della regressione di Harrell:

library(Hmisc)
getHdata(support)
support <- support[complete.cases(support[, c("sfdm2", "adlsc", "sex", "age", "meanbp")]), ]
sfdm <- as.integer (support$sfdm2 ) - 1

sf1 <- function (y) {
  c(' Y ≥ 1 ' = qlogis (mean(sfdm >= 1)), 
    ' Y ≥ 2 ' = qlogis (mean(sfdm >= 2)),
    ' Y ≥ 3 ' = qlogis (mean(sfdm >= 3))
  )
}

sf2 <- function (y) {
  c(' Y ≥ 1 ' = qlogis (mean(y >= 1)), 
    ' Y ≥ 2 ' = qlogis (mean(y >= 2)),
    ' Y ≥ 3 ' = qlogis (mean(y >= 3))
  )
}

s1 <- summary(sfdm ~ adlsc + sex + age + meanbp, fun=sf1,
              data = support)
s2 <- summary(sfdm ~ adlsc + sex + age + meanbp, fun=sf2,
              data = support)  

plot(s1, which =1:3, pch =1:3, xlab = ' logit ', main = ' ', width.factor = 1.4, cex.lab = 0.75)

plot(s2, which =1:3, pch =1:3, xlab = ' logit ', main = ' ', width.factor = 1.4, cex.lab = 0.75)

inserisci qui la descrizione dell'immagine vs

inserisci qui la descrizione dell'immagine

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.