Les valeurs prédites par la régression logistique à partir de glm et stat_smooth dans ggplot2 sont différents
Je suis en train de faire de cette régression logistique graphique dans ggplot2
.
df <- structure(list(y = c(2L, 7L, 776L, 19L, 12L, 26L, 7L, 12L, 8L,
24L, 20L, 16L, 12L, 10L, 23L, 20L, 16L, 12L, 18L, 22L, 23L, 22L,
13L, 7L, 20L, 12L, 13L, 11L, 11L, 14L, 10L, 8L, 10L, 11L, 5L,
5L, 1L, 2L, 1L, 1L, 0L, 0L, 0L), n = c(3L, 7L, 789L, 20L, 14L,
27L, 7L, 13L, 9L, 29L, 22L, 17L, 14L, 11L, 30L, 21L, 19L, 14L,
22L, 29L, 28L, 28L, 19L, 10L, 27L, 22L, 18L, 18L, 14L, 23L, 18L,
12L, 19L, 15L, 13L, 9L, 7L, 3L, 1L, 1L, 1L, 1L, 1L), x = c(18L,
19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L,
32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L,
45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 59L,
62L, 63L, 66L)), .Names = c("y", "n", "x"), class = "data.frame", row.names = c(NA,
-43L))
mod.fit <- glm(formula = y/n ~ x, data = df, weight=n, family = binomial(link = logit),
na.action = na.exclude, control = list(epsilon = 0.0001, maxit = 50, trace = T))
summary(mod.fit)
Pi <- c(0.25, 0.5, 0.75)
LD <- (log(Pi /(1-Pi))-mod.fit$coefficients[1])/mod.fit$coefficients[2]
LD.summary <- data.frame(Pi , LD)
LD.summary
plot(df$x, df$y/df$n, xlab = "x", ylab = "Estimated probability")
lin.pred <- predict(mod.fit)
pi.hat <- exp(lin.pred)/(1 + exp(lin.pred))
lines(df$x, pi.hat, lty = 1, col = "red")
segments(x0 = LD.summary$LD, y0 = -0.1, x1 = LD.summary$LD, y1 = LD.summary$Pi,
lty=2, col=c("darkblue","darkred","darkgreen"))
segments(x0 = 15, y0 = LD.summary$Pi, x1 = LD.summary$LD, y1 = LD.summary$Pi,
lty=2, col=c("darkblue","darkred","darkgreen"))
legend("bottomleft", legend=c("LD25", "LD50", "LD75"), lty=2, col=c("darkblue","darkred","darkgreen"), bty="n", cex=0.75)
Voici ma tentative avec ggplot2
library(ggplot2)
p <- ggplot(data = df, aes(x = x, y = y/n)) +
geom_point() +
stat_smooth(method = "glm", family = "binomial")
p <- p + geom_segment(aes(
x = LD.summary$LD
, y = 0
, xend = LD.summary$LD
, yend = LD.summary$Pi
)
, colour="red"
)
p <- p + geom_segment(aes(
x = 0
, y = LD.summary$Pi
, xend = LD.summary$LD
, yend = LD.summary$Pi
)
, colour="red"
)
print(p)
Questions
- Valeurs prédites pour
glm
etstat_smooth
un look différent. Ce sont ces deux méthodes produit des résultats différents ou il me manque quelque chose ici. - Mon ggplot2 graphique n'est pas exactement comme base de R graphique.
- Comment utiliser des couleurs différentes pour des segments de ligne dans ggplot2?
- Et comment mettre de la légende dans ggplot2?
Merci d'avance pour votre aide et le temps. Grâce
Votre base de R de l'image n'est pas de la légende (les commandes sont beaux quand même) - je vais le mettre à jour pour éviter toute confusion.
Merci pour votre commentaire. Veuillez voir la légende sur la bottomleft.
ouais, c'est parce que j'ai mis à jour l'image à inclure la légende.
oups, merci @mathématique.café
Merci pour votre commentaire. Veuillez voir la légende sur la bottomleft.
ouais, c'est parce que j'ai mis à jour l'image à inclure la légende.
oups, merci @mathématique.café
OriginalL'auteur MYaseen208 | 2012-01-13
Vous devez vous connecter pour publier un commentaire.
Juste un couple d'ajouts mineurs à @mathetmatical.café de la réponse. Généralement,
geom_smooth
n'est pas censé remplacer actuel de la modélisation, c'est pourquoi il peut sembler gênant à la fois lorsque vous souhaitez utiliser la puissance que vous obtenez à partir deglm
et ces. Mais vraiment, tout ce que nous devons faire est d'ajouter les valeurs ajustées à notre bloc de données:La dernière petite astuce est l'utilisation de
Inf
et-Inf
pour obtenir les lignes en pointillés de prolonger le chemin de la parcelle limites.La leçon ici est que si tout ce que vous voulez faire est d'ajouter une lisse d'une parcelle de terrain, et rien d'autre dans la parcelle dépend, à utiliser
geom_smooth
. Si vous voulez faire référence à la sortie du modèle ajusté, il est en général plus facile à adapter le modèle à l'extérieur deggplot
et puis l'intrigue.OriginalL'auteur joran
Modifier votre
LD.summary
pour inclure une nouvelle colonne avecgroup
(ou étiquette appropriée).Ensuite modifier votre
geom_segment
commandes d'avoir uncol=LD.summary$group
(et supprimer lecolour="red"
), les parcelles de chaque segment dans une couleur différente et ajoute une légende:Aussi, pour éviter d'avoir à faire la
LD.summary$xxx
tout le temps, nourrir dansdata=LD.summary
à votregeom_segment
:Pourquoi les graphiques ne sont pas exactement les mêmes, dans la base de R graphique de l'axe x va de ~20 partir, alors que dans
ggplot
il va de zéro à partir. C'est parce que votre deuxièmegeom_segment
commence àx=0
.Pour réparer vous pouviez changer
x=0
àx=min(df$x)
.Pour obtenir votre axe y de l'utilisation sur l'étiquette
+ scale_y_continuous('Estimated probability')
.En résumé:
ce qui donne:
c'est quelque chose à voir avec
stat_smooth
qui n'est pas de générer les numéros de votrepi.hat
formule: essayez de tracer le premierp
et ensuite de fairelines(x,pi.hat,lty=1,col='red')
pour voir ce que je veux dire. Je ne sais pas assez sur les statistiques pour vous aider il y a malheureusement (c'est à dire que votrepi.hat
calcul est erroné ou sistat_smooth
est en train de faire quelque autre calcul, vous l'ignorent). Tout ce que je peux suggérer, c'est de regarder l'aide en ligne pourstat_smooth
et voir si ça donne quelque info sur la façon de calculer le plus lisse. had.co.nz/ggplot2/stat_smooth.htmlMais je suis sûr qu'il serait trivial pour ajuster la réponse existant, dans la forme actuelle, il ne permet pas de répondre à la question. I. e. le graphique n'est pas reproduit, depuis les coins les segments ne sont pas sur la courbe.
Son parce que
stat_smooth
n'est pas passé de la même options que vous passez dans laglm
appel pour mod.ajustement. En particulier, laweight
option n'est pas passé. Essayez d'ajouterweight=n
à laaes
dans leggplot
appel.OriginalL'auteur mathematical.coffee