Regresión logística: variables agrupadas y desagrupadas (usando R)

9

Estoy leyendo A. Agresti (2007), Introducción al análisis de datos categóricos , 2do. edición, y no estoy seguro si entiendo este párrafo (p.106, 4.2.1) correctamente (aunque debería ser fácil):

En la Tabla 3.1 sobre ronquidos y enfermedades cardíacas en el capítulo anterior, 254 sujetos informaron ronquidos todas las noches, de los cuales 30 tenían enfermedades cardíacas. Si el archivo de datos ha agrupado datos binarios, una línea en el archivo de datos informa estos datos como 30 casos de enfermedad cardíaca de un tamaño de muestra de 254. Si el archivo de datos tiene datos binarios desagrupados, cada línea en el archivo de datos se refiere a un tema separado, por lo que 30 líneas contienen un 1 para enfermedades del corazón y 224 líneas contienen un 0 para enfermedades del corazón. Las estimaciones de ML y los valores de SE son los mismos para cualquier tipo de archivo de datos.

¿Transformar un conjunto de datos no agrupados (1 dependiente, 1 independiente) requeriría más que "una línea" para incluir toda la información?

En el siguiente ejemplo, se crea un conjunto de datos simple (¡poco realista!) Y se construye un modelo de regresión logística.

¿Cómo se verían realmente los datos agrupados (pestaña variable)? ¿Cómo se puede construir el mismo modelo utilizando datos agrupados?

> 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())
Témpano de hielo
fuente

Respuestas:

11

La tabla 3.1 se reproduce a continuación:

ingrese la descripción de la imagen aquí

Agresti consideró los siguientes puntajes numéricos para el nivel de ronquido: {0,2,4,5}.

Hay dos formas de ajustar un GLM con R: su resultado se proporciona como un vector de 0/1 o como un factor con dos niveles, con los predictores en la HR de su fórmula; o puede dar una matriz con dos columnas de conteos para el éxito / fracaso como los lhs de la fórmula. Este último corresponde a lo que Agresti llama datos "agrupados". Un tercer método, que también se aplica a las configuraciones agrupadas, sería utilizar el weights=argumento para indicar cuántos resultados positivos y negativos se observaron para cada categoría de la tabla de clasificación.

Los datos en la vista de matriz leerían:

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

A partir de esto, podemos generar un data.frameformato largo (2484 filas = sum(snoring)observaciones) de la siguiente manera:

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]

Y los siguientes dos modelos producirán resultados idénticos:

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 segunda notación se usa con frecuencia en la tabla agregada con una instrucción como cbind(a, b), donde ay bson columnas de conteos para un evento binario (ver, por ejemplo, Modelos lineales generalizados ). Parece que también funcionaría cuando se usa la tabla en lugar de la matriz (como en su ejemplo), por ejemplo

glm(as.table(snoring) ~ c(0, 2, 4, 5), family=binomial)
chl
fuente
¡Muchas gracias! Una respuesta perfecta! Tengo una adición simple: en lugar de as.table (ronquidos), sugeriría la tabla (x, y, dnn = c ('ronquidos', 'enfermedad')) como un equivalente de mi ejemplo, porque la transformación de desagrupado a agrupado los datos también fueron de interés.
FloE
1
@FloE Tienes razón. Aún necesitará construir su rhs ad hoc . Por ejemplo, algo así tab <- table(x,y, dnn=c('snoring','disease')); glm(tab ~ as.numeric(rownames(tab)), family=binomial)funcionaría (inversión de signo menos para los coeficientes porque "Sí" está codificado 0 en lugar de 1).
chl