R中的多元回归样条
Multivariate regression splines in R
大多数人可能都熟悉 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)
时得到双倍行数。
要创建二维样条,最简单的方法是创建附加样条:
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)
在两个设计矩阵之间形成 row-wise 克罗内克积。由于 bs(wt, knots = 5)
是 4 列的矩阵,而 bs(hp, knots = 4)
是 3 列的矩阵,因此交互项有 4 * 3 = 12 列。
或者,考虑使用 mgcv
包。在mgcv
中,多元样条可以通过两种方式构造:
- 各向同性 thin-plate 样条线;
- 缩放不变张量乘积样条。
显然你想要第二个,因为 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 简介。
A practical example of mgcv
usage?
我有一个答案 ,这可能会帮助您熟悉 mgcv
。但作为介绍性示例,它仅展示了如何使用单变量样条。幸运的是,这也是关键。张量乘积样条由单变量样条构成。
我关于 mgcv
的其他回答更多是理论方面的;虽然并非我所有与 spline
相关的回答都参考了 mgcv
。所以这个问题和答案是现阶段我能给你的最好的。
Would the scale invariant tensor product splines be equivalent to radial smoothing or would that be the isotropic thin-place splines?
径向平滑等效于 thin-plate 样条,因为 thin-plate 样条的基函数是径向的。这就是为什么它是各向同性的并且可以用于空间回归。
张量乘积样条是尺度不变的,因为它被构造为单变量样条基的(成对)乘法。
大多数人可能都熟悉 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)
时得到双倍行数。
要创建二维样条,最简单的方法是创建附加样条:
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)
在两个设计矩阵之间形成 row-wise 克罗内克积。由于 bs(wt, knots = 5)
是 4 列的矩阵,而 bs(hp, knots = 4)
是 3 列的矩阵,因此交互项有 4 * 3 = 12 列。
或者,考虑使用 mgcv
包。在mgcv
中,多元样条可以通过两种方式构造:
- 各向同性 thin-plate 样条线;
- 缩放不变张量乘积样条。
显然你想要第二个,因为 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 简介。
A practical example of
mgcv
usage?
我有一个答案 mgcv
。但作为介绍性示例,它仅展示了如何使用单变量样条。幸运的是,这也是关键。张量乘积样条由单变量样条构成。
我关于 mgcv
的其他回答更多是理论方面的;虽然并非我所有与 spline
相关的回答都参考了 mgcv
。所以这个问题和答案是现阶段我能给你的最好的。
Would the scale invariant tensor product splines be equivalent to radial smoothing or would that be the isotropic thin-place splines?
径向平滑等效于 thin-plate 样条,因为 thin-plate 样条的基函数是径向的。这就是为什么它是各向同性的并且可以用于空间回归。
张量乘积样条是尺度不变的,因为它被构造为单变量样条基的(成对)乘法。