2016-10-01 137 views
3

我想對R中的一組數據擬合(非常)高階迴歸,但poly()函數的階數爲25。R(或其他選擇?)中的高(或非常高)階多項式迴歸

對於本申請我需要的100的範圍內的以120

model <- lm(noisy.y ~ poly(q,50)) 
# Error in poly(q, 50) : 'degree' must be less than number of unique points 
model <- lm(noisy.y ~ poly(q,30)) 
# Error in poly(q, 30) : 'degree' must be less than number of unique points 
model <- lm(noisy.y ~ poly(q,25)) 
# OK 

回答

7

多項式和正交多項式

poly(x)具有用於沒有硬編碼限制。但是,在實踐中有兩個數值限制。

  • 基礎函數是在x值的唯一位置上構建的。度爲k的多項式具有k + 1基礎和係數。 poly生成沒有截距項的基礎,因此degree = k意味着k基礎和k係數。如果有n獨特的x值,則必須滿足k <= n,否則僅存在不足以構造多項式的信息。內部poly(),以下行檢查此條件:

    if (degree >= length(unique(x))) 
        stop("'degree' must be less than number of unique points") 
    
  • 相關及x^(k+1)之間x^k被越來越接近爲1,k增加。這種接近速度當然取決於x值。 poly首先生成普通多項式基,然後執行QR分解以找到正交跨度。如果x^kx^(k+1)之間發生的數值秩不足,poly也將停止抱怨:

    if (QR$rank < degree) 
        stop("'degree' must be less than number of unique points") 
    

    但錯誤信息是不是在這種情況下信息。而且,這不一定是錯誤;它可以是一個警告然後poly可以重置degreerank繼續。也許R核心可以改善這個位?

您的試錯法顯示您無法構造一個多於25度的多項式。您可以先檢查length(unique(q))。如果你的學位比這還小,但仍然會引發錯誤,你肯定知道這是由於數字等級不足造成的。

但我想說的是,一個多於3-5度的多項式是沒有用的!關鍵的原因是Runge's phenomenon。根據統計術語:高階多項式總是嚴重過度填充數據!。不要天真地認爲,因爲正交多項式在數值上比原始多項式更穩定,所以可以消除龍格效應。不,度數爲k的多項式形成一個向量空間,所以無論您用於表示的基礎是什麼,它們都具有相同的跨度!


樣條曲線:分段三次多項式及其在迴歸使用

多項式迴歸的確是有益的,但我們經常要分段多項式。最流行的選擇是立方樣條。像多項式,有不同的表示,有很多表示的爲花鍵:

  • 截短功率基礎
  • 自然三次樣條基
  • B樣條基

B樣條基是數字上最穩定的,因爲它具有緊湊的支持。結果,協方差矩陣X'X被綁定,因此求解正規方程(X'X) b = (X'y)非常穩定。

在R中,我們可以使用splines函數中的bs函數(R基礎包之一)來得到B樣條基。對於bs(x),自由度df唯一的數值約束是我們不能有比length(unique(x))更多的基數。

我不知道你的數據是什麼樣子,但也許你可以試試

library(splines) 
model <- lm(noisy.y ~ bs(q, df = 10)) 

處罰平滑/迴歸樣條

迴歸樣條仍可能過度擬合數據,如果你不斷增加自由度。最好的模式似乎是選擇最好的自由度。

一個很好的方法是使用懲罰平滑樣條或懲罰迴歸樣條,以便對模型估計和自由度選擇(即「平滑度」)進行整合。

smooth.spline函數在stats包中可以兼得。與其名稱似乎暗示的不同,大部分時間只是擬合懲罰迴歸樣條而不是平滑樣條。請閱讀?smooth.spline瞭解更多信息。爲了您的資料,您可以嘗試

fit <- smooth.spline(q, noisy.y) 

(注意,smooth.spline有沒有公式界面。)


加懲罰的鍵槽和廣義加法模型(GAM)

一旦我們有不止一個協變量,我們需要可加模型來克服「維度的詛咒」,同時又是合理的。根據平滑功能的表示,GAM可以有各種形式。在我看來,最受歡迎的是由R推薦的mgcv包。

,您仍然可以安裝一個單變量回歸懲罰樣條mgcv

library(mgcv) 
fit <- gam(noisy.y ~ s(q, bs = "cr", k = 10)) 
+0

感謝您非常深入的答覆!我知道高階多項式不適合,這實際上是我正在編寫的腳本的目標之一!也就是說,顯示一個非常高複雜度的假設函數如何比低複雜度h推廣得更差。爲了讓這個演示儘可能深入,我試圖得到一個約100階聚合,以適應由立方函數生成的「噪聲」數據集。然後執行「標準」迴歸,並顯示它比100階次更好地進行外推。 – CenturionSC2