我意识到在这个主板上有关于B-Splines主题的帖子,但这些帖子实际上让我更加困惑,所以我觉得有人可以帮助我。
我已经模拟了从0到1的x值的数据。我想在我的数据中拟合一个三次样条(degree = 3
),结点为0,0.1,0.2,...,0.9 ,1。我也想使用B-Spline基础和OLS进行参数估计(我不是在寻找惩罚样条)。
我想我需要bs
包中的spline
函数,但我不太确定,而且我也不知道究竟要提供什么。
我还想绘制得到的多项式样条曲线。
谢谢!
答案 0 :(得分:10)
## simulate some data - from mgcv::magic
set.seed(1)
n <- 400
x <- 0:(n-1)/(n-1)
f <- 0.2*x^11*(10*(1-x))^6+10*(10*x)^3*(1-x)^10
y <- f + rnorm(n, 0, sd = 2)
## load the splines package - comes with R
require(splines)
您可以使用公式中的bs()
函数lm
,因为您需要OLS估算值。 bs
提供由结,多项式等等给出的基函数。
mod <- lm(y ~ bs(x, knots = seq(0.1, 0.9, by = 0.1)))
您可以将其视为线性模型。
> anova(mod)
Analysis of Variance Table
Response: y
Df Sum Sq Mean Sq F value Pr(>F)
bs(x, knots = seq(0.1, 0.9, by = 0.1)) 12 2997.5 249.792 65.477 < 2.2e-16 ***
Residuals 387 1476.4 3.815
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
关于结位置的一些指示。 bs
有一个参数Boundary.knots
,默认为Boundary.knots = range(x)
- 因此当我指定上面的knots
参数时,我没有包含边界结。
阅读?bs
了解详情。
在评论中我讨论了如何绘制拟合样条曲线。一种选择是根据协变量对数据进行排序。这适用于单个协变量,但不需要适用于2个或更多个协变量。另一个问题是,您只能在观察到的x
值处评估拟合样条曲线 - 如果您对协变量进行了密集采样,则此方法很好,但如果没有,则样条曲线可能看起来很奇,具有长线性截面。 / p>
更通用的解决方案是使用predict
从模型生成协变量或协变量的新值的预测。在下面的代码中,我将展示如何为上述模型执行此操作,预测x
范围内的100个均匀间隔值。
pdat <- data.frame(x = seq(min(x), max(x), length = 100))
## predict for new `x`
pdat <- transform(pdat, yhat = predict(mod, newdata = pdat))
## now plot
ylim <- range(pdat$y, y) ## not needed, but may be if plotting CIs too
plot(y ~ x)
lines(yhat ~ x, data = pdat, lwd = 2, col = "red")
产生
答案 1 :(得分:2)
根据答案中的示例,绘制拟合样条曲线的简单方法是使用effects
包。
## simulate some data - from mgcv::magic
set.seed(1)
n <- 400
x <- 0:(n-1)/(n-1)
f <- 0.2*x^11*(10*(1-x))^6+10*(10*x)^3*(1-x)^10
y <- f + rnorm(n, 0, sd = 2)
## load the splines package - comes with R
require(splines)
require(car)
require(effects)
## estimate model
mod <- lm(y ~ bs(x, knots = seq(0.1, 0.9, by = 0.1)))
然后您可以使用Anova
中的car
:
> Anova(mod)
Anova Table (Type II tests)
Response: y
Sum Sq Df F value Pr(>F)
bs(x, knots = seq(0.1, 0.9, by = 0.1)) 2997.5 12 65.477 < 2.2e-16 ***
Residuals 1476.4 387
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
您可以使用effects
包轻松绘制拟合样条曲线。
plot(allEffects(mod))
哪个会输出:
另见: