[英]Is there a way to produce predict.gam(..., type="terms") values that are NOT centered
Original question:原问题:
Calling predict.gam(..., type="terms")
returns values that are centered on the average.调用predict.gam(..., type="terms")
返回以平均值为中心的值。 Is there a way to obtain the raw predicted term values (ie ones that have not been centered on the average)?有没有办法获得原始预测项值(即那些没有以平均值为中心的值)?
Edited: Here is a reproducible example of my attempt to get the (non-centered) fitted values of a given variable using lpmatrix
.编辑:这是我尝试使用lpmatrix
给定变量的(非中心)拟合值的可lpmatrix
。 The values are similar to those using visreg
but with an offset.这些值与使用visreg
的值相似,但具有偏移量。 This is strictly for the case where the link
is identity
and there are no tensor products.这严格适用于link
是identity
且没有张量积的情况。
# read in data
air<-data.frame(airquality)
air<-air[complete.cases(air),]
# set up m odel
model<-gam(Temp~s(Ozone) + s(Solar.R) + s(Wind),data=air,method="ML")
#get predicted values
predicted<-as.data.frame(predict(model,na.action=na.exclude))
colnames(predicted)<-"predicted"
# using the lpmatrix, set values of s(Ozone), s(Solar.R), and s(Wind) to 0
lpmat<-predict(model, type="lpmatrix")
lpmat_Ozone<-lpmat; lpmat_Ozone[,grep("Ozone",colnames(lpmat))]<-0
lpmat_Solar.R<-lpmat; lpmat_Solar.R[,grep("Solar.R",colnames(lpmat))]<-0
lpmat_Wind<-lpmat; lpmat_Wind[,grep("Wind",colnames(lpmat))]<-0
#obtain response predictions with s(each variable) set to 0 (respectively)
predicted$Ozone<-unname(lpmat_Ozone%*%coef(model))[,1]
predicted$Solar.R<-unname(lpmat_Solar.R%*%coef(model))[,1]
predicted$Wind<-unname(lpmat_Wind%*%coef(model))[,1]
#obtain term predictions
answerdf<-as.data.frame(predicted$predicted - predicted$Ozone)
colnames(answerdf)<-"Ozone"
answerdf$Solar.R<-(predicted$predicted - predicted$Solar.R)
answerdf$Wind<-(predicted$predicted - predicted$Wind)
#visualize using visreg method and the alternative method above
visregdat<-visreg(model, "Ozone", plot=FALSE)$fit
plot(visregFit~Ozone,data=visregdat, type="l", lwd=5, ylim=c(-30,90), ylab= "fitted values")
points(answerdf$Ozone~air$Ozone, col="violet", pch=20)
legend(100,60, legend=c("Visreg", "Alt. method"),
col=c("black", "violet"), pch=20, cex=0.8)
Gives us this plot, showing the same curves but with with different intercepts.给我们这个图,显示相同的曲线,但截距不同。 Why would this be?为什么会这样?
不可以。要添加的常量可用作predict()
返回的对象的属性,否则,不可以,没有选项可以自动执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.