3

我正在尝试将通用附加模型gam()mgcv包合并到R中的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()到格子图中时遇到了麻烦。

4

1 回答 1

4

我认为这应该有效。请注意,我们将gam_ozone对象作为参数传递给xyplot被调用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)"
)

现在为了使用gam来预测,您将不得不为每个面板找到一个用于风和温度的值。我决定做的只是为每个瓦片范围取中间值。因此,我使用了Deepayan 批准的、未记录的功能来获取当前每个带状疱疹的范围,并调用dimnames. 然后我找到当前面板,packet.number()一旦我有了范围,我就会采取手段获得平均值。

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

最后,我绘制原始数据,panel.xyplot然后绘制gam预测线。

具有 gam 平滑曲线的样本点阵输出

于 2014-06-01T20:27:28.857 回答