## 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)
OLS の見積もりが必要な場合bs()
は、数式で関数を使用します。ノット、多項式の次数などによって与えられる基底関数を提供します。lm
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
については、こちらをお読みください。
適合スプラインのプロットの作成
コメントでは、適合したスプラインを描画する方法について説明しています。1 つのオプションは、共変量に関してデータを並べ替えることです。これは、共変量が 1 つの場合は問題なく機能しますが、共変量が 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")
それが生み出す