Regressione logistica: variabili raggruppate e non raggruppate (usando R)


9

Sto leggendo A. Agresti (2007), An Introduction to Categorical Data Analysis , 2 °. edizione e non sono sicuro di aver compreso correttamente questo paragrafo (p.106, 4.2.1) (anche se dovrebbe essere facile):

Nella Tabella 3.1 sul russare e le malattie cardiache nel capitolo precedente, 254 soggetti hanno riferito di russare ogni notte, di cui 30 avevano malattie cardiache. Se il file di dati ha raggruppato dati binari, una riga nel file di dati riporta questi dati come 30 casi di malattie cardiache su una dimensione del campione di 254. Se il file di dati ha dati binari non raggruppati, ogni riga nel file di dati fa riferimento a un soggetto separato, quindi 30 righe contengono 1 per le malattie cardiache e 224 righe contengono 0 per le malattie cardiache. Le stime ML e i valori SE sono gli stessi per entrambi i tipi di file di dati.

Trasformare un insieme di dati non raggruppati (1 dipendente, 1 indipendente) richiederebbe più di una "linea" per includere tutte le informazioni !?

Nell'esempio seguente viene creato un set di dati semplice (non realistico!) E viene creato un modello di regressione logistica.

Come sarebbero effettivamente i dati raggruppati (scheda variabile?)? Come è possibile creare lo stesso modello utilizzando i dati raggruppati?

> dat = data.frame(y=c(0,1,0,1,0), x=c(1,1,0,0,0))
> dat
  y x
1 0 1
2 1 1
3 0 0
4 1 0
5 0 0
> tab=table(dat)
> tab
   x
y   0 1
  0 2 1
  1 1 1
> mod1=glm(y~x, data=dat, family=binomial())

Risposte:


11

La tabella 3.1 è riprodotta di seguito:

inserisci qui la descrizione dell'immagine

Agresti ha considerato i seguenti punteggi numerici per il livello del russare: {0,2,4,5}.

Esistono due modi per adattare un GLM con R: o il tuo risultato è fornito come un vettore di 0/1 o un fattore con due livelli, con i predittori sul rhs della tua formula; oppure puoi dare una matrice con due colonne di conteggi per successo / fallimento come lhs della formula. Quest'ultimo corrisponde a ciò che Agresti chiama dati "raggruppati". Un terzo metodo, che si applica anche alle impostazioni raggruppate, sarebbe quello di utilizzare l' weights=argomento per indicare quanti risultati positivi e negativi sono stati osservati per ciascuna categoria della tabella di classificazione.

I dati nella vista matrice avrebbero letto:

snoring <- matrix(c(24,35,21,30,1355,603,192,224), nc=2)

Da questo, possiamo generare un data.frameformato lungo (2484 righe = sum(snoring)osservazioni) come segue:

snoring.df <- data.frame(snoring=gl(4, 1, labels=c("Never", "Occasional",
                                                   "Nearly every night", 
                                                   "Every night")),
                         disease=gl(2, 4, labels=c("Yes", "No")),
                         counts=as.vector(snoring))
snoring.df <- snoring.df[rep(seq_len(nrow(snoring.df)), snoring.df$counts), 1:2]

E i seguenti due modelli produrranno risultati identici:

levels(snoring.df$snoring) <- c(0, 2, 4, 5)
y <- abs(as.numeric(snoring.df$disease)-2)
x <- as.numeric(as.character(snoring.df$snoring))
fit.glm1 <- glm(y ~ x, family=binomial)

fit.glm2 <- glm(snoring ~ c(0, 2, 4, 5), family=binomial)

logit[π^(X)]=-3.87+0.40X

La seconda notazione viene spesso utilizzata su una tabella aggregata con un'istruzione simile cbind(a, b), dove ae bsono colonne di conteggi per un evento binario (vedere ad esempio, Modelli lineari generalizzati ). Sembra che funzionerebbe anche quando si utilizza table anziché matrix (come nell'esempio), ad es

glm(as.table(snoring) ~ c(0, 2, 4, 5), family=binomial)

Grazie mille! Una risposta perfetta! Ho una semplice aggiunta: Invece di as.table (russare), suggerirei table (x, y, dnn = c ('russare', 'malattia')) come equivalente del mio esempio, perché la trasformazione di ungrouped in grouped anche i dati erano di interesse.
FloE

1
@FloE Hai ragione. Dovrai comunque costruire il tuo rhs ad hoc . Ad esempio, qualcosa del genere tab <- table(x,y, dnn=c('snoring','disease')); glm(tab ~ as.numeric(rownames(tab)), family=binomial)funzionerebbe (inversione del segno meno per i coefficienti perché "Sì" è codificato 0 anziché 1).
chl
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.