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?
Il existe essentiellement trois solutions:
Le plus simple, après avoir vos données dans deux data.frame
s 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)
À 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) )
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.