[英]Multivariate regression splines in R
大多數人可能都熟悉splines中的bs
:
library(splines)
workingModel <- lm(mpg ~ factor(gear) + bs(wt, knots = 5) + hp, data = mtcars)
bs(mtcars$wt, knots = 4)
這使用b樣條作為單個變量權重,但您也可以使用多變量樣條:
bs(cbind(mtcars$wt,mtcars$hp), knots = 4)
但是這會產生一個矩陣,其行數是mtcars
,所以當我嘗試:
brokenModel <- lm(mpg ~ bs(cbind(mtcars$wt,mtcars$hp), knots = 4), data = mtcars)
我得到一個關於不同長度的錯誤。
我的問題是:如果模型的行數與結果變量不同,我如何在模型中使用多元樣條? 我是否將結果變量疊加在y <- c(y, y)
之上? 為什么多變量樣條曲線會產生額外的行?
謝謝。
在這種情況下,您不能使用splines::bs
,因為它嚴格用於構造單變量樣條曲線。 如果你做bs(mat)
,其中mat
是一個矩陣,它只是做bs(c(mat))
。 例如,
mat <- matrix(runif(8), 4, 2)
identical(bs(mat), bs(c(mat)))
# [1] TRUE
這解釋了為什么在執行bs(cbind(mtcars$wt,mtcars$hp)
時獲得雙倍行數bs(cbind(mtcars$wt,mtcars$hp)
。
要創建2D樣條曲線,最簡單的方法是創建加性樣條曲線:
lm(mpg ~ factor(gear) + bs(wt, knots = 5) + bs(hp, knots = 4), mtcars)
但這可能不是你想要的。 然后考慮互動:
model <- lm(mpg ~ factor(gear) + bs(wt, knots = 5):bs(hp, knots = 4), mtcars)
bs(wt, knots = 5):bs(hp, knots = 4)
在兩個設計矩陣之間形成行方式Kronecker積。 由於bs(wt, knots = 5)
是4列的矩陣,並且bs(hp, knots = 4)
是3列的矩陣,因此相互作用具有4 * 3 = 12列。
或者,考慮使用mgcv
包。 在mgcv
,可以通過兩種方式構建多變量樣條:
顯然你想要第二個,因為wt
和hp
有不同的單位。 要構造張量積樣條,我們可以使用:
library(mgcv)
fit <- gam(mpg ~ factor(gear)
+ s(wt, bs = 'cr', k = 4, fx = TRUE)
+ s(hp, bs = 'cr', k = 4, fx = TRUE)
+ ti(wt, hp, bs = 'cr', k = c(4, 4), d = c(1, 1), fx = TRUE),
data = mtcars)
在這里,我特意設置了fx = TRUE
來禁用懲罰性回歸。
我不想寫一篇廣泛的答案來介紹mgcv
。 關於s
, ti
和gam
如何工作,只需閱讀文檔。 如果你需要在理論上彌合差距,那就抓住Simon Wood在2006年出版的書: 廣義增材模型:R的介紹 。
mgcv
用法的一個實際例子?
我得到了縱向系列數據的Cubic樣條方法的答案,這可能有助於您熟悉mgcv
。 但作為介紹性示例,它僅顯示如何使用單變量樣條曲線。 幸運的是,這也是關鍵。 張量乘積樣條由單變量樣條構成。
我與mgcv
相關的其他答案更多的是理論方面; 雖然並非所有與spline
相關的答案都是參考mgcv
。 所以這個問題和答案是我能在這個階段給你的最好的。
尺度不變的張量積樣條是否等同於徑向平滑或者是各向同性的薄點樣條?
徑向平滑相當於薄板樣條,因為薄板樣條的基函數是徑向的。 這就是為什么它是各向同性的並且可以用於空間回歸。
張量積樣條是尺度不變的,因為它構造為單變量樣條基的(成對)乘法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.