En R
, hay tres métodos para formatear los datos de entrada para una regresión logística usando la función glm
:
- Los datos pueden estar en un formato "binario" para cada observación (por ejemplo, y = 0 o 1 para cada observación);
- Los datos pueden estar en formato "Wilkinson-Rogers" (por ejemplo,
y = cbind(success, failure)
) con cada fila representando un tratamiento; o - Los datos pueden estar en un formato ponderado para cada observación (por ejemplo, y = 0.3, pesos = 10).
Los tres enfoques producen los mismos coeficientes estimados, pero difieren en los grados de libertad y los valores resultantes de desviación y puntuaciones AIC. Los dos últimos métodos tienen menos observaciones (y por lo tanto grados de libertad) porque utilizan cada tratamiento para el número de observaciones, mientras que el primero utiliza cada observación para el número de observaciones.
Mi pregunta: ¿Existen ventajas numéricas o estadísticas al utilizar un formato de entrada sobre otro? La única ventaja que veo es no tener que reformatear los datos en R
para usarlos con el modelo.
He revisado la documentación de glm, he buscado en la web y en este sitio y encontré un post tangencialmente relacionado, pero no encontré orientación sobre este tema.
Aquí hay un ejemplo simulado que demuestra este comportamiento:
# Escribir una función para ayudar a simular datos
drc4 <- function(x, b =1.0, c = 0, d = 1, e = 0){
(d - c)/ (1 + exp(-b * (log(x) - log(e))))
}
# simular la forma larga del conjunto de datos
nReps = 20
dfLong <- data.frame(dosis = rep(seq(0, 10, by = 2), each = nReps))
dfLong$mortalidad <-rbinom(n = dim(dfLong)[1], size = 1,
prob = drc4(dfLong$dosis, b = 2, e = 5))
# agregar para crear la forma corta del conjunto de datos
dfShort <- aggregate(dfLong$mortalidad, by = list(dfLong$dosis),
FUN = sum)
colnames(dfShort) <- c("dosis", "mortalidad")
dfShort$supervivencia <- nReps - dfShort$mortalidad
dfShort$nReps <- nReps
dfShort$mortalidadP <- dfShort$mortalidad / dfShort$nReps
fitShort <- glm( cbind(mortalidad, supervivencia) ~ dosis,
data = dfShort,
family = "binomial")
summary(fitShort)
fitShortP <- glm( mortalidadP ~ dosis, data = dfShort,
weights = nReps,
family = "binomial")
summary(fitShortP)
fitLong <- glm( mortalidad ~ dosis, data = dfLong,
family = "binomial")
summary(fitLong)