多項式和正交多項式
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^k
和x^(k+1)
之間發生的數值秩不足,poly
也將停止抱怨:
if (QR$rank < degree)
stop("'degree' must be less than number of unique points")
但錯誤信息是不是在這種情況下信息。而且,這不一定是錯誤;它可以是一個警告然後poly
可以重置degree
到rank
繼續。也許R核心可以改善這個位?
您的試錯法顯示您無法構造一個多於25度的多項式。您可以先檢查length(unique(q))
。如果你的學位比這還小,但仍然會引發錯誤,你肯定知道這是由於數字等級不足造成的。
但我想說的是,一個多於3-5度的多項式是沒有用的!關鍵的原因是Runge's phenomenon。根據統計術語:高階多項式總是嚴重過度填充數據!。不要天真地認爲,因爲正交多項式在數值上比原始多項式更穩定,所以可以消除龍格效應。不,度數爲k
的多項式形成一個向量空間,所以無論您用於表示的基礎是什麼,它們都具有相同的跨度!
樣條曲線:分段三次多項式及其在迴歸使用
多項式迴歸的確是有益的,但我們經常要分段多項式。最流行的選擇是立方樣條。像多項式,有不同的表示,有很多表示的爲花鍵:
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))
感謝您非常深入的答覆!我知道高階多項式不適合,這實際上是我正在編寫的腳本的目標之一!也就是說,顯示一個非常高複雜度的假設函數如何比低複雜度h推廣得更差。爲了讓這個演示儘可能深入,我試圖得到一個約100階聚合,以適應由立方函數生成的「噪聲」數據集。然後執行「標準」迴歸,並顯示它比100階次更好地進行外推。 – CenturionSC2