1

我的 GAM 曲线正在向下移动。拦截有什么问题吗?我使用的代码与Introduction to statistical learning...任何帮助表示赞赏..

在此处输入图像描述

这是代码。我模拟了一些数据(一条带噪声的直线),并使用引导程序多次拟合 GAM。(我花了一段时间才弄清楚如何在一个图中绘制多个 GAM 拟合。感谢这篇文章Sam 的回答和这篇文章

library(gam)

N = 1e2

set.seed(123)

dat = data.frame(x = 1:N,
                 y = seq(0, 5, length = N) + rnorm(N, mean = 0, sd = 2))
plot(dat$x, dat$y, xlim = c(1,100), ylim = c(-5,10))


gamFit = vector('list', 5)

for (ii in 1:5){

        ind = sample(1:N, N, replace = T)  #bootstrap
        gamFit[[ii]] = gam(y ~ s(x, 10), data = dat, subset = ind)

        par(new=T)

        plot(gamFit[[ii]], col = 'blue',
             xlim = c(1,100), ylim = c(-5,10),
             axes = F, xlab='', ylab='')
}
4

1 回答 1

2

问题在于plot.gam. 如果您查看帮助页面 ( ?plot.gam),则有一个名为 的参数scale,其中指出:

每个地块的“y”限制所涵盖的单位数量的下限。默认值为 scale=0,在这种情况下,每个绘图都使用正在绘制的函数的范围来创建它们的 ylim。通过将 scale 设置为所有图的 diff(ylim) 的最大值,则所有后续图将以相同的垂直单位生成。这对于比较加法模型中拟合项的重要性至关重要。

这是一个问题,因为您没有使用正在绘制的函数的范围(即范围y不是 -5 到 10)。所以你需要做的就是改变

plot(gamFit[[ii]], col = 'blue',
     xlim = c(1,100), ylim = c(-5,10),
     axes = F, xlab='', ylab='')

plot(gamFit[[ii]], col = 'blue',
     scale = 15,
     axes = F, xlab='', ylab='')

你得到:

游戏

或者您可以从对 的两个调用中删除xlim和参数,自动设置使用全部数据将使一切正常。ylimplotplot

于 2015-12-13T14:41:06.577 回答