Расширение линий регрессии с помощью geom_line() ggplot2

Я использовал отрицательный блиномиальный глм, чтобы посмотреть на численность позвоночных в водорослях. Поскольку у меня был термин взаимодействия, я предсказал некоторые значения для численности рыбы. Я хотел бы, чтобы эти предсказанные линии регрессии достигли конца пространства графика. Прямо сейчас они все отключаются в разное время, как в примере ниже:

total<-c(1,0,5,7,9,10,23,45,78,100)
shoots_collected<-c(1,2,3,4,5,6,7,45,67,88)
epi_bio<-c(0.0,11,0.89,1.5,9,5,.04,6,7,.9)
Year<-c(1,1,1,1,2,2,2,2,1,1)
Year<-as.factor(Year)
intertidal<-data.frame(shoots_collected,Year,epi_bio, total)

glm.neg<-glm.nb(total~Year+shoots_collected+epi_bio+shoots_collected*epi_bio, 
data=intertidal)
summary(glm.neg)
abun_shoots2015<-data.frame("shoots_collected"=rep(0:30, rep(5,31)), 
"epi_bio"=rep(c(0,1,2,3,4), 31), "Year"=rep("1", 155))

# then extracted predicted values using:

p2015<-predict(glm.neg, newdata=abun_shoots2015, se.fit=TRUE, type='response')
abun_shoots2015$fit<-p2015$fit
ggplot(intertidal, aes(x=shoots_collected, y=total)) +
scale_x_continuous(limits = c(0, 30))+
scale_y_continuous(limits=c(0,10))+
 geom_point(pch=1)+
 geom_line(data=abun_shoots2015[which(abun_shoots2015$epi_bio==0.0000),], aes(x=shoots_collected, y=fit), col="red")+
 geom_line(data=abun_shoots2015[which(abun_shoots2015$epi_bio==1),], aes(x=shoots_collected, y=fit), col="green")+
 geom_line(data=abun_shoots2015[which(abun_shoots2015$epi_bio==2),], aes(x=shoots_collected, y=fit), col="blue")+
 geom_line(data=abun_shoots2015[which(abun_shoots2015$epi_bio==3),], aes(x=shoots_collected, y=fit), col="yellow")+
 geom_line(data=abun_shoots2015[which(abun_shoots2015$epi_bio==4),], aes(x=shoots_collected, y=fit), col="pink")

Я ранее использовал lines() команда, но перешел на geom_lines() чтобы я мог использовать fullrange=TRUE но это все равно не сработало. Я вижу, что у меня есть некоторые пропущенные значения, когда я пытаюсь построить линии, и я подозреваю, что именно поэтому некоторые из них обрезаются, но я не знаю, куда идти дальше.

1 ответ

Решение

Вы не хотите использовать scale_y_continuous и т. д. здесь, поскольку они имеют эффект полной обрезки данных, выходящих за установленные пределы. Вместо этого вы хотите ограничить диапазон графика, чтобы показать только часть данных. Это сделано с coord_cartesian(), как в:

ggplot(intertidal, aes(x=shoots_collected, y=total)) +
 coord_cartesian(xlim = c(0, 30), ylim = c(0,10)) + ## KEY!
 geom_point(pch=1)+
 geom_line(data=abun_shoots2015[which(abun_shoots2015$epi_bio==0.0000),], 
           aes(x=shoots_collected, y=fit), col="red")+
 geom_line(data=abun_shoots2015[which(abun_shoots2015$epi_bio==1),], 
           aes(x=shoots_collected, y=fit), col="green")+
 geom_line(data=abun_shoots2015[which(abun_shoots2015$epi_bio==2),], 
           aes(x=shoots_collected, y=fit), col="blue")+
 geom_line(data=abun_shoots2015[which(abun_shoots2015$epi_bio==3),], 
           aes(x=shoots_collected, y=fit), col="yellow")+
 geom_line(data=abun_shoots2015[which(abun_shoots2015$epi_bio==4),], 
           aes(x=shoots_collected, y=fit), col="pink")

Кроме того, я чувствую себя обязанным добавить, что ваш сюжет может быть лучше подготовлен epi_bio как фактор:

ggplot(intertidal, aes(x=shoots_collected, y=total)) +
  coord_cartesian(xlim = c(0, 30), ylim = c(0,10)) + ## KEY!
  geom_point(pch=1) +
  geom_line(data = abun_shoots2015, aes(y = fit, colour = as.factor(epi_bio))) +
  scale_colour_discrete(name = "epi_bio") +
  theme(legend.position = "top")

Другие вопросы по тегам