4

对不起,如果这个问题是微不足道的,但我试图弄清楚如何在 R 中绘制某种类型的自然三次样条(NCS)并且它完全让我无法理解。

上一个问题中,我学习了如何在 ggplot 中绘制由 ns() 命令生成的 NCS,但我对如何绘制稍微不同的 NCS 感兴趣,这些 NCS 在pspline包中生成了 smooth.Pspline 命令。据我所知,这是唯一一个通过 CV 为给定数据集自动选择适当平滑惩罚的包。

理想情况下,我将能够提供 smooth.Pspline 作为 ggplot2 中 stat_smooth 层的方法。我目前的代码是这样的:

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)

我想用 smooth.Pspline 的功能替换“lm”公式。我做了一点谷歌搜索,找到了一个非常相似的 B 样条函数 smooth.spline 的解决方案,由 Hadley 编写。但我一直无法将其完美地调整为 smooth.Pspline。这个事情谁有经验?

非常感谢!

4

1 回答 1

8

您只需要检查如何predict.smooth.Pspline返回预测值。

在 的内部工作中stat_smoothpredictdf调用 , 来创建平滑线。是(在此处定义)predictdf的内部(非导出)函数,它是标准 S3 方法。ggplot2

sm.spline返回一个类的对象smooth.Pspline,因此为了stat_smooth工作,您需要predictdf为类创建方法smooth.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 回答