问题描述
我有一个使用 mgcv
包编码的非线性生存模型。我可以生成一个常规图,但我希望能够改为编写 ggplot2
代码。我该怎么办?
这是我的代码:
df <- structure(list(SurvYear =c(3L,2L,3L,6L,8L,5L,9L,1L,7L,4L,4L),Gender = c(1L,0L,1L),Age = c(63L,66L,34L,43L,63L,21L,24L,44L,52L,59L,27L,32L,30L,20L,56L,55L,35L,26L,53L,39L,19L,28L,50L,22L,58L,25L,37L,51L,69L,23L,49L,46L,31L,38L,29L,48L,77L,60L,47L,41L,42L,54L,40L,36L,57L,18L,71L,61L,68L,62L,67L,45L,33L,65L,70L,63L),Highest_Educationmx = c(4L,3L),Censor = c(0L,0L)),class = "data.frame",row.names = c(NA,-300L))
脚本如下:
library(mgcv)
library(ggplot2)
#Run the model
Model1 <- gam(SurvYear~
(Gender)+
s(Age,k=50)+
s(Highest_Educationmx,k=7),weights=Censor,data=df,gamma=1.5,family=cox.ph())
summary(Model1)
#Build a perspective chart
vis.gam(Model1,view=c("Age","Highest_Educationmx"),plot.type="persp",color="gray",se=-1,theta=45,phi=25,xlab="Age",ylab= "Highest Education",ticktype="detailed",zlim=c(-5.00,2.00))
#Plot individual predictors using plot command from mgcv
plot(Model1,all.terms=T,rug=T,residuals=F,se=T,shade=T,seWithMean=T)
#Plot individual predictors using ggplot instead of plot command from mgcv
#UNSURE HOW DO TO THIS
解决方法
我有偏见(我写的),但您可以使用 gratia 包。
您可以使用 draw()
函数代替 plot.gam()
,如果您想要完全控制,只需使用 evaluate_smooth()
生成平滑的整洁表示,然后轻松绘制使用 ggplot2。
以下是基于 Gavin Simpson 建议的脚本:
library(gratia)
#Plot individual predictors using ggplot instead of the plot command from mgcv
sm <- gratia::evaluate_smooth(Model1,"Age")
ggplot(sm,aes(x=Age,y=est)) + geom_line(size=1.0) +
geom_ribbon(aes(ymax=est+se,ymin=est-se),alpha=0.20) +
coord_cartesian(xlim=c(20.00,75.00),ylim=c(-2.00,1.00)) +
scale_x_continuous(breaks=seq(20.00,75.00,5.00)) +
scale_y_continuous(breaks=seq(-2.00,1.00,1.00)) +
labs(title="Age") +
xlab("Age") +
ylab("Linear Risk Score") +
theme(plot.title=element_text(size=10)) +
geom_hline(yintercept=0,linetype="dashed",size=0.5) +
geom_vline(xintercept=mean(df$Age),size=0.5)