R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

Codewar發表於2021-12-11

之前的文章中都是給大家寫的變數間線性關係的做法,包括迴歸和廣義線性迴歸,變數間的非線性關係其實是很常見的,今天給大家寫寫如何擬合論文中常見的非線性關係。包括多項式迴歸Polynomial regression和樣條迴歸Spline regression。

多項式迴歸

首先看一個二次項擬合的例子,我現在想探討蘋果內容物apple content和蘋果酸度cider acidity的關係,第一步應該是做出apple content和cider acidity關係的散點圖,假如是下圖:

 

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

那麼我很直觀地可以看出來,曲線(二次)對資料的擬合明顯是好於線性擬合的。

上面的只是一個2次項擬合的例子,我們其實經常會遇到有可能高次式會把資料擬合的更好,社科論文中其實也常常見到做高次迴歸的,常見的1次,2次,3次,4次項英文論文中的表達,曲線形狀如下:

 

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

 

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

擬合出來的一般模型表示式如下:

 

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

而且通常情況下,模型中所有的低次項都不應該被略去。就是我有了4次項,那麼應該3,2,1次項都應該有。

含有二次及以上的模型就叫多項式迴歸模型。

樣條迴歸

之前在機器學習的文章中有給大家寫過擬合,我們做多次項擬合的時候,按道理你可以將項的次數調得很高,總是可以近乎完美的擬合我們的複雜的非線性關係,但是問題就是外推性就沒有了,這也並不是我們想看到的結果:

High-degree polynomials allow us to capture complicated nonlinear relationships in the data but are therefore more likely to overfit the training set.

還有就是自變數和因變數之間的關係在自變數的不同取值範圍也並非不變的,比如某個區間是線性的,某個區間是2次曲線,某個區間又成了3次曲線。

上面兩個問題處理方法之一就是樣條splines

所謂樣條就是成片段的多次式,一個曲線分多段擬合,段與段之間的分割點叫做結knots

A spline is a piecewise polynomial function. This means it splits the predictor variable into regions and fits a separate polynomial within each region, which regions connect to each other via knots.

 

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

上圖便是用兩個結將我們的曲線分成了3個樣條。

通過對關係曲線的劃分,我們可以儘可能達到既擬合的好,又好解釋的目的。

我們在論文中還會有看到說限制性立方樣條(restricted cubic splines),這個又是個啥呢?

就是我們正常做樣條,有可能做出來就是這樣的:雖然分段但是不連貫:

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

這樣的情況下結點處,不連貫的地方解釋起來就會很困難了嘛。

所以,我們更加期望能夠得到一個平滑的曲線(增加可解釋性),而且首尾都應該是線性的,從而保證預測準確性(減少過擬合的影響),像這樣:

 

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

為了得到這麼樣的效果我們就會給樣條加上限制,所以叫做限制性立方樣條:

restrictions need to be imposed so that the spline is continuous (i.e., there is no gap in the spline curve) and “smooth” at each knot。A restricted cubic spline has the additional property that the curve is linear before the first knot and after the last knot.

樣條數量的確定和結位置的選擇也是有講究的,結的個數可以自己定,但是一般不超過5個;結的位置需要儘可能在拐彎的地方:

The number of knots used in the spline is determined by the user, but in practice we have found that generally five or fewer knots are sufficient. The location of the knots also needs to be specified by the user, but it is common that the knot with the smallest value is relatively close to the smallest value of the variable being modelled (e.g., the 5th percentile), while the largest knot is in the neighbourhood of the largest value of the variable being modelled (e.g., the 95th percentile).

廣義可加模型

上面寫的內容,無論是直接擬合,還是分段擬合,我們都是在擬合一個完整的曲線或直線方程,廣義可加模型則是將自變數的單獨模型相加,下圖式子即為一般線性模型和可加模型:

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

我們看下圖,下圖中對於x和y關係的擬合是通過x的3個基礎函式相加得到的:

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

