4

この質問が些細な場合は申し訳ありませんが、R で特定のタイプの自然な 3 次スプライン (NCS) をプロットする方法を理解しようとしていますが、完全に理解できませんでした。

以前の質問で、 ns() コマンドによって生成された NCS を ggplot でプロットする方法を学びましたが、 psplineパッケージの Smooth.Pspline コマンドで生成されたわずかに異なる NCS をプロットする方法に興味があります。私の知る限り、これは特定のデータセットに対して CV によって適切な平滑化ペナルティを自動的に選択する唯一のパッケージです。

理想的には、ggplot2 の stat_smooth レイヤーへのメソッドとして Smooth.Pspline を提供できます。私の現在のコードは次のようなものです:

plot <- ggplot(data_plot, aes(x=age, y=wOBA, color=playerID, group=playerID))
plot <- plot + stat_smooth(method = lm, formula = y~ns(x,4),se=FALSE)

「lm」式を Smooth.Pspline の機能に置き換えたいと思います。少しグーグルで調べてみたところ、Hadley によって書かれた非常によく似た B スプライン関数 Smooth.splineの解決策が見つかりました。しかし、これを Smooth.Pspline に完全に適応させることはできませんでした。誰もこれを経験していますか?

本当にありがとう!

4

1 に答える 1

8

predict.smooth.Pspline予測値がどのように返されるかを調べるだけです。

の内部動作でstat_smoothpredictdf、平滑化された線を作成するために呼び出されます。(ここで定義されています)predictdfの内部(エクスポートされていない)関数であり、標準のS3メソッドです。ggplot2

sm.splineは class のオブジェクトを返すsmooth.Psplineため、 forを機能させるには for for class のstat_smoothメソッドを作成する必要があります。predictdfsmooth.Pspline

そのため、次のように動作します。

smP <- function(formula,data,...){
  M <- model.frame(formula, data)
  sm.spline(x =M[,2],y =M[,1])

}
# an s3 method for predictdf (called within stat_smooth)
predictdf.smooth.Pspline <- function(model, xseq, se, level) {
  pred <- predict(model, xseq)
  data.frame(x = xseq, y = c(pred))
}

例 (mgcv::gam比較として使用してフィットした pspline を使用)。mgcv素晴らしく、フィッティング方法とスムージング スプラインの選択に優れた柔軟性を提供します (ただし、CV ではなく、GCV/UBRE/REML/ML のみ)

d <- ggplot(mtcars, aes(qsec, wt))
d + geom_point() +  stat_smooth(method = smP, se= FALSE, colour='red', formula = y~x) + 
stat_smooth(method = 'gam', colour = 'blue', formula = y~s(x,bs='ps'))

ここに画像の説明を入力

于 2013-10-10T01:03:49.980 に答える