如何在莱迪思包中的xyplot()中加入gam()?

时间:2014-06-01 08:15:55

标签: r lattice gam mgcv

我正在尝试将gam()包中的广义加法模型mgcv合并到来自xyplot()包中的coplot()函数或lattice函数。

通过选择臭氧数据,可以在http://statweb.stanford.edu/~tibs/ElemStatLearn/中找到数据。

这是我的内核平滑代码。

    ozonedata=ozone 
    Temperature=equal.count(ozonedata$temperature,4,1/2)
    Wind=equal.count(ozonedata$wind,4,1/2)

    xyplot(ozone^(1/3) ~ radiation | Temperature * Wind, data = ozonedata, as.table = TRUE, 
           panel = function(x, y, ...) {panel.xyplot(x, y, ...);panel.loess(x, y)}, 
           pch = 20,xlab = "Solar Radiation", ylab = "Ozone (ppb)")

    coplot((ozone^(1/3))~radiation|temperature*wind,data=ozonedata,number=c(4,4),
           panel = function(x, y, ...) panel.smooth(x, y, span = .8, ...),
           xlab="Solar radiation (langleys)", ylab="Ozone (cube root ppb)")

广义附加模型的生成如下。

    gam_ozone = gam(ozone^(1/3)~s(radiation)+s(temperature)+s(wind),data=ozonedata,method="GCV.Cp")

现在我在将gam()的拟合与格子图组合时遇到了麻烦。

1 个答案:

答案 0 :(得分:3)

我认为这应该有效。请注意,我们将gam_ozone对象作为参数传递给名为xyplot的{​​{1}}。这将允许我们在面板功能中访问它。

gam

现在,为了使用xyplot(ozone^(1/3) ~ radiation | Temperature * Wind, data = ozonedata, as.table = TRUE, gam=gam_ozone, panel = function(x, y, gam,...) { xx <- dimnames(trellis.last.object()) ww <- arrayInd(packet.number(), .dim=sapply(xx, length)) avgtmp <- mean(xx[[1]][[ww[1]]]) avgwind <- mean(xx[[2]][[ww[2]]]) gx<-seq(min(x, na.rm=T), max(x, na.rm=T), length.out=50) gy<-predict(gam, data.frame(radiation=gx, temperature=avgtmp, wind=avgwind)) panel.xyplot(x, y, ...); panel.xyplot(gx, gy, ..., col="red", type="l"); }, pch = 20,xlab = "Solar Radiation", ylab = "Ozone (ppb)" ) 进行预测,您将不得不为每个面板找到用于风和温度的值。我决定做的只是取每个木瓦范围的中间值。所以我使用Deepayan-approved, undocumented feature通过调用gam来获取每个当前带状疱疹的范围。然后我找到当前面板dimnames一旦我有了范围,我就可以获得平均值。

我不会使用我们传入的packet.number()模型来预测每个面板的曲线。我根据观察值计算了50 gam个值的范围,然后从x新线预测。

最后,我使用gam绘制原始数据,然后绘制panel.xyplot预测的行。

sample lattice output with gam smooth curve