【问题标题】:smooth.Pspline wrapper for stat_smooth (in ggplot2)stat_smooth 的 smooth.Pspline 包装器(在 ggplot2 中)
【发布时间】:2013-10-10 00:08:57
【问题描述】:

对不起,如果这个问题是微不足道的,但我试图弄清楚如何在 R 中绘制某种类型的自然三次样条 (NCS),但我完全没有想到。

previous question 中,我学习了如何在 ggplot 中绘制由 ns() 命令生成的 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”公式。我做了一点谷歌搜索,发现 solution 与 Hadley 编写的非常相似的 B 样条函数 smooth.spline。但我无法将其完美地适应 smooth.Pspline。有人有这方面的经验吗?

非常感谢!

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

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

    stat_smooth 的内部工作中,调用predictdf 来创建平滑线。 predictdfggplot2 的内部(非导出)函数(定义为here),它是标准的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 拟合的 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'))
    

    【讨论】:

    • 你能解释一下是什么函数或类调度原则导致predictdf.smooth.Pspline被调用吗?当哈德利写它时我没有得到它,我也看不到这里的联系。我看到 stat_smooth 应该返回与您为该函数的参数设置相同的值,但是什么决定了它的命名或调用方式?
    • 你们在这里太棒了。感谢您的出色回答。
    • 我想我现在明白了。有几个内置的predictdf 函数可以匹配有限数量的“方法”,但您只需要将名称与“方法”参数返回的类匹配即可。
    • 嗨@mnel:我可以问你一个有点愚蠢的后续问题吗?在smP 方法的主体中,是否可以为sm.spline(...) 提供我正在绘制的原始数据集的不同列?特别是,我想为我正在绘制的每个点指定一个权重,并且该权重存储在我的数据集的单独列中。应该可以从M&lt;-model.frame(formula,data) 访问,对吧?
    • @gogurt 不容易,不。最好使用dlplyby 之类的东西来创建拟合......
    猜你喜欢
    • 2013-08-12
    • 2016-06-26
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2019-01-17
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多