0

Rのmgcvパッケージを使用して、GAMモデルをデータに適合させています。一部の予測子は循環しているため、周期的スムーザーを使用しています。クロス検証で、ホールドアウトデータセットにトレーニングデータの範囲外の値が含まれる可能性があるという問題が発生しました。gamパッケージはスムースのノットを自動的に選択するため、これによりエラーが発生します(エラーの説明については、@ nograpesと@DWinに感謝します)

周期的な滑らかさで外側の結び目を手動で指定するにはどうすればよいですか?

サンプルコード

最初のブロックはいくつかのデータを生成します。

library(mgcv)

set.seed(223) # produces error.
# set.seed(123) # no error.

# generate data:
x <- runif(100,min=-pi,max=pi)
linPred <- 2*cos(x) # value of the linear predictor
theta <- 1 / (1 + exp(-linPred)) # 
y <- rbinom(100,1,theta)
plot(x,theta)
df <- data.frame(x=x,y=y)

次のブロックは、GAMモデルを周期的なスムーズに適合させます。

gamFit <- gam(y ~ s(x,bs="cc",k=5),data=df,family=binomial())
summary(gamFit)
plot(gamFit)

s(x,bs="cc",k=5)それはあなたがいくつかの結び目を設定することができると私が確信しているより滑らかな用語の仕様のどこかにあるでしょう、しかしこれはグーグルの助けからgamまたはグーグルから私には明らかではありません。

このブロックはいくつかのホールドアウトデータに適合し、シードを上記のように設定するとエラーが発生します。

# predict y values for new data:
x.2 <- runif(100,min=-pi,max=pi)
df.2 <- data.frame(x=x.2)
predict(gamFit,newdata=df.2)

理想的には、外側の結び目を設定しgam、残りを選択するだけです。

この質問がCrossValidatedの方がSOよりも優れている場合はお詫びします。

4

1 に答える 1

3

これを試して:

gamFit <- gam(y ~ s(x,bs="cc",k=5), 
              knots=list( x=seq(-pi,pi, len=5) ), 
              data=df, family=binomial())

実例は次の場所にあります。

?smooth.construct.cr.smooth.spec 

このコードのテストで、の「k」パラメータがに渡される「x」値s()の「len」パラメータと一致する必要があることを学びました。ノット引数がに渡されると間違って考えました。seq()knots()s()

于 2012-08-01T16:25:54.757 に答える