Ottenere valori p per "multinom" in R (pacchetto nnet)


19

Come ottengo i valori p usando la multinomfunzione del nnetpacchetto in R?

Ho un set di dati che consiste di "punteggi patologici" (assente, lieve, grave) come variabile di risultato e due effetti principali: età (due fattori: venti / trenta giorni) e gruppo di trattamento (quattro fattori: infetti senza ATB; infetti + ATB1; infetto + ATB2; infetto + ATB3).

Innanzitutto ho cercato di adattare un modello di regressione ordinale, che sembra più appropriato date le caratteristiche della mia variabile dipendente (ordinale). Tuttavia, l'ipotesi della proporzionalità delle probabilità è stata gravemente violata (graficamente), il che mi ha spinto a utilizzare invece un modello multinomiale, usando il nnetpacchetto.

Innanzitutto ho scelto il livello di risultato che devo utilizzare come categoria di base:

Data$Path <- relevel(Data$Path, ref = "Absent")

Quindi, avevo bisogno di impostare le categorie di base per le variabili indipendenti:

Data$Age <- relevel(Data$Age, ref = "Twenty")
Data$Treat <- relevel(Data$Treat, ref="infected without ATB") 

Il modello:

test <- multinom(Path ~ Treat + Age, data = Data) 
# weights:  18 (10 variable) 
initial value 128.537638 
iter 10 value 80.623608 
final  value 80.619911 
converged

Il risultato:

Coefficients:
         (Intercept)   infected+ATB1   infected+ATB2   infected+ATB3    AgeThirty
Moderate   -2.238106   -1.1738540      -1.709608       -1.599301        2.684677
Severe     -1.544361   -0.8696531      -2.991307       -1.506709        1.810771

Std. Errors:
         (Intercept)    infected+ATB1   infected+ATB2   infected+ATB3    AgeThirty
Moderate   0.7880046    0.8430368       0.7731359       0.7718480        0.8150993
Severe     0.6110903    0.7574311       1.1486203       0.7504781        0.6607360

Residual Deviance: 161.2398
AIC: 181.2398

Per un po ', non sono riuscito a trovare un modo per ottenere i valori per il modello e le stime durante l'utilizzo . Ieri mi sono imbattuto in un post in cui l'autore ha presentato un problema simile per quanto riguarda la stima dei valori per coefficienti ( Come impostare e stimare un modello logit multinomiale in R? ). Lì, un blogger ha suggerito che ottenere valori dal risultato di è abbastanza semplice, ottenendo prima i valori come segue:pnnet:multinomppsummarymultinomt

pt(abs(summary1$coefficients / summary1$standard.errors), df=nrow(Data)-10, lower=FALSE) 

         (Intercept)   infected+ATB1   infected+ATB2   infected+ATB3    AgeThirty
Moderate 0.002670340   0.08325396      0.014506395     0.02025858       0.0006587898
Severe   0.006433581   0.12665278      0.005216581     0.02352202       0.0035612114

Secondo Peter Dalgard, "C'è almeno un fattore 2 mancante per un valore due code . Di solito è un errore usare la distribuzione per ciò che è veramente una statistica ; per i dati aggregati, può essere un brutto errore ". Secondo Brian Ripley, "è anche un errore utilizzare i test Wald per gli attacchi, poiché soffrono degli stessi problemi (potenzialmente gravi) degli attacchi binomiali. Utilizzare intervalli di confidenza della probabilità del profilo (per i quali il pacchetto fornisce software), oppure se è necessario eseguire il test, test del rapporto di verosimiglianza (idem). "ptzmultinom

Devo solo essere in grado di derivare valori affidabili .p


È possibile utilizzare i confronti del modello con i test del rapporto di verosimiglianza per un modello completo e ridotto utilizzando nnetla anova()funzione di.
Caracal,

Risposte:


14

Che dire di usare

z <- summary(test)$coefficients/summary(test)$standard.errors
# 2-tailed Wald z tests to test significance of coefficients
p <- (1 - pnorm(abs(z), 0, 1)) * 2
p

Fondamentalmente, questo si baserebbe sui coefficienti stimati relativi al loro errore standard e userebbe il test az per testare una differenza significativa con zero sulla base di un test a due code. Il fattore due corregge il problema sopra menzionato da Peter Dalgaard (ne hai bisogno perché vuoi un test a due code, non uno a coda), e utilizza un test z, piuttosto che un test t, per risolvere l'altro problema di cui parli.

Puoi anche ottenere lo stesso risultato (Wald z-test) usando

library(AER)
coeftest(test)

I test del rapporto di verosimiglianza sono generalmente considerati più accurati rispetto ai test Wald z (questi ultimi usano un'approssimazione normale, i test LR no) e questi possono essere ottenuti usando

library(afex)
set_sum_contrasts() # use sum coding, necessary to make type III LR tests valid
library(car)
Anova(test,type="III")

Se desideri eseguire test posthoc Tukey in coppia, questi possono essere ottenuti usando il lsmeanspacchetto come spiegato nel mio altro post !


Una spiegazione in più dei passaggi potrebbe aiutare l'OP.
Momo,

1
Aggiunta una spiegazione in più ora ...
Tom Wenseleers,

1
Ecco una buona pagina che si espande sull'opzione Wald z-test: stats.idre.ucla.edu/r/dae/multinomial-logistic-regression
DirtStats
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.