Dans R
, il existe trois méthodes pour formater les données d'entrée pour une régression logistique à l'aide de la glm
fonction:
- Les données peuvent être dans un format "binaire" pour chaque observation (par exemple, y = 0 ou 1 pour chaque observation);
- Les données peuvent être au format «Wilkinson-Rogers» (p. Ex.
y = cbind(success, failure)
) , Chaque ligne représentant un traitement; ou - Les données peuvent être dans un format pondéré pour chaque observation (par exemple, y = 0,3, poids = 10).
Les trois approches produisent les mêmes estimations de coefficient, mais diffèrent dans les degrés de liberté et les valeurs de déviance et les scores AIC résultants. Les deux dernières méthodes ont moins d'observations (et donc de degrés de liberté) car elles utilisent chaque traitement pour le nombre d'observations alors que la première utilise chaque observation pour le nombre d'observations.
Ma question: Y a-t-il des avantages numériques ou statistiques à utiliser un format d'entrée par rapport à un autre? Le seul avantage que je vois est de ne pas avoir à reformater ses données R
pour les utiliser avec le modèle.
J'ai regardé la documentation glm , recherché sur le web et ce site et trouvé un poste lié de manière tangentielle , mais pas de conseils sur ce sujet.
Voici un exemple simulé qui illustre ce comportement:
# 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)
la source
svyglm
partir du package d'enquête vous donne de meilleures méthodes de traitement de l'argument de poids.Réponses:
Il n'y a aucune raison statistique de préférer l'un à l'autre, à part la clarté conceptuelle. Bien que les valeurs de déviance signalées soient différentes, ces différences sont entièrement dues au modèle saturé. Ainsi, toute comparaison utilisant la déviance relative entre les modèles n'est pas affectée, car le log-vraisemblance saturée est annulée.
Je pense qu'il est utile de parcourir le calcul de la déviance explicite.
Forme longue
Forme courte (pondérée)
Notez qu'une distribution binomiale ne peut pas réellement prendre des valeurs non entières, mais nous pouvons néanmoins calculer une «vraisemblance logarithmique» en utilisant la fraction des succès observés dans chaque cellule comme réponse, et pondérer chaque somme dans le calcul de log-vraisemblance par le nombre d'observations dans cette cellule.
C'est exactement égal à la déviance du modèle que nous avons calculée ci-dessus, que vous pouvez voir en tirant autant que possible la somme sur dans l'équation longue.j
Pendant ce temps, la déviance saturée est différente. Puisque nous n'avons plus de réponses 0-1, même avec un paramètre par observation, nous ne pouvons pas obtenir exactement 0. Au lieu de cela, la log-vraisemblance saturée du modèle est
Dans votre exemple, vous pouvez vérifier que le double de ce montant correspond à la différence entre les valeurs de déviance nulle et résiduelle signalées pour les deux modèles.
la source