如何使用 mgcv 包从非线性模型在 R 中创建 ggplot?

问题描述

我有一个使用 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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...