web-dev-qa-db-fra.com

ggplot2: Régression logistique - probabilités de tracé et ligne de régression

J'ai un data.frame contenant un prédicteur continu et une variable de réponse dichotomique.

> head(df)
  position response
1        0        1
2        3        1
3       -4        0
4       -1        0
5       -2        1
6        0        0

Je peux facilement calculer une régression logistique au moyen de la fonction glm()-, aucun problème jusqu'à présent.

Ensuite, je veux créer un tracé avec ggplot, qui contient à la fois les probabilités empiriques pour chacune des 11 valeurs prédictives globales, et la ligne de régression ajustée .

J'ai continué et calculé les probabilités avec cast() et les ai enregistrées dans un autre data.frame

> probs
   position   prob
1        -5 0.0500
2        -4 0.0000
3        -3 0.0000
4        -2 0.2000
5        -1 0.1500
6         0 0.3684
7         1 0.4500
8         2 0.6500
9         3 0.7500
10        4 0.8500
11        5 1.0000

J'ai tracé les probabilités:

p <- ggplot(probs, aes(x=position, y=prob)) + geom_point()

Mais quand j'essaie d'ajouter la ligne de régression ajustée

p <- p + stat_smooth(method="glm", family="binomial", se=F)

il renvoie un avertissement: non-integer #successes in a binomial glm!. Je sais que pour tracer stat_smooth "Correctement", je devrais l'appeler sur les données originales de df avec la variable dichotomique. Cependant, si j'utilise les données df dans ggplot(), je ne vois aucun moyen de tracer les probabilités.

Comment puis-je combiner les probabilités et la ligne de régression dans un graphique, de la façon dont il est censé être dans ggplot2, c'est-à-dire sans recevoir d'avertissement ou de message d'erreur?

16
vincentqu

Il existe essentiellement trois solutions:

Fusion des data.frames

Le plus simple, après avoir vos données dans deux data.frames serait de les fusionner par position:

mydf <- merge( mydf, probs, by="position")

Ensuite, vous pouvez appeler ggplot sur ce data.frame sans avertissements:

ggplot( mydf, aes(x=position, y=prob)) +
  geom_point() +
  geom_smooth(method = "glm", 
    method.args = list(family = "binomial"), 
    se = FALSE) 

enter image description here

Éviter la création de deux data.frames

À l'avenir, vous pourriez éviter directement la création de deux cadres de données distincts que vous devrez fusionner plus tard. Personnellement, j'aime utiliser le package plyr pour cela:

librayr(plyr)
mydf <- ddply( mydf, "position", mutate, prob = mean(response)  )

Modifier: utilisez des données différentes pour chaque couche

J'ai oublié de mentionner que vous pouvez utiliser pour chaque couche un autre data.frame qui est un fort avantage de ggplot2:

ggplot( probs, aes(x=position, y=prob)) +
  geom_point() +
  geom_smooth(data = mydf, aes(x = position, y = response),
    method = "glm", method.args = list(family = "binomial"), 
    se = FALSE)

Comme conseil supplémentaire: évitez d'utiliser le nom de variable df car vous remplacez la fonction intégrée stats::df en attribuant à ce nom de variable.

17
Beasterfield