拓端tecdat|R語言里的非線性模型:多項式回歸、局部樣條、平滑樣條、廣義加性模型分析


原文鏈接:http://tecdat.cn/?p=9706

總覽

在這里,我們放寬了流行的線性方法的假設。有時線性假設只是一個很差的近似值。有許多方法可以解決此問題,其中一些方法可以通過使用正則化方法降低模型復雜性來  解決  。但是,這些技術仍然使用線性模型,到目前為止只能進行改進。本文本專注於線性模型的擴展

  • 多項式回歸    這是對數據提供非線性擬合的簡單方法。

  • 階躍函數  將變量的范圍划分為  K個  不同的區域,以生成定性變量。這具有擬合分段常數函數的效果。

  • 回歸樣條  比多項式和階躍函數更靈活,並且實際上是兩者的擴展。 

  • 局部樣條曲線  類似於回歸樣條曲線,但是允許區域重疊,並且可以平滑地重疊。

  • 平滑樣條曲線  也類似於回歸樣條曲線,但是它們最小化平滑度懲罰的殘差平方和准則 。

  • 廣義加性模型  允許擴展上述方法以處理多個預測變量。

多項式回歸

這是擴展線性模型的最傳統方法。隨着我們增加 多項式的項,多項式回歸使我們能夠生成非線性的曲線,同時仍使用最小二乘法估計系數。

逐步回歸

它經常用於生物統計學和流行病學中。

回歸樣條

回歸樣條是 擴展多項式和逐步回歸技術的許多基本函數之一  。事實上。多項式和逐步回歸函數只是  函數的特定情況  。

這是分段三次擬合的示例(左上圖)。

為了解決此問題,更好的解決方案是采用約束,使擬合曲線必須連續。

選擇結的位置和數量

一種選擇是在我們認為變化最快的地方放置更多的結,而在更穩定的地方放置更少的結。但是在實踐中,通常以統一的方式放置結。

要清楚的是,在這種情況下,實際上有5個結,包括邊界結。

那么我們應該使用多少個結?一個簡單的選擇是嘗試許多個結,然后看哪個會產生最好的曲線。但是,更客觀的方法是使用交叉驗證。

與多項式回歸相比,樣條曲線可以顯示出更穩定的效果。

平滑樣條線

我們討論了回歸樣條曲線,該樣條曲線是通過指定一組結,生成一系列基函數,然后使用最小二乘法估計樣條系數而創建的。平滑樣條曲線是創建樣條曲線的另一種方法。讓我們回想一下,我們的目標是找到一些非常適合觀察到的數據的函數,即最大限度地減少RSS。但是,如果對我們的函數沒有任何限制,我們可以通過選擇精確內插所有數據的函數來使RSS設為零。

選擇平滑參數Lambda

同樣,我們求助於交叉驗證。事實證明,我們實際上可以非常有效地計算LOOCV,以平滑樣條曲線,回歸樣條曲線和其他任意基函數。

平滑樣條線通常比回歸樣條線更可取,因為它們通常會創建更簡單的模型並具有可比的擬合度。

局部回歸

局部回歸涉及僅使用附近的訓練觀測值來計算目標點x 0 處的擬合度  。

可以通過各種方式執行局部回歸,尤其是在涉及擬合p  線性回歸模型的多變量方案中尤為明顯  ,因此某些變量可以全局擬合,而某些局部擬合。

廣義加性模型

 

GAM模型提供了一個通用框架,可通過允許每個變量的非線性函數擴展線性模型,同時保持可加性。

具有平滑樣條的GAM並不是那么簡單,因為不能使用最小二乘。取而代之的 是使用一種稱為反向擬合的方法  。

GAM的優缺點

優點

  • GAM允許將非線性函數擬合到每個預測變量,以便我們可以自動對標准線性回歸會遺漏的非線性關系進行建模。我們不需要對每個變量分別嘗試許多不同的轉換。

  • 非線性擬合可以潛在地對因變量Y做出更准確的預測  。

  • 因為模型是可加的,所以我們仍然可以檢查每個預測變量對Y的影響,   同時保持其他變量不變。

缺點

  • 主要局限性在於該模型僅限於累加模型,因此可能會錯過重要的交互作用。

 

范例

多項式回歸和階躍函數

  1.  
    library(ISLR)
  2.  
    attach(Wage)