GAMs automatically learn a nonlinear relationship between each predictor variable and the outcome variable, and then add these effects together linearly, along with the intercept.

就是說廣義可加的原理就是,先弄幾個好解釋的基礎函式,這個基礎函式可以是一次的,也可以是多次的,然後再將這些基礎函式進行線性組合,從而達到更好地擬合資料的目的。

通過廣義可加模型可以同時實現模型的可解釋性Interpretability,靈活性flexibility和正則化regularization。

怎麼理解呢,我們先看可解釋性,假如一個可加模型是如下形式的基礎函式相加得到的:

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

x2的作用我們就可以解釋為在其它變數不變的情況下,x2和結局之間的關係是線性的,xp對左邊的結局在某個點之前也基本是線性增加的,然乎某個點之後xp對結局就無影響了,這個就是將模型相加後才可能實現的解釋性。

靈活性在於,可加模型可以將所有自變數單獨建模後相加,我們甚至不需要提前知道xy的關係,完全由資料說話的非引數形式,就比整體的多項式和樣條更靈活。

正則化則可以避免過擬合,可加模型是有一個超參λ的,這個超參決定了曲線的歪扭程度,英文叫做wiggliness,通過對超參的控制就可以很方便地實現方差偏差折中,見下圖:

The level of smoothness is determined by the smoothing parameter, which we denote by λ. The higher the value of λ, the smoother the curve

 

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

當然還有一個問題就是我到底該用多少個基礎函式呢?基礎函式越多模型就可以越靈活。見下圖,這個大家在具體操作的時候也是可以自己設定的:

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

例項操練

我現在手上有如下資料

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

我想探究medv和lstat之間的關係,先做個圖:

ggplot(train.data, aes(lstat, medv) ) +
  geom_point() +
  stat_smooth()

 

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

可以看到這兩個變數間是非常明顯的非線性關係,此時我們需要考慮給自變數加上多次項擬合。

在R語言中我們可以使用I()來加上變數的高次項,比如我要加二次項,我就可以寫出I(x^2)

lm(medv ~ lstat + I(lstat^2), data = train.data)

模型結果如下:

 

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

上面就是多次項迴歸的做法,接下來給大家寫寫如何做樣條迴歸

剛剛有寫我們做樣條的時候是需要設定結的,比如我就設定自變數的第25,50,75百分位為結:

knots <- quantile(train.data$lstat, p = c(0.25, 0.5, 0.75))

做一個立方樣條迴歸(預設就是做立方樣條),程式碼如下:

model <- lm (medv ~ bs(lstat, knots = knots), data = train.data)

模型輸出結果如下:

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

我們接著看廣義可加模型的R語言做法,我手上有資料如下:

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

我現在想弄明白x3與y的關係,但是假如我現在已經知道,x1和x2與y的關係為非線性的,我們是不是要把這個非線性關係控制掉來看我們x3和y的關係呀。所以我們跑一個可加模型來瞅瞅:

b1 <- gam(y ~ s(x1, bs='ps', sp=0.6) + s(x2, bs='ps', sp=0.6) + x3, data = dat)
summary(b1)

上面的程式碼中bs設定平滑方法,sp設定λ。

執行上面的程式碼後得到結果如下:

R資料分析:變數間的非線性關係,多項式,樣條迴歸和可加模型

 

就是說在控制了x1和x2的曲線效應後,我們x3對y其實是沒有影響的。

小結

今天給大家寫了多項式迴歸,樣條迴歸和可加模型,希望能給到大家以啟發,感謝大家耐心看完,自己的文章都寫的很細,重要程式碼都在原文中,希望大家都可以自己做一做,請轉發本文到朋友圈後私信回覆“資料連結”獲取所有資料和本人收集的學習資料。如果對您有用請先記得收藏,再點贊分享。

也歡迎大家的意見和建議,大家想了解什麼統計方法都可以在文章下留言,說不定我看見了就會給你寫教程哦,有疑問歡迎私信。

相關文章