예측을위한 여러 가지 도구를 살펴 보았으며이 목표를 달성 할 수있는 가장 일반적인 잠재력을 가진 GAM (Generalized Additive Models)을 발견했습니다. GAM은 훌륭합니다! 복잡한 모델을 간결하게 지정할 수 있습니다. 그러나 동일한 간결함은 특히 GAM이 상호 작용 항과 공변량을 어떻게 생각하는지에 관해 혼란을 유발합니다.
y
몇 개의 가우시안에 의해 혼동 된 단조 함수와 약간의 노이즈 인 예시 데이터 세트 (포스트 종료시 재현 가능한 코드)를 고려하십시오 .
데이터 세트에는 몇 가지 예측 변수가 있습니다.
x
: 데이터의 색인 (1-100).w
:y
가우스가 있는 부분을 표시하는 보조 기능입니다 .w
값은 1-20이며, 여기서x
11과 30 사이, 51과 70 사이w
입니다. 그렇지 않으면 0입니다.w2
:w + 1
0 값이 없도록합니다.
R의 mgcv
패키지를 사용하면 이러한 데이터에 대해 여러 가지 가능한 모델을 쉽게 지정할 수 있습니다.
모델 1과 2는 매우 직관적입니다. 기본 매끄러움에서 y
인덱스 값만 예측 x
하면 모호하게 정확하지만 너무 매끄 럽습니다. 에서 예측 된 "평균 가우시안"모델의 결과 y
만 예측 하고 다른 데이터 포인트의 "인식"은 값이 0입니다.w
y
w
모델 3 개 사용 둘 x
과 w
편안한 착용감을 생산하는 1 차원 부드럽게, 같은. 모델 4 용도 x
와 w
차원에도 좋은 착용감을주고, 부드럽게. 이 두 모델은 동일하지는 않지만 매우 유사합니다.
모델 5 모델 x
"by" w
. 모델 6은 그 반대입니다. mgcv
의 문서에 따르면 "by 인수는 부드러운 함수에 [ 'by'인수에 제공된 공변량]이 곱해집니다"라고 명시되어 있습니다. 모델 5와 6이 동일하지 않아야합니까?
모형 7과 8은 예측 변수 중 하나를 선형 항으로 사용합니다. GLM이 이러한 예측 변수를 사용하여 수행 한 작업을 수행 한 다음 나머지 모델에 효과를 추가하므로 직관적으로 이해가됩니다.
마지막으로, Model 9는 x
"by" w2
(즉 w + 1
) 인 것을 제외하고 Model 5와 동일합니다 . 여기서 이상한 점은 0이 없으면 w2
"by"상호 작용에서 현저히 다른 효과를 낸다는 것입니다.
그래서 내 질문은 다음과 같습니다.
- 모델 3과 4의 사양은 어떻게 다릅니 까? 차이를 더 명확하게 이끌어내는 다른 예가 있습니까?
- "여기서"정확히 무엇을하고 있습니까? 내가 Wood의 책과이 웹 사이트에서 읽은 내용의 대부분은 "by"가 곱셈 효과를 낸다고 제안하지만 직관을 이해하는 데 어려움을 겪고 있습니다.
- 모델 5와 9 사이에 눈에 띄는 차이점이있는 이유는 무엇입니까?
Reprex는 R로 작성되었습니다.
library(magrittr)
library(tidyverse)
library(mgcv)
set.seed(1222)
data.ex <- tibble(
x = 1:100,
w = c(rep(0, 10), 1:20, rep(0, 20), 1:20, rep(0, 30)),
w2 = w + 1,
y = dnorm(x, mean = rep(c(20, 60), each = 50), sd = 3) + (seq(0, 1, length = 100)^2) / 2 + rnorm(100, sd = 0.01)
)
models <- tibble(
model = 1:9,
formula = c('y ~ s(x)', 'y ~ s(w)', 'y ~ s(x) + s(w)', 'y ~ s(x, w)', 'y ~ s(x, by = w)', 'y ~ s(w, by = x)', 'y ~ x + s(w)', 'y ~ w + s(x)', 'y ~ s(x, by = w2)'),
gam = map(formula, function(x) gam(as.formula(x), data = data.ex)),
data.to.plot = map(gam, function(x) cbind(data.ex, predicted = predict(x)))
)
plot.models <- unnest(models, data.to.plot) %>%
mutate(facet = sprintf('%i: %s', model, formula)) %>%
ggplot(data = ., aes(x = x, y = y)) +
geom_point() +
geom_line(aes(y = predicted), color = 'red') +
facet_wrap(facets = ~facet)
print(plot.models)