Formato di input per la risposta in glm binomiale in R


13

In R, ci sono tre metodi per formattare i dati di ingresso per una regressione logistica utilizzando la glmfunzione di:

  1. I dati possono essere in formato "binario" per ogni osservazione (ad es. Y = 0 o 1 per ogni osservazione);
  2. I dati possono essere nel formato "Wilkinson-Rogers" (ad es. y = cbind(success, failure)) Con ogni riga che rappresenta un trattamento; o
  3. I dati possono essere in un formato ponderato per ciascuna osservazione (ad es. Y = 0,3, pesi = 10).

Tutti e tre gli approcci producono le stesse stime dei coefficienti, ma differiscono nei gradi di libertà e nei valori di devianza e punteggi AIC risultanti. Gli ultimi due metodi hanno meno osservazioni (e quindi gradi di libertà) perché usano ogni trattamento per il numero di osservazioni mentre il primo usa ogni osservazione per il numero di osservazioni.

La mia domanda: ci sono vantaggi numerici o statistici nell'uso di un formato di input rispetto a un altro? L'unico vantaggio che vedo è di non dover riformattare i propri dati Rper utilizzarli con il modello.

Ho esaminato la documentazione glm , ho cercato sul web e su questo sito e ho trovato un post tangenzialmente correlato , ma nessuna guida su questo argomento.

Ecco un esempio simulato che dimostra questo comportamento:

# Write function to help simulate data
drc4 <- function(x, b =1.0, c = 0, d = 1, e = 0){
    (d - c)/ (1 + exp(-b * (log(x)  - log(e))))
}
# simulate long form of dataset
nReps = 20
dfLong <- data.frame(dose = rep(seq(0, 10, by = 2), each = nReps))
dfLong$mortality <-rbinom(n = dim(dfLong)[1], size = 1,
                              prob = drc4(dfLong$dose, b = 2, e = 5))

# aggregate to create short form of dataset
dfShort <- aggregate(dfLong$mortality, by = list(dfLong$dose), 
                     FUN = sum)
colnames(dfShort) <- c("dose", "mortality")
dfShort$survival <- nReps - dfShort$mortality 
dfShort$nReps <- nReps
dfShort$mortalityP <- dfShort$mortality / dfShort$nReps

fitShort <- glm( cbind(mortality, survival) ~ dose, 
                 data = dfShort, 
                 family = "binomial")
summary(fitShort)

fitShortP <- glm( mortalityP ~ dose, data = dfShort, 
                  weights = nReps,     
                  family = "binomial")
summary(fitShortP)

fitLong <- glm( mortality ~ dose, data = dfLong, 
                family = "binomial")
summary(fitLong)

1
Nel tuo esempio, la differenza tra la deviazione nulla e quella residua è uguale per tutti e tre i modelli. Se aggiungi o rimuovi un parametro, anche la modifica in AIC è la stessa per tutti e tre.
Jonny Lomond,

1
Hai risposto tu stesso: se usando gli stessi dati, agli stessi risultati, come potrebbero essere diversi? Inoltre, se il metodo darebbe risultati diversi solo a causa della fornitura dei dati in un formato diverso, qualcosa sarebbe profondamente sbagliato con esso o con la sua implementazione.
Tim

Il formato WR è in definitiva una probabilità ponderata. Il problema con i pesi è che R non può dire se sono pesi di frequenza, pesi di probabilità o altro. Con la ponderazione del sondaggio, ad esempio, si possono avere solo n osservazioni ma rappresentano segmenti della popolazione / cornice di campionamento. Quindi il grado di libertà è davvero 100. svyglmdal pacchetto del sondaggio ti offre metodi migliori per gestire l'argomento peso.
AdamO,

Ma se si adattasse a un modello quasibinomiale usando tutti e tre i modi di codifica, si otterrebbero risultati diversi, giusto, dal momento che si potrebbe avere una sovradispersione positiva se codificati come dati binomiali ma non quando codificati come dati logistici / binari. O mi sbaglio su questo?
Tom Wenseleers,

