如何在mgcv软件包中使用predict.gam计算一阶导数

时间:2019-08-11 17:11:58

标签: r derivative gam mgcv

在“来自拟合GAM模型的predict.gam预测”文档中,我找到了用于计算平滑度导数的示例代码。但是我不明白它是如何工作的,然后在我的数据集中出现了错误。我在mgcv中用p样条拟合了我的一维数据集,而当我尝试按照示例代码的指示绘制一阶导数时,gam()模型为mgcv.ps,它不像example那样工作。

示例代码如下:     ################################################ ##################         ##区分模型中的平滑度(带有CI的导数)             ################################################ ##################

## simulate data and fit model...
dat <- gamSim(1,n=300,scale=sig)
b<-gam(y~s(x0)+s(x1)+s(x2)+s(x3),data=dat)
plot(b,pages=1)
## now evaluate derivatives of smooths with associated standard
## errors, by finite differencing...
x.mesh <- seq(0,1,length=200) ## where to evaluate derivatives
newd <- data.frame(x0 = x.mesh,x1 = x.mesh, x2=x.mesh,x3=x.mesh)
X0 <- predict(b,newd,type="lpmatrix")
eps <- 1e-7 ## finite difference interval
x.mesh <- x.mesh + eps ## shift the evaluation mesh
newd <- data.frame(x0 = x.mesh,x1 = x.mesh, x2=x.mesh,x3=x.mesh)
X1 <- predict(b,newd,type="lpmatrix")
Xp <- (X1-X0)/eps ## maps coefficients to (fd approx.) derivatives
colnames(Xp)      ## can check which cols relate to which smooth
par(mfrow=c(2,2))
for (i in 1:4) {  ## plot derivatives and corresponding CIs
  Xi <- Xp*0
  Xi[,(i-1)*9+1:9+1] <- Xp[,(i-1)*9+1:9+1] ## Xi%*%coef(b) = smooth     deriv i
  df <- Xi%*%coef(b)              ## ith smooth derivative
  df.sd <- rowSums(Xi%*%b$Vp*Xi)^.5 ## cheap diag(Xi%*%b$Vp%*%t(Xi))^.5
  plot(x.mesh,df,type="l",ylim=range(c(df+2*df.sd,df-2*df.sd)))
  lines(x.mesh,df+2*df.sd,lty=2);lines(x.mesh,df-2*df.sd,lty=2)
}

在我的数据集中,由于x轴是1到55(总共55个月),所以我将x.mesh设为#x.mesh <-seq(0,54,length = 55)。然后按照示例代码进行操作,但是#esp#是什么意思?我认为这表示t-(t-1),因此我给出#esp = 1#。但是,我不太了解示例中的#forloop#。我认为是由于示例中的4个变量。它用于(i在1到4中),但是,我只有1 x变量,所以下面的绘图我发生了错误。有人可以在示例代码的最后一个功能中解释详细信息吗?以及我应该如何使用代码来满足我的拟合模型。

我的拟合模型如下:

dataset <- read.csv("bsplinesforR.csv", header = TRUE)

x <- dataset[,2]
y <- dataset[,4]
## define plotting parameters
vdist <- hdist <- 0.2
layout(matrix(1:4, 2, 2, byrow=TRUE), widths= c(10, 10), heights= c(10, 10))
par(mar= c(vdist, 4, 3, hdist))
plot(x, y, ylab="y", xlab="", axes=FALSE)
axis(2); axis(3); box()

library(mgcv)
mgcv.ps <- gam(y~s(x,bs="ps"), method = "REML")

t.g <- predict(mgcv.ps)

lines(x, t.gl,col=2, lwd=2)
lines(x, t.g,col=3, lwd=2)
legend(5, 600, c("Real", "gamlss", "mgcv"), col=c(1, 2, 3), lty=c(2, 1, 1), bty="n")
layout(matrix(1, 1, 1))

0 个答案:

没有答案