私は予測のための多くのツールを調査してきましたが、一般化された加算モデル(GAM)がこの目的に最も可能性があることがわかりました。GAMは素晴らしいです!複雑なモデルを非常に簡潔に指定できます。ただし、その簡潔さが、特にGAMが相互作用項と共変量をどのように考えているかという点で、混乱を招いています。
y
いくつかのガウス分布に加えてノイズが加わった単調関数であるサンプルデータセット(投稿の最後に再現可能なコード)を考えてみましょう。
データセットには、いくつかの予測変数があります。
x
:データのインデックス(1〜100)。w
:y
ガウス分布が存在するセクションをマークする2番目の機能。w
値は1〜20で、11〜30x
、および51〜70です。それ以外の場合w
は0です。w2
:w + 1
ので、0値はありません。
Rのmgcv
パッケージにより、これらのデータの多くの可能なモデルを簡単に指定できます。
モデル1および2はかなり直感的です。デフォルトの平滑度でy
インデックス値のみから予測x
すると、あいまいに正しいものが生成されますが、滑らかすぎます。に存在する「平均ガウス」モデルの結果y
からのみ予測し、他のデータポイントは「認識」しません。すべてのデータポイントの値は0です。w
y
w
モデル3は両方x
を使用しw
、1Dスムースとして使用して、ぴったりとフィットします。モデル4は、2Dスムーズを使用してx
おりw
、優れた適合性も提供します。これら2つのモデルは非常に似ていますが、同一ではありません。
モデル5モデルx
"by" w
。モデル6はその逆です。mgcv
のドキュメントには、「by引数により、スムーズ関数に['by'引数で指定された共変量]が乗算されることが保証されている」と記載されています。モデル5とモデル6は同等ではありませんか?
モデル7および8は、予測子の1つを線形項として使用します。GLMがこれらの予測子で行うことを単純に実行し、モデルの残りの部分に効果を追加するため、これらは直感的に理にかなっています。
最後に、モデル9はモデル5と同じですが、x
「by」w2
(つまり)で平滑化されw + 1
ます。ここで私にとって奇妙なのは、ゼロの欠如がw2
「by」相互作用に著しく異なる効果をもたらすことです。
したがって、私の質問は次のとおりです。
- モデル3とモデル4の仕様の違いは何ですか?違いをより明確に引き出す他の例はありますか?
- ここで「by」とは正確には何ですか?私がウッドの本とこのウェブサイトで読んだことの多くは、「by」が相乗効果を生み出すことを示唆していますが、その直観をつかむのに苦労しています。
- モデル5とモデル9の間に大きな違いがあるのはなぜですか?
Rで書かれたReprexが続きます。
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)