我使用gam
包中的mgcv
拟合模型。我将结果存储在model
中,到目前为止,我一直在使用plot(model)
查看平滑组件。我最近开始使用lattice
并且喜欢它的输出。所以我想知道,是否可以使用lattice
?
这是我的数据集:https://gist.github.com/plxsas/fcef4a228c18c772b4f3
m2<- gam(TotalInd ~ s(dayinyear, by=as.numeric(Site=="1"), bs="cr")
+s(dayinyear, by=as.numeric(Site=="2"), bs="cr") + s(dayinyear,
by=as.numeric(Site=="3"), bs="cr"), random=list(Replicate=~ 1), data=data)
如何在lattice
包中绘制此模型,并将三个面板代表我的三个网站更顺畅,好吗?
您还可能注意到我使用了dayinyear
而不是正确的月份格式(数据中的第一列)。这是因为广义加性模型不处理分类变量。但是,我想在我的图表中用月份的名称来表示时间(如在第一列中),是否有人知道lattice
情节中的前进方向?
答案 0 :(得分:1)
以下是使用某些虚假数据执行此操作的一般方法。你需要调整它以确保名称是你喜欢的,
library(reshape)
library(mgcv)
library(lattice)
X1<-rnorm(100) # Make some fake data
X2<-rnorm(100)
X3<-rnorm(100)
Y<-rnorm(100)
Mod<-gam(Y~s(X1,bs="cr")+s(X2,bs="cr")+s(X3, bs="cr")) # make a model
Z<- predict(Mod,type="terms", se.fit=T) #Z is the predicted value
#for each smooth term, se.fit give you SE
Z2<-melt(Z$fit) #Z was in wide form, Z2 is long form
Z2$XX<-c(X1,X2,X3) #add the original values for he predictors
Z2$SE<-melt(Z$se.fit)$value #add SE
Z2$UP<-Z2$value+2*Z2$SE #+2 SE
Z2$Low<-Z2$value-2*Z2$SE # - 2 SE
Z2<-Z2[order(Z2$XX),]
xyplot(value~XX|X2,data=Z2,type="l",col="black",as.table=T,
prepanel=function (x,y,...)list(ylim=c(min(Z2$Low),max(Z2$UP))),
panel=function(x,y,groups,subscripts,...){
panel.xyplot(x,y,...)
panel.lines(Z2$UP[subscripts]~Z2$XX[subscripts],lty=2, col="red")
panel.lines(Z2$Low[subscripts]~Z2$XX[subscripts],lty=2, col="red")
}
)
value
是每个预测变量的预测值,X2
是分组变量所在的位置(表示哪个数据属于每个预测变量)。如果你正在为我们工作这么多,你应该重新命名,以便更清楚。 order
部分只是避免意大利面条
您可以使用at
参数中x轴的labels
和scales
参数来控制x轴的标记方式。有关详细信息,请参阅?xyplot
m2<- gam(TotalInd ~ s(dayinyear, by=as.numeric(Site=="1"), bs="cr")
+s(dayinyear, by=as.numeric(Site=="2"), bs="cr")
+ s(dayinyear, by=as.numeric(Site=="3"), bs="cr"),
random=list(Replicate=~ 1), data=Data)
Z<- predict(m2,type="terms",se.fit=T) #Z is the predicted value and SE
Z2<-melt(Z$fit) #Z was in wide form, Z2 is long form
Z2$dayinyear<-Data$dayinyear #add the original values for he predictors
Z2$SE<-melt(Z$se.fit)$value
Z2$UP<-Z2$value+2*Z2$SE
Z2$Low<-Z2$value-2*Z2$SE
Z2<-Z2[Z2$value!=0,] #gets rid of excess zeroes
Z2<-Z2[order(Z2$dayinyear),]
xyplot(value~dayinyear|X2,data=Z2,type="l",col="black",as.table=T,
prepanel=function (x,y,...)list(ylim=c(min(Z2$Low),max(Z2$UP))),
panel=function(x,y,groups,subscripts,...){
panel.xyplot(x,y,...)
panel.lines(Z2$UP[subscripts]~Z2$dayinyear[subscripts],lty=2, col="red")
panel.lines(Z2$Low[subscripts]~Z2$dayinyear[subscripts],lty=2, col="red")
}
)
请注意,我将起始data.frame
的名称从data
更改为Data
编辑 - 我为每个情节添加了两条显示+ / - 2 SE的虚线