大多数人可能都熟悉bs
splines:
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)
.
要创建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)
是在形成两个设计矩阵之间按行克罗内克积.由于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
.所以这个问题和答案是我能在这个阶段给你的最好的.
尺度不变的张量积样条是否等同于径向平滑或者是各向同性的薄点样条?
径向平滑相当于薄板样条,因为薄板样条的基函数是径向的.这就是为什么它是各向同性的并且可以用于空间回归.
张量积样条是尺度不变的,因为它构造为单变量样条基的(成对)乘法.