R Smoothers and Generalised Additive Models 廣義加性模型

GAM( Generalised Additive Models )是什麼?

請對glm有一定了解,否則本文看起來會很跳躍。gam 可以看作是 glm 的擴展, 

對於真實世界的數據,可能是更加光滑,在不同階段有不同光滑程度 的曲線,而不是簡單的線性模型。爲了應付這種 模型中更光滑部分 (smoother) 的需求,我們引入 ”加性模型“, 譬如 我們使用了 更高的次冪 ,但這個法子有 undesirable properties,於是我們引入了 splines + knots 結構 的加性模型 。這個結構仍然可以通過 使用 線性模型那樣 的 least square 方式 得到模型參數的 點估計。

knots 太少就不夠 flexible ,過細過多的 knots 會 讓模型 less smooth ,也就是 過擬合 , 所以引入了一些機制來實現這個權衡。

1 How to specify the smooth function ----, one way to go is to use penalised regression splines to represent the functions

2 How smooth should they be -----whereas the appropriate degree of smoothness can be estimated from the data using cross validation (CV)

GLM 吸收 加性模型 的 特性,用 加性模型(如下圖) 替換了 原來的GLM中 線性模型 的部分,成爲了 GAM。也就是:

其中f(x)是 smoother ,是 Non-parametric model 的, gam中 提供 default 方法 確定這個 光滑部分的 結構, gam 爲自動擬合splines 提供了一種機制。也就是說,你不必手動選擇 knots 。這可以使用mgcv包完成

什麼時候用GAM?

一般來說我們散點圖發現數據不適合 線性模型 ,就會 看一看數據是否符合某種概率分佈的描述,以使用GLM, 或者使用GAM ,但其區別是什麼呢?也就是說我們什麼時候使用 GLM,什麼時候使用 GAM 呢? 怎麼才能認爲,一個模型使用GLM是不合適的,而要進一步考慮GAM ?

一個自回答:數據量更多,變化越曲折的場景我們選擇GAM。

簡單的考慮單變量的情況,GLM的線性部分意味着 某個概率分佈的參數是由這個單變量的線性變換(在套上log或者其他連接函數)組成的,也就是說 某個概率分佈的參數是的shape 是連接函數的shape, identical 轉換的話shape 就是一條直線,以正態分佈 爲例,也就是每一個對應的X 預測點由 各異的均值,恆定的方差,這樣得到的 擬合曲線 就是 連接函數的shape , 也就是一條直線。 當這種情況推廣到GAM, 最簡單的,數據不再是一條直線,但是 identical 和 正態分佈 仍然滿足,我們就要考慮GAM。 還有一個點就是GAM適合數據量大的場景。 總結的說,數據量大,可以考慮GAM, 散點圖揭示了明顯的 ”非連接函數轉換後的shape“ 的時候,考慮GAM 。

殘差圖

和glm一樣 各種殘差圖及其解釋是很重要的在 model fit的時候,,,這個真的有些麻煩,我就先不寫了。

總的來說,時刻記住模型背後的數學樣子,殘差的數學式子,那麼殘差圖中 ,譬如殘差正態分佈等 就較爲容易被理解。

一個例子

#這個rank和knots位置的選取,對數據來源不瞭解(經驗不足)的話,指定時很困難的
#GAM提供了default 的方法
model5 <- gam(medv ~ s(lstat), data = train.data)
# Make predictions
predictions <- model5 %>% predict(test.data)
# Model performance
model5_performance <- data.frame(
  RMSE = RMSE(predictions, test.data$medv),
  R2 = R2(predictions, test.data$medv)
)
summary(model5)


model5_performance
ggplot(train.data, aes(lstat, medv) ) +
  geom_point() +
  stat_smooth(method = gam, formula = y ~ s(x))

plot(model5)

# split the output into 4 panes
par(mfrow = c(2,2))
gam.check(model5)   #這幾張圖怎麼看,well ,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章