6

我意识到这个板上有关于 B 样条线主题的帖子,但这些帖子实际上让我更加困惑,所以我想有人可以帮助我。

degree = 3我有从0到 1 的 x 值的模拟数据。我想为我的数据拟合一个三次样条 (使用 B 样条基础和 OLS 进行参数估计(我不是在寻找惩罚样条)。

我想我需要包中的bs功能,spline但我不太确定,我也不知道到底要喂什么。

我还想绘制生成的多项式样条曲线。

谢谢!

4

2 回答 2

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()您可以在公式中使用该函数来进行lmOLS 估计。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- 如果您对协变量进行了密集采样,这很好,但如果没有,则样条曲线可能看起来很奇怪,具有较长的线性部分。

更通用的解决方案是用于predict从模型中生成一个或多个协变量的新值的预测。在下面的代码中,我展示了如何为上面的模型执行此操作,预测 100 个均匀间隔的值x

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")

那产生

在此处输入图像描述

于 2013-04-05T16:36:22.167 回答
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)))

然后你可以使用Anovafrom 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

您可以使用 package.json 轻松绘制拟合样条曲线effects

plot(allEffects(mod))

这将输出:

在此处输入图像描述

也可以看看:

于 2015-04-06T19:57:51.117 回答