在 R 中获取 smooth.splines 的公式
Getting Formulas for smooth.splines in R
我已经使用 stats::smooth.spline 函数来拟合 60 (x, y) 对的数据集,现在我需要访问可以为我生成预测的公式,同时我可以访问该模型。不幸的是,文档 here 无法帮助我解决这个问题(而且看起来有点过时了)。
我的理解是smooth.spline提供了一个函数g: Reals -> Reals
,其中g
是满足g = argmin(g) spar * SUM(MSE) + lambda * Integral [g''(x)]^2 dx
的三次多项式。如果是这种情况,我很想看到 g(x) = x^3 + 5x^2 + 10x + 15 的输出(尽管生成的对象似乎只包含 spar 和 lambda)。
也有可能 smooth.spline 沿着数据的不同部分形成多个样条,在这种情况下,我想要的输出类似于:
- 在 x=0 到 x=2 上,预测 y = 3x^3 + 2x^2 + x
- 在 x=2 到 x=3.5 上,预测 y = x^3 + 2x^2 + 3x + 12
- ......
下面是一些示例代码:
dataset <- data.frame(x = c(1,2,3,4,5,6,7), y = c(10,8,4,6,8,11,15))
spline_result <- smooth.spline(dataset$x, y = dataset$y)
# Plotting the spline looks like a parabola centered near x=3.5 y=5
# so I'd expect something like g(x) = k *(x - 3.5) ^ 2 + 5
# where k is some constant
附加信息:我是 运行 R 版本 4.1.2 2021-11-01 Bird Hippie with packageVersion("stats") 4.1.2
感谢您的帮助!
smooth.spline
函数生成一个“自然样条”,每个 x
值都有节点。这意味着它是 x
范围之外的线性函数,并且是每个值之间的三次多项式。因此,在您的情况下,您将有 2 个线性方程和 6 个三次方程。这通常不是处理此类函数的有用方法,因为系数通常几乎相互抵消,因此当您尝试对其求值时可能会出现很多舍入误差。
如果您只是想在不在原始 x
向量中的各个点处评估样条曲线,请使用 predict()
函数,例如
dataset <- data.frame(x = c(1,2,3,4,5,6,7), y = c(10,8,4,6,8,11,15))
spline_result <- smooth.spline(dataset$x, y = dataset$y)
newx <- seq(0, 10, len = 100)
newvals <- predict(spline_result, x = newx)
plot(newvals, type = 'l')
points(dataset)
由 reprex package (v2.0.1)
于 2021-12-09 创建
predict()
函数通过避免多项式的幂基来避免舍入误差。
如果您真的想要多项式系数,获得它们的一种方法是对预测使用多项式回归。例如,要查找 3 和 4 之间的段的系数,您可以使用
lm(y ~ poly(x, degree = 3, raw = TRUE), data = predict(spline_result, x = seq(3, 4, len = 10)))
#>
#> Call:
#> lm(formula = y ~ poly(x, degree = 3, raw = TRUE), data = predict(spline_result,
#> x = seq(3, 4, len = 10)))
#>
#> Coefficients:
#> (Intercept) poly(x, degree = 3, raw = TRUE)1
#> 26.3378 -14.9943
#> poly(x, degree = 3, raw = TRUE)2 poly(x, degree = 3, raw = TRUE)3
#> 3.2874 -0.2059
由 reprex package (v2.0.1)
于 2021-12-09 创建
这给出多项式 26.3378 -14.9943 x + 3.2874 x^2 -0.2059 x^3。
我已经使用 stats::smooth.spline 函数来拟合 60 (x, y) 对的数据集,现在我需要访问可以为我生成预测的公式,同时我可以访问该模型。不幸的是,文档 here 无法帮助我解决这个问题(而且看起来有点过时了)。
我的理解是smooth.spline提供了一个函数g: Reals -> Reals
,其中g
是满足g = argmin(g) spar * SUM(MSE) + lambda * Integral [g''(x)]^2 dx
的三次多项式。如果是这种情况,我很想看到 g(x) = x^3 + 5x^2 + 10x + 15 的输出(尽管生成的对象似乎只包含 spar 和 lambda)。
也有可能 smooth.spline 沿着数据的不同部分形成多个样条,在这种情况下,我想要的输出类似于:
- 在 x=0 到 x=2 上,预测 y = 3x^3 + 2x^2 + x
- 在 x=2 到 x=3.5 上,预测 y = x^3 + 2x^2 + 3x + 12
- ......
下面是一些示例代码:
dataset <- data.frame(x = c(1,2,3,4,5,6,7), y = c(10,8,4,6,8,11,15))
spline_result <- smooth.spline(dataset$x, y = dataset$y)
# Plotting the spline looks like a parabola centered near x=3.5 y=5
# so I'd expect something like g(x) = k *(x - 3.5) ^ 2 + 5
# where k is some constant
附加信息:我是 运行 R 版本 4.1.2 2021-11-01 Bird Hippie with packageVersion("stats") 4.1.2
感谢您的帮助!
smooth.spline
函数生成一个“自然样条”,每个 x
值都有节点。这意味着它是 x
范围之外的线性函数,并且是每个值之间的三次多项式。因此,在您的情况下,您将有 2 个线性方程和 6 个三次方程。这通常不是处理此类函数的有用方法,因为系数通常几乎相互抵消,因此当您尝试对其求值时可能会出现很多舍入误差。
如果您只是想在不在原始 x
向量中的各个点处评估样条曲线,请使用 predict()
函数,例如
dataset <- data.frame(x = c(1,2,3,4,5,6,7), y = c(10,8,4,6,8,11,15))
spline_result <- smooth.spline(dataset$x, y = dataset$y)
newx <- seq(0, 10, len = 100)
newvals <- predict(spline_result, x = newx)
plot(newvals, type = 'l')
points(dataset)
由 reprex package (v2.0.1)
于 2021-12-09 创建predict()
函数通过避免多项式的幂基来避免舍入误差。
如果您真的想要多项式系数,获得它们的一种方法是对预测使用多项式回归。例如,要查找 3 和 4 之间的段的系数,您可以使用
lm(y ~ poly(x, degree = 3, raw = TRUE), data = predict(spline_result, x = seq(3, 4, len = 10)))
#>
#> Call:
#> lm(formula = y ~ poly(x, degree = 3, raw = TRUE), data = predict(spline_result,
#> x = seq(3, 4, len = 10)))
#>
#> Coefficients:
#> (Intercept) poly(x, degree = 3, raw = TRUE)1
#> 26.3378 -14.9943
#> poly(x, degree = 3, raw = TRUE)2 poly(x, degree = 3, raw = TRUE)3
#> 3.2874 -0.2059
由 reprex package (v2.0.1)
于 2021-12-09 创建这给出多项式 26.3378 -14.9943 x + 3.2874 x^2 -0.2059 x^3。