PDG*_*PDG 7 regression r spline lm bspline
我使用的是一组从去点(-5,5)到(0,0)和(5,5)在"对称V形".我正在使用适合"V形"样条的模型lm()和bs()函数:
lm(formula = y ~ bs(x, degree = 1, knots = c(0)))
Run Code Online (Sandbox Code Playgroud)
当我预测结果predict()并绘制预测线时,我得到"V形" .但是,当我查看模型估计时coef(),我看到了我没想到的估计.
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.93821 0.16117 30.639 1.40e-09 ***
bs(x, degree = 1, knots = c(0))1 -5.12079 0.24026 -21.313 2.47e-08 ***
bs(x, degree = 1, knots = c(0))2 -0.05545 0.21701 -0.256 0.805
Run Code Online (Sandbox Code Playgroud)
我期望-1第一部分的+1系数和第二部分的系数.我必须以不同的方式解释估算吗?
如果我lm()手动填充函数中的结,而不是我得到这些系数:
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.18258 0.13558 -1.347 0.215
x -1.02416 0.04805 -21.313 2.47e-08 ***
z 2.03723 0.08575 23.759 1.05e-08 ***
Run Code Online (Sandbox Code Playgroud)
这还差不多.Z(结点)对x的相对变化是〜+ 1
我想了解如何解释bs()结果.我已经检查过,手动和bs模型预测值完全相同.
李哲源*_*李哲源 19
我期望
-1第一部分的+1系数和第二部分的系数.
我认为你的问题实际上是什么是B样条函数.如果您想了解系数的含义,您需要知道样条函数的基函数.请参阅以下内容:
library(splines)
x <- seq(-5, 5, length = 100)
b <- bs(x, degree = 1, knots = 0) ## returns a basis matrix
str(b) ## check structure
b1 <- b[, 1] ## basis 1
b2 <- b[, 2] ## basis 2
par(mfrow = c(1, 2))
plot(x, b1, type = "l", main = "basis 1: b1")
plot(x, b2, type = "l", main = "basis 2: b2")
Run Code Online (Sandbox Code Playgroud)
注意:
b1;(0, 1);您可以从B样条的定义中获得B样条的(递归)表达式.0度的B样条是最基础的类,而
(对不起,我离开了话题......)
使用B样条的线性回归:
y ~ bs(x, degree = 1, knots = 0)
Run Code Online (Sandbox Code Playgroud)
正在做:
y ~ b1 + b2
Run Code Online (Sandbox Code Playgroud)
现在,你应该能够理解你得到什么系数,这意味着样条函数是:
-5.12079 * b1 - 0.05545 * b2
Run Code Online (Sandbox Code Playgroud)
在汇总表中:
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.93821 0.16117 30.639 1.40e-09 ***
bs(x, degree = 1, knots = c(0))1 -5.12079 0.24026 -21.313 2.47e-08 ***
bs(x, degree = 1, knots = c(0))2 -0.05545 0.21701 -0.256 0.805
Run Code Online (Sandbox Code Playgroud)
你可能想知道为什么系数b2不重要.那么,比较你的y和b1:你y是 对称的V形,b1而是反对称的V形.如果先乘-1到b1,并乘以5重新调整它,(这说明系数-5为b1),您能得到什么?很好的比赛,对吗?所以没有必要b2.
不过,如果你y是不对称的,运行低谷(-5,5)到(0,0),然后(5,10),然后你会发现,系数b1和b2均显著.我认为另一个答案已经给了你这样的例子.
这里证明了拟合B样条对分段多项式的重新参数化:将拟合回归样条重新拟合为分段多项式和导出多项式系数.
rbm*_*rbm 16
一个带单结的一度样条的简单示例和对估计系数的解释,以计算拟合线的斜率:
library(splines)
set.seed(313)
x<-seq(-5,+5,len=1000)
y<-c(seq(5,0,len=500)+rnorm(500,0,0.25),
seq(0,10,len=500)+rnorm(500,0,0.25))
plot(x,y, xlim = c(-6,+6), ylim = c(0,+8))
fit <- lm(formula = y ~ bs(x, degree = 1, knots = c(0)))
x.predict <- seq(-2.5,+2.5,len = 100)
lines(x.predict, predict(fit, data.frame(x = x.predict)), col =2, lwd = 2)
Run Code Online (Sandbox Code Playgroud)
制作情节
因为我们拟合了一个样条曲线degree=1(即直线)和一个结点x=0,我们有两条线用于x<=0和x>0.
系数是
> round(summary(fit)$coefficients,3)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.014 0.021 241.961 0
bs(x, degree = 1, knots = c(0))1 -5.041 0.030 -166.156 0
bs(x, degree = 1, knots = c(0))2 4.964 0.027 182.915 0
Run Code Online (Sandbox Code Playgroud)
可以使用结(我们指定的)和边界结(解释数据的最小值/最大值)将其转换为每条直线的斜率x=0:
# two boundary knots and one specified
knot.boundary.left <- min(x)
knot <- 0
knot.boundary.right <- max(x)
slope.1 <- summary(fit)$coefficients[2,1] /(knot - knot.boundary.left)
slope.2 <- (summary(fit)$coefficients[3,1] - summary(fit)$coefficients[2,1]) / (knot.boundary.right - knot)
slope.1
slope.2
> slope.1
[1] -1.008238
> slope.2
[1] 2.000988
Run Code Online (Sandbox Code Playgroud)