16

パッケージで関数gamを使用したい:mgcv

 x <- seq(0,60, len =600)
 y <- seq(0,1, len=600) 
 prova <- gam(y ~ s(x, bs='cr')

のノットを設定できs()ますか? 次に、スプ​​ラインが使用したノットがどこにあるかを知ることができますか? ありがとう!

4

1 に答える 1

33

設定kは正しい方法ですが、fx = TRUE間違いなく正しくありません。ペナルティなしで純粋な回帰スプラインを使用することを強制します。


結び目の位置

ペナルティ付き回帰スプラインの場合、次の場合に限り、正確な位置は重要ではありません。

  • k十分に大きい;
  • ノットの広がりは、適切で適度な範囲をカバーしています。

デフォルトでは:

  • 自然な 3 次回帰スプラインは分位数bs = 'cr'によってノットを配置します。
  • B スプライン ファミリ ( bs = 'bs'bs = 'ps'bs = 'ad') はノットを均等に配置します。

以下を比較してください。

library(mgcv)

## toy data
set.seed(0); x <- sort(rnorm(400, 0, pi))  ## note, my x are not uniformly sampled
set.seed(1); e <- rnorm(400, 0, 0.4)
y0 <- sin(x) + 0.2 * x + cos(abs(x))
y <- y0 + e

## fitting natural cubic spline
cr_fit <- gam(y ~ s(x, bs = 'cr', k = 20))
cr_knots <- cr_fit$smooth[[1]]$xp  ## extract knots locations

## fitting B-spline
bs_fit <- gam(y ~ s(x, bs = 'bs', k = 20))
bs_knots <- bs_fit$smooth[[1]]$knots  ## extract knots locations

## summary plot
par(mfrow = c(1,2))
plot(x, y, col= "grey", main = "natural cubic spline");
lines(x, cr_fit$linear.predictors, col = 2, lwd = 2)
abline(v = cr_knots, lty = 2)
plot(x, y, col= "grey", main = "B-spline");
lines(x, bs_fit$linear.predictors, col = 2, lwd = 2)
abline(v = bs_knots, lty = 2)

ここに画像の説明を入力

ノットの配置の違いがわかります。


独自のノットの位置を設定する:

knotsの引数を介して、カスタマイズしたノットの位置を指定することもできますgam()(そうです、ノットは ではなく に供給されs()ますgam())。たとえば、等間隔のノットをcr次のように作成できます。

xlim <- range(x)  ## get range of x
myfit <- gam(y ~ s(x, bs = 'cr', k =20),
         knots = list(x = seq(xlim[1], xlim[2], length = 20)))

これで、次のことがわかります。

my_knots <- myfit$smooth[[1]]$xp
plot(x, y, col= "grey", main = "my knots");
lines(x, myfit$linear.predictors, col = 2, lwd = 2)
abline(v = my_knots, lty = 2)

ここに画像の説明を入力

ただし、通常、自分でノットを設定する必要はありません。しかし、もしあなたがこれをしたいのなら、あなたは自分が何をしているのかを明確にしなければなりません. また、指定したノットの数は で一致する必要がありks()ます。

于 2016-10-18T16:06:14.877 に答える