很抱歉,如果这个问题是微不足道的,但我正试图找出如何在R中绘制某种类型的自然三次样条(NCS),这完全让我无法理解。
在一个前一个问题中,我学习了如何在ggplot中绘制ns()命令生成的NCS,但我感兴趣的是如何绘制一个稍微不同的NCS在二次样条包中生成的smooth.Pspline命令。据我所知,这是为给定数据集自动选择适当的平滑惩罚的唯一包。
理想情况下,我可以将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)我想将"lm“公式替换为Smoth.P样条的功能。我做了一点点谷歌,并找到了一个解决方案非常类似的B样条函数smooth.spline,写的哈德利。但我还没有完全适应smooth.Pspline。有人有这方面的经验吗?
非常感谢!
发布于 2013-10-10 01:03:49
您只需检查predict.smooth.Pspline是如何返回预测值的。
在stat_smooth的内部工作中,调用predictdf来创建平滑的行。predictdf是ggplot2 (定义为这里)的内部(非导出)函数,是一个标准的S3方法。
sm.spline返回类smooth.Pspline的对象,因此为了使stat_smooth工作,需要为类smooth.Pspline为predictdf创建方法。
因此,以下内容将起作用。
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作为比较来拟合一个样条)。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'))

https://stackoverflow.com/questions/19284897
复制相似问题