Пакет `gam`: обнаружен дополнительный сдвиг при наброске данных в `plot.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"))

введите описание изображения здесь

Chambers, J.M. and Hastie, T.J. (1993) Statistical Models in S (Chapman & Hall) показывает, что не должно быть смещения, и это также интуитивно правильно (сглаживание должно описывать данные).

Я заметил что-то похожее в mgcv, что можно решить, предоставив параметру shift значение перехвата модели (потому что сглаживание, по-видимому, центрировано). Я подумал, что то же самое может быть верно и здесь, поэтому я вычел точку пересечения из исходных точек данных. Однако приведенный выше график показывает, что эта идея неверна. Я не знаю, откуда берется дополнительный сдвиг. Я надеюсь, что кто-то здесь сможет мне помочь.

(версия R. 3.3.1; gam версия 1.12)


person Manuel Weinkauf    schedule 21.10.2016    source источник


Ответы (1)


Я думаю, что я должен сначала объяснить различные выходные данные в подобранной модели 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

Сначала вы можете убедиться, что addpred — это то, что дает fit$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, чтобы они соответствовали этому графику, вам нужно не только вычесть точку пересечения (beta[0]), но и c0 из y:

points(x, y - beta[1] - c0)

введите описание изображения здесь

person Zheyuan Li    schedule 21.10.2016