首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >smooth.Pspline包装器用于stat_smooth (在ggplot2中)

smooth.Pspline包装器用于stat_smooth (在ggplot2中)
EN

Stack Overflow用户
提问于 2013-10-10 00:08:57
回答 1查看 2.2K关注 0票数 4

很抱歉,如果这个问题是微不足道的,但我正试图找出如何在R中绘制某种类型的自然三次样条(NCS),这完全让我无法理解。

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

理想情况下,我可以将smooth.Pspline作为一种方法提供给ggplot2中的一个stat_smooth层。我现在的代码是:

代码语言:javascript
复制
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。有人有这方面的经验吗?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-10 01:03:49

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

stat_smooth的内部工作中,调用predictdf来创建平滑的行。predictdfggplot2 (定义为这里)的内部(非导出)函数,是一个标准的S3方法。

sm.spline返回类smooth.Pspline的对象,因此为了使stat_smooth工作,需要为类smooth.Psplinepredictdf创建方法。

因此,以下内容将起作用。

代码语言:javascript
复制
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)

代码语言:javascript
复制
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'))

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19284897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档