我們可以輕松地使用來擬合多項式函數,然后指定多項式的變量和次數。該函數返回正交多項式的矩陣,這意味着每列是變量的變量的線性組合  age,  age^2,  age^3,和  age^4。如果要直接獲取變量,可以指定  raw=TRUE,但這不會影響預測結果。它可用於檢查所需的系數估計。

  1.  
    fit = lm(wage~poly(age, 4), data=Wage)
  2.  
    kable(coef(summary(fit)))

 

現在讓我們創建一個ages 我們要預測的向量。最后,我們將要繪制數據和擬合的4次多項式。

  1.  
    ageLims <- range(age)
  2.  
    age.grid <- seq(from=ageLims[ 1], to=ageLims[2])
  3.  
     
  4.  
    pred <- predict(fit, newdata = list(age = age.grid),
  5.  
    se= TRUE)
  1.  
    plot(age,wage,xlim=ageLims ,cex= .5,col="darkgrey")
  2.  
    lines(age.grid,pred$fit,lwd= 2,col="blue")
  3.  
    matlines(age.grid,se.bands,lwd= 2,col="blue",lty=3)

在這個簡單的示例中,我們可以使用ANOVA檢驗 。

  1.  
     
  2.  
    # # Analysis of Variance Table
  3.  
    ##
  4.  
    ## Model 1: wage ~ age
  5.  
    ## Model 2: wage ~ poly(age, 2)
  6.  
    ## Model 3: wage ~ poly(age, 3)
  7.  
    ## Model 4: wage ~ poly(age, 4)
  8.  
    ## Model 5: wage ~ poly(age, 5)
  9.  
    ## Res.Df RSS Df Sum of Sq F Pr(>F)
  10.  
    ## 1 2998 5022216
  11.  
    ## 2 2997 4793430 1 228786 143.59 <2e-16 ***
  12.  
    ## 3 2996 4777674 1 15756 9.89 0.0017 **
  13.  
    ## 4 2995 4771604 1 6070 3.81 0.0510 .
  14.  
    ## 5 2994 4770322 1 1283 0.80 0.3697
  15.  
    ## ---
  16.  
    ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

我們看到,_M_1 與二次模型  相比,p值  _M_2 實質上為零,這表明線性擬合是不夠的。 因此,我們可以得出結論,二次方或三次模型可能更適合於此數據,並且偏向於簡單模型。

我們也可以使用交叉驗證來選擇多項式次數。

 

在這里,我們實際上看到的最小交叉驗證誤差是針對4次多項式的,但是選擇3次或2次模型並不會造成太大損失。接下來,我們考慮預測個人是否每年收入超過25萬。

但是,概率的置信區間是不合理的,因為我們最終得到了一些負概率。為了生成置信區間,更有意義的是轉換對    預測。

繪制:

  1.  
    plot(age,I(wage> 250),xlim=ageLims ,type="n",ylim=c(0,.2))
  2.  
    lines(age.grid,pfit,lwd= 2, col="blue")
  3.  
    matlines(age.grid,se.bands,lwd= 1,col="blue",lty=3)

逐步回歸函數

在這里,我們需要拆分數據。 

table(cut(age, 4)) 
  1.  
    ##
  2.  
    ## (17 .9,33.5] (33.5,49] (49,64.5] (64.5,80.1]
  3.  
    ## 750 1399 779 72
  1.  
    fit <- lm(wage~cut(age, 4), data=Wage)
  2.  
    coef(summary(fit))

 

  1.  
    ## Estimate Std. Error t value Pr(>|t|)
  2.  
    ## (Intercept) 94.158 1.476 63.790 0.000e+00
  3.  
    ## cut(age, 4)(33.5,49] 24.053 1.829 13.148 1.982e-38
  4.  
    ## cut(age, 4)(49,64.5] 23.665 2.068 11.443 1.041e-29
  5.  
    ## cut(age, 4)(64.5,80.1] 7.641 4.987 1.532 1.256e-01

 

splines 樣條函數

在這里,我們將使用三次樣條。

由於我們使用的是三個結的三次樣條,因此生成的樣條具有六個基函數。 

  1.  
     
  2.  
    # # [1] 3000 6
  3.  
    dim(bs(age, df=6))
  4.  
     
  5.  
    # # [1] 3000 6
  6.  
    ## 25% 50% 75%
  7.  
    ## 33.75 42.00 51.00

