大多数人可能都熟悉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)
之上?为什么多变量样条曲线会产生额外的行?
感谢。
答案 0 :(得分:10)
在这种情况下,您不能使用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)
正在两个设计矩阵之间形成行式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
的工作方式,请阅读文档。如果你需要在理论上弥合差距,那就抓住2006年出版的Simon Wood的书:广义增材模型:R 的介绍。
mgcv
用法的实际示例?
我得到了答案Cubic spline method for longitudinal series data,可能有助于您熟悉mgcv
。但作为介绍性示例,它仅显示如何使用单变量样条曲线。幸运的是,这也是关键。张量乘积样条由单变量样条构成。
我与mgcv
相关的其他答案更多的是理论方面;虽然并非所有与spline
相关的答案都引用了mgcv
。那个问题&amp;答案是我现阶段能给你的最佳答案。
尺度不变张量积样条是否等同于径向平滑或者是各向同性的薄点样条?
径向平滑相当于薄板样条,因为薄板样条的基函数是径向的。这就是为什么它是各向同性的,可以用于空间回归。
张量积样条是尺度不变的,因为它构造为单变量样条基的(成对)乘法。