Format d'entrée pour la réponse dans le glm binomial dans R


13

Dans R, il existe trois méthodes pour formater les données d'entrée pour une régression logistique à l'aide de la glmfonction:

  1. Les données peuvent être dans un format "binaire" pour chaque observation (par exemple, y = 0 ou 1 pour chaque observation);
  2. Les données peuvent être au format «Wilkinson-Rogers» (p. Ex. y = cbind(success, failure)) , Chaque ligne représentant un traitement; ou
  3. 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 Rpour 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)

1
Dans votre exemple, la différence entre la déviance nulle et résiduelle est égale pour les trois modèles. Si vous ajoutez ou supprimez un paramètre, le changement dans AIC est également le même pour les trois.
Jonny Lomond

1
Vous vous êtes répondu: si vous utilisez les mêmes données, pour les mêmes résultats, comment pourraient-elles être différentes? De plus, si la méthode donnait des résultats différents uniquement en raison de la fourniture des données dans un format différent, quelque chose serait profondément erroné avec elle, ou avec sa mise en œuvre.
Tim

Le format WR est finalement une probabilité pondérée. Le problème avec les poids est que R ne peut pas dire s'il s'agit de poids de fréquence, de poids de probabilité ou autres. Avec la pondération de l'enquête, par exemple, vous ne pouvez avoir que n observations mais elles représentent des segments de la population / base d'échantillonnage. Ainsi, les degrés de liberté sont en effet de 100. à svyglmpartir du package d'enquête vous donne de meilleures méthodes de traitement de l'argument de poids.
AdamO

Mais si vous adaptiez un modèle quasibinomial utilisant les trois méthodes de codage, cela produirait des résultats différents, à droite, car on pourrait avoir une surdispersion positive lors du codage en tant que données binomiales mais pas lorsqu'il est codé en tant que données logistiques / binaires. Ou ai-je tort sur ce point?
Tom Wenseleers

Réponses:


9

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.

iniipiiyijji

Forme longue

ij(log(pi)yij+log(1pi)(1yij))

ij(log(yij)yij+log(1yij)(1yij)).
yijlog(0)0log(0)limx0+xlog(x)

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.

ini(log(pi)jyij/ni+log(1pi)(1j(yij/ni))

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

ini(log(jyij/ni)jyij/ni+log(1jyij/ni)(1jyij/ni)).

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.

ni = dfShort$nReps
yavg = dfShort$mortalityP
sum.terms <-ni*(log(yavg)*yavg + log(1 - yavg)*(1 - yavg))
# Need to handle NaN when yavg is exactly 0
sum.terms[1] <- log(1 - yavg[1])*(1 - yavg[1])

2*sum(sum.terms)
fitShortP$deviance - fitLong$deviance

Je pense que vous devrez clarifier l'expression de la déviance des modèles saturés. Le journal de 0 ne fonctionne pas si bien.
AdamO

Merci, j'aurais dû clarifier ce que je voulais dire. J'ai ajouté une modification pour préciser que par 0log (0) je veux dire 0 dans ce contexte.
Jonny Lomond

OK mais je suis bien confus (pardonnez-moi, je n'ai jamais couvert la déviance en détail): si vous avez log (y) y - log (1-y) (1-y) comme déviance du modèle saturé, ce n'est pas tous observation juste 0?
AdamO

2
Le "modèle saturé" est un modèle imaginé avec un paramètre par observation. Ainsi, sa probabilité prédite pour chaque observation est de 1 ou 0, selon la valeur réelle observée. Donc, dans ce cas, la probabilité logarithmique du modèle saturé est en effet de 0, les données sont les seules données qui pourraient être générées par le modèle saturé.
Jonny Lomond

Mais si vous adaptiez un modèle quasibinomial utilisant les trois méthodes de codage, cela produirait des résultats différents, à droite, car on pourrait avoir une surdispersion positive lors du codage en tant que données binomiales mais pas lorsqu'il est codé en tant que données logistiques / binaires. Ou ai-je tort sur ce point?
Tom Wenseleers
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.