Risposte:


9

Non c'è motivo statistico di preferire l'uno all'altro, oltre alla chiarezza concettuale. Sebbene i valori di devianza riportati siano diversi, queste differenze sono completamente dovute al modello saturo. Pertanto, qualsiasi confronto che utilizza la devianza relativa tra i modelli non è interessato, poiché la probabilità di log dei modelli saturi viene annullata.

Penso che sia utile passare attraverso il calcolo esplicito della devianza.

La deviazione di un modello è 2 * (LL (modello saturo) - LL (modello)). Supponiamo di avere cellule diverse, dove è il numero di osservazioni in cella , è il modello di previsione per tutte le osservazioni nella cella , e è il valore osservato (0 o 1) per il di osservazione -esimo nella cella .iniipiiyijji

Forma lunga

La probabilità logaritmica del modello (proposto o nullo) è

ij(log(pi)yij+log(1pi)(1yij))

e la probabilità di log del modello saturo èQuesto è uguale a 0, perché è 0 o 1. Nota non è definito, ma per comodità leggi come scorciatoia per , che è 0.

ij(log(yij)yij+log(1yij)(1yij)).
yijlog(0)0log(0)limx0+xlog(x)

Forma corta (ponderata)

Si noti che una distribuzione binomiale non può effettivamente prendere valori non interi, ma possiamo comunque calcolare una "verosimiglianza logaritmica" usando come risposta la frazione dei successi osservati in ciascuna cella e ponderando ogni somma nel calcolo verosimiglianza logico con il numero di osservazioni in quella cella.

ini(log(pi)jyij/ni+log(1pi)(1j(yij/ni))

Questo è esattamente uguale alla devianza del modello che abbiamo calcolato sopra, che puoi vedere estraendo il più possibile la somma su nell'equazione della forma lunga.j

Nel frattempo la deviazione satura è diversa. Poiché non abbiamo più risposte 0-1, anche con un parametro per osservazione non possiamo ottenere esattamente 0. Invece la probabilità di log del modello saturo è

ini(log(jyij/ni)jyij/ni+log(1jyij/ni)(1jyij/ni)).

Nel tuo esempio, puoi verificare che il doppio di questo importo sia la differenza tra i valori di deviazione nullo e residuo riportati per entrambi i modelli.

ni = dfShort$nReps
yavg = dfShort$mortalityP
sum.terms <-ni*(log(yavg)*yavg + log(1 - yavg)*(1 - yavg))
# Need to handle NaN when yavg is exactly 0
sum.terms[1] <- log(1 - yavg[1])*(1 - yavg[1])

2*sum(sum.terms)
fitShortP$deviance - fitLong$deviance

Penso che dovrai chiarire l'espressione per devianza dei modelli saturi. Il registro di 0 non funziona così bene.
AdamO,

Grazie, avrei dovuto chiarire cosa intendevo dire. Ho aggiunto una modifica per chiarire che per 0log (0) intendo 0 in questo contesto.
Jonny Lomond,

OK ma sono adeguatamente confuso (perdonami, non ho mai coperto la devianza in nessun dettaglio): se hai log (y) y - log (1-y) (1-y) come devianza del modello saturo, non tutti osservazione solo 0?
AdamO,

2
Il "modello saturo" è un modello immaginato con un parametro per osservazione. Quindi la sua probabilità prevista per ogni osservazione è 1 o 0, a seconda del valore effettivamente osservato. Quindi in questo caso la probabilità di log del modello saturo è effettivamente 0, i dati sono gli unici dati che potrebbero essere generati dal modello saturo.
Jonny Lomond,

Ma se si adattasse a un modello quasibinomiale usando tutti e tre i modi di codifica, si otterrebbero risultati diversi, giusto, dal momento che si potrebbe avere una sovradispersione positiva se codificati come dati binomiali ma non quando codificati come dati logistici / binari. O mi sbaglio su questo?
Tom Wenseleers,
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.