擬合樣條曲線。

 

我們也可以擬合平滑樣條。在這里,我們擬合具有16個自由度的樣條曲線,然后通過交叉驗證選擇樣條曲線,從而產生6.8個自由度。

  1.  
     
  2.  
    fit2$df
  3.  
     
  4.  
    ## [1] 6.795
  5.  
    lines(fit, col='red', lwd=2)
  6.  
    lines(fit2, col='blue', lwd=1)
  7.  
    legend('topright', legend=c('16 DF', '6.8 DF'),
  8.  
    col=c('red','blue'), lty=1, lwd=2, cex=0.8)
  9.  
     

局部回歸

執行局部回歸。 

GAMs

現在,我們使用GAM通過年份,年齡和受教育程度的樣條來預測工資。由於這只是具有多個基本函數的線性回歸模型,因此我們僅使用  lm() 函數。

為了擬合更復雜的樣條曲線 ,我們需要使用平滑樣條曲線。

繪制這兩個模型

 

year 是線性的。我們可以創建一個新模型,然后使用ANOVA檢驗 。

  1.  
     
  2.  
    # # Analysis of Variance Table
  3.  
    ##
  4.  
    ## Model 1: wage ~ ns(age, 5) + education
  5.  
    ## Model 2: wage ~ year + s(age, 5) + education
  6.  
    ## Model 3: wage ~ s(year, 4) + s(age, 5) + education
  7.  
    ## Res.Df RSS Df Sum of Sq F Pr(>F)
  8.  
    ## 1 2990 3712881
  9.  
    ## 2 2989 3693842 1 19040 15.4 8.9e-05 ***
  10.  
    ## 3 2986 3689770 3 4071 1.1 0.35
  11.  
    ## ---
  12.  
    ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

似乎添加線性year 成分要比不添加線性  成分的GAM好得多。 

  1.  
     
  2.  
    # #
  3.  
    ## Deviance Residuals:
  4.  
    ## Min 1Q Median 3Q Max
  5.  
    ## -119.43 -19.70 -3.33 14.17 213.48
  6.  
    ##
  7.  
    ## (Dispersion Parameter for gaussian family taken to be 1236)
  8.  
    ##
  9.  
    ## Null Deviance: 5222086 on 2999 degrees of freedom
  10.  
    ## Residual Deviance: 3689770 on 2986 degrees of freedom
  11.  
    ## AIC: 29888
  12.  
    ##
  13.  
    ## Number of Local Scoring Iterations: 2
  14.  
    ##
  15.  
    ## Anova for Parametric Effects
  16.  
    ## Df Sum Sq Mean Sq F value Pr(>F)
  17.  
    ## s(year, 4) 1 27162 27162 22 2.9e-06 ***
  18.  
    ## s(age, 5) 1 195338 195338 158 < 2e-16 ***
  19.  
    ## education 4 1069726 267432 216 < 2e-16 ***
  20.  
    ## Residuals 2986 3689770 1236
  21.  
    ## ---
  22.  
    ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  23.  
    ##
  24.  
    ## Anova for Nonparametric Effects
  25.  
    ## Npar Df Npar F Pr(F)
  26.  
    ## (Intercept)
  27.  
    ## s(year, 4) 3 1.1 0.35
  28.  
    ## s(age, 5) 4 32.4 <2e-16 ***
  29.  
    ## education
  30.  
    ## ---
  31.  
    ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

在具有非線性關系的模型中,   我們可以再次確認year 對模型沒有貢獻。

接下來,我們 將局部回歸擬合GAM  。

在調用GAM之前,我們還可以使用局部回歸來創建交互項。

我們可以 繪制結果曲面圖  。


參考文獻 

1.R語言多元Logistic邏輯回歸 應用案例

2.面板平滑轉移回歸(PSTR)分析案例實現

3.matlab中的偏最小二乘回歸(PLSR)和主成分回歸(PCR)

4.R語言泊松Poisson回歸模型分析案例

5.R語言回歸中的Hosmer-Lemeshow擬合優度檢驗

6.r語言中對LASSO回歸,Ridge嶺回歸和Elastic Net模型實現

7.在R語言中實現Logistic邏輯回歸

8.python用線性回歸預測股票價格

9.R語言如何在生存分析與Cox回歸中計算IDI,NRI指標

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM