Primero muestro cómo se puede especificar una fórmula utilizando datos agregados con proporciones y pesos. Luego muestro cómo podrías especificar una fórmula después de desagregar tus datos en observaciones individuales.
La documentación en glm
indica que:
"Para un GLM binomial se utilizan pesos previos para dar el número de intentos cuando la respuesta es la proporción de éxitos"
Creo nuevas columnas total
y proportion_disease
en df
para 'número de intentos' y 'proporción de éxitos' respectivamente.
library(dplyr)
df <- tibble(treatment_status = c("tratamiento", "sin_tratamiento"),
enfermedad = c(55, 42),
no_enfermedad = c(67,34)) %>%
mutate(total = no_enfermedad + enfermedad,
proportion_disease = enfermedad / total)
modelo_pesado <- glm(proportion_disease ~ treatment_status,
data = df, family = binomial("logit"), weights = total)
El enfoque ponderado anterior toma datos agregados y dará la misma solución que el método cbind
pero te permite especificar una fórmula. (A continuación es equivalente al método del Póster Original pero cbind(c(55,42), c(67,34))
en lugar de cbind(c(55,67),c(42,34))
para que 'Enfermedad' en lugar de 'Tratamiento' sea la variable de respuesta.)
modelo_cbinded <- glm(cbind(enfermedad, no_enfermedad) ~
treatment_status, data = df, family = binomial("logit"))
También podrías simplemente desagregar tus datos en observaciones individuales y pasar estos a glm
(permitiéndote especificar una fórmula también).
df_expanded <- tibble(estado_enfermedad = c(1, 1, 0, 0),
treatment_status = rep(c("tratamiento", "control"), 2))
%>%
.[c(rep(1, 55), rep(2, 42), rep(3, 67),
rep(4, 34)), ]
modelo_expandido <- glm(estado_enfermedad ~ treatment_status,
data = df_expanded, family = binomial("logit"))
Comparemos ahora estos pasando cada modelo a summary
. modelo_pesado y modelo_cbinded ambos producen los mismos resultados exactos. modelo_expandido produce los mismos coeficientes y errores estándar, aunque muestra diferentes grados de libertad, deviance, AIC, etc. (correspondiendo con el número de filas/observaciones).
> lapply(list(modelo_pesado, modelo_cbinded, modelo_expandido),
summary)
[[1]]
Llamada:
glm(formula = proportion_disease ~ treatment_status,
family = binomial("logit"),
data = df, weights = total)
Residuos de deviance:
[1] 0 0
Coeficientes:
Estimado Error Estándar valor z de Pr(>|z|)
(Intercept) 0.2113 0.2307 0.916 0.360
treatment_statustratamiento -0.4087 0.2938 -1.391 0.164
(Parámetro de dispersión para la familia binomial tomado como 1)
Deviance nula: 1.9451e+00 en 1 grados de libertad
Deviance residual: 1.0658e-14 en 0 grados de libertad
AIC: 14.028
Número de iteraciones de Fisher Scoring: 2
[[2]]
Llamada:
glm(formula = cbind(enfermedad, no_enfermedad) ~ treatment_status,
family = binomial("logit"), data = df)
Residuos de deviance:
[1] 0 0
Coeficientes:
Estimado Error Estándar valor z de Pr(>|z|)
(Intercept) 0.2113 0.2307 0.916 0.360
treatment_statustratamiento -0.4087 0.2938 -1.391 0.164
(Parámetro de dispersión para la familia binomial tomado como 1)
Deviance nula: 1.9451e+00 en 1 grados de libertad
Deviance residual: 1.0658e-14 en 0 grados de libertad
AIC: 14.028
Número de iteraciones de Fisher Scoring: 2
[[3]]
Llamada:
glm(formula = estado_enfermedad ~ treatment_status,
family = binomial("logit"),
data = df_expanded)
Residuos de deviance:
Min 1Q Mediana 3Q Máx
-1.268 -1.095 -1.095 1.262 1.262
Coeficientes:
Estimado Error Estándar valor z de Pr(>|z|)
(Intercept) 0.2113 0.2307 0.916 0.360
treatment_statustratamiento -0.4087 0.2938 -1.391 0.164
(Parámetro de dispersión para la familia binomial tomado como 1)
Deviance nula: 274.41 en 197 grados de libertad
Deviance residual: 272.46 en 196 grados de libertad
AIC: 276.46
Número de iteraciones de Fisher Scoring: 3
(Ver R bloggers para conversación sobre el parámetro weights
en glm
en contexto de regresión.)