`gam`包:在'plot.gam`

时间:2016-10-21 19:22:03

标签: r plot regression gam

我尝试使用gam包来容纳GAM(我知道mgcv更灵活,但我需要在这里使用gam)。我现在遇到的问题是模型看起来不错,但与原始数据相比,它似乎沿着y轴偏移了一个常数值,我无法弄清楚它来自何处。

此代码重现了该问题:

library(gam)
data(gam.data)
x <- gam.data$x
y <- gam.data$y
fit <- gam(y ~ s(x,6))

fit$coefficients
#(Intercept)     s(x, 6) 
#   1.921819   -2.318771

plot(fit, ylim = range(y))
points(x, y)
points(x, y -1.921819, col=2)
legend("topright", pch=1, col=1:2, legend=c("Original", "Minus intercept"))

enter image description here

Chambers,JM和Hastie,TJ(1993)S中的统计模型(Chapman&amp; Hall)表明不应该存在偏移,这也是直观正确的(光滑应该描述)数据)。

我注意到mgcv中有类似的东西,可以通过为shift参数提供模型的截距值来解决(因为平滑看似居中)。我认为这里也是如此,所以我从原始数据点中减去了截距。但是,上面的情节表明这个想法是错误的。我不知道额外转变的来源。我希望有人能够帮助我。

(R版本.3.3.1; gam版本1.12)

1 个答案:

答案 0 :(得分:2)

我想我应该首先解释拟合GAM模型中的各种输出:

library(gam)
data(gam.data)
x <- gam.data$x
y <- gam.data$y
fit <-gam(y ~ s(x,6), model = FALSE)

## coefficients for parametric part
## this includes intercept and null space of spline
beta <- coef(fit)

## null space of spline smooth (a linear term, just `x`)
nullspace <- fit$smooth.frame[,1]

nullspace - x  ## all 0

## smooth space that are penalized
## note, the backfitting procedure guarantees that this is centred
pensmooth <- fit$smooth[,1]

sum(pensmooth)  ## centred
# [1] 5.89806e-17

## estimated smooth function (null space + penalized space)
smooth <- nullspace * beta[2] + pensmooth

## centred smooth function (this is what `plot.gam` is going to plot)
c0 <- mean(smooth)
censmooth <- smooth - c0

## additive predictors (this is just fitted values in Gaussian case)
addpred <- beta[1] + smooth

您可以先验证addpredfit$additive.predictors给出的内容,由于我们使用高斯响应拟合加法模型,因此它也与fit$fitted.values相同。

plot.gam的作用是绘制censmooth

plot.gam(fit, col = 4, ylim = c(-1.5,1.5))
points(x, censmooth, col = "gray")

请记住,有

addpred = beta[0] + censmooth + c0

如果您想要移动原始数据y以匹配此图,您不仅需要从{{1}减去截距(beta[0]),还需要c0。 }

y

enter image description here