如何将(gam)图中y轴的值从平滑值更改为实际值?

时间:2018-06-22 17:28:22

标签: r plot smoothing gam

我试图在同一图中绘制三个gam函数(同一单位),x轴为日期(1月1日至12月31日),y轴为浓度。

## pm, macc and pred in a same plot

gam.pre.pm10.time<-mgcv::gam(pre.pm10~s(time),data=mypred1)
plot(gam.pre.pm10.time,shade=T,xaxt="n",scale=-1,lty=3)
axis(1,labels=c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),at=seq(1,365,31),las=1)

plot(gam.pm10.time,shade=T,shade.col = "blue", xaxt="n",yaxt="n",xlab="",ylab="PM10", scale = -1)
par(new=TRUE)
plot(gam.macc.time,shade=T,shade.col = "green", xaxt="n",yaxt="n",lty=2,xlab="",ylab="", scale = -1)
par(new=TRUE)
plot(gam.pre.pm10.time,shade=T,shade.col="grey", xaxt="n",yaxt="n",xlab="",ylab="",scale=-1,lty=3)
axis(1,labels=c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),at=seq(1,365,31),las=1)
legend(x="bottomleft",y=8,bg='transparent',
       legend=c("PM10","MACC","PRED"),
       lty=1:3,cex=0.8)
par(new=FALSE)
#

我不允许插入图片,但是基本上我的y轴范围现在是[-5,2]。我的问题是如何将y轴从平滑值更改为实际浓度值?在这种情况下1〜98?

非常感谢!

1 个答案:

答案 0 :(得分:1)

通常的想法是绘制模型的预测值,即使用plot.gam() plus 模型拦截项已经可视化的平滑效果。您可以将模型截距添加到所有内容中(请参阅shift的{​​{1}}参数并将其传递给plot.gam以获取截距。),但是更通用的解决方案是根据模型进行预测在一组平滑的时间点上,然后进行绘制。

使用单个模型而不是三个模型也将更加容易。在下面的示例中,我使用一个模型,但是这些想法适用于单独的模型,您只需要分别从这三个模型中进行预测,然后组合(例如coef(mod)[1])一组预测值即可。

示例数据

rbind()

现在针对每个因子水平预测协变量范围(在我的示例中为library('mgcv') ## Factor `by' variable example (with a spurious covariate x0) ## simulate data... dat <- gamSim(4) ## fit model... b <- gam(y ~ fac +s(x2, by = fac), data = dat) ,在您的示例中为x2),您需要相应地创建带有列的数据以用于响应堆叠的响应值,以及一个time(或其他名称)变量,用于编码响应的类型(facmaccpre.pm10是级别)

pm10

然后根据这些观察结果从模型进行预测

pdat <- with(dat, expand.grid(fac = levels(fac),
                              x2  = seq(min(x2), max(x2), length = 200)
                             )
            )

然后绘图。 (此示例在间隔0,1上具有pdat <- transform(pdat, pred = predict(b, newdata = pdat, type = "response")) 统一。按照您的示例将其转换为一年中的某一天,我将365.25乘以x2,但是您可以使用时间变量直接)。

x2

哪个都生产

enter image description here

相关问题