抱歉,如果这个问题无关紧要,但我试图弄清楚如何在R中绘制某种类型的自然三次样条(NCS),这完全使我难以理解。
在previous question中,我学习了如何在ggplot中绘制由ns()命令生成的NCS,但是我对如何在pspline包中绘制一个稍有不同的NCS生成的smooth.Pspline命令感兴趣。据我所知,这是唯一为给定数据集按CV自动选择适当的平滑代价的软件包。
理想情况下,我能够提供sgp.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”公式。我做了一些谷歌搜索,发现了一个非常相似的由Hadley编写的B样条函数smooth.spline的solution。但是我无法完美地适应这一问题。有任何人对此有经验吗?
非常感谢!
最佳答案
您只需要检查predict.smooth.Pspline
如何返回预测值。
在stat_smooth
的内部工作方式中,调用predictdf
创建平滑线。 predictdf
是ggplot2
的内部(非导出)功能(定义为here),它是标准的S3方法。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'))