Ein alternativer Ansatz wäre es, Ihre eigenen vorhergesagten Werte zu generieren und sie mit ggplot zu plotten - dann können Sie mehr Kontrolle über die endgültige Plot haben (eher th ein Verlassen auf stat_smooth
für die Berechnungen; Dies ist besonders nützlich, wenn Sie mehrere Kovariaten verwenden und beim Plotten etwas konstant auf ihre Mittel oder Modi halten müssen.
library(ggplot2)
# Generate data
mydata <- data.frame(Ft = c(1, 6, 11, 16, 21, 2, 7, 12, 17, 22, 3, 8,
13, 18, 23, 4, 9, 14, 19, 5, 10, 15, 20),
Temp = c(66, 72, 70, 75, 75, 70, 73, 78, 70, 76, 69, 70,
67, 81, 58, 68, 57, 53, 76, 67, 63, 67, 79),
TD = c(0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0))
# Run logistic regression model
model <- glm(TD ~ Temp, data=mydata, family=binomial(link="logit"))
# Create a temporary data frame of hypothetical values
temp.data <- data.frame(Temp = seq(53, 81, 0.5))
# Predict the fitted values given the model and hypothetical data
predicted.data <- as.data.frame(predict(model, newdata = temp.data,
type="link", se=TRUE))
# Combine the hypothetical data and predicted values
new.data <- cbind(temp.data, predicted.data)
# Calculate confidence intervals
std <- qnorm(0.95/2 + 0.5)
new.data$ymin <- model$family$linkinv(new.data$fit - std * new.data$se)
new.data$ymax <- model$family$linkinv(new.data$fit + std * new.data$se)
new.data$fit <- model$family$linkinv(new.data$fit) # Rescale to 0-1
# Plot everything
p <- ggplot(mydata, aes(x=Temp, y=TD))
p + geom_point() +
geom_ribbon(data=new.data, aes(y=fit, ymin=ymin, ymax=ymax), alpha=0.5) +
geom_line(data=new.data, aes(y=fit)) +
labs(x="Temperature", y="Thermal Distress")
Bonus, nur so zum Spaß: Wenn Sie Ihre eigene Vorhersage-Funktion verwenden, können Sie mit Kovariaten verrückt, wie das zeigt, wie das Modell auf verschiedenen Ebenen der Ft
passt:
# Alternative, if you want to go crazy
# Run logistic regression model with two covariates
model <- glm(TD ~ Temp + Ft, data=mydata, family=binomial(link="logit"))
# Create a temporary data frame of hypothetical values
temp.data <- data.frame(Temp = rep(seq(53, 81, 0.5), 2),
Ft = c(rep(3, 57), rep(18, 57)))
# Predict the fitted values given the model and hypothetical data
predicted.data <- as.data.frame(predict(model, newdata = temp.data,
type="link", se=TRUE))
# Combine the hypothetical data and predicted values
new.data <- cbind(temp.data, predicted.data)
# Calculate confidence intervals
std <- qnorm(0.95/2 + 0.5)
new.data$ymin <- model$family$linkinv(new.data$fit - std * new.data$se)
new.data$ymax <- model$family$linkinv(new.data$fit + std * new.data$se)
new.data$fit <- model$family$linkinv(new.data$fit) # Rescale to 0-1
# Plot everything
p <- ggplot(mydata, aes(x=Temp, y=TD))
p + geom_point() +
geom_ribbon(data=new.data, aes(y=fit, ymin=ymin, ymax=ymax,
fill=as.factor(Ft)), alpha=0.5) +
geom_line(data=new.data, aes(y=fit, colour=as.factor(Ft))) +
labs(x="Temperature", y="Thermal Distress")
Dies ist sehr elegant, aber indem Sie Ihre eigenen (Normal-basierten) Konfidenzintervalle erstellen, anstatt "Glm" zu verwenden, erhalten Sie Konfidenzintervalle, die den (0,1) -Bereich überschreiten, was wahrscheinlich * nicht * ist, was das OP wünscht. .. –
Guter Punkt. Ich überarbeitete die Antwort nach Hadleys Ansatz in ggplot, indem ich die Link-Funktion voraussagte und sie dann in die Antwortskala umwandelte. Alles ist gut jetzt. – Andrew
Auch konnte die gesamte Datenrahmenerstellung erheblich mit 'dplyr' rationalisiert werden, aber ich blieb bei der Basis R für diese Antwort. – Andrew