我正在尝试将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()
的拟合与格子图组合时遇到了麻烦。
答案 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
预测的行。