【问题标题】:A replacement for method = 'loess'替代方法 = 'loess'
【发布时间】:2013-02-22 17:12:25
【问题描述】:

这是我目前所处的位置:

我有一个数据框df 有两列AB(均包含实数),其中b 依赖于a。我将列相互绘制:

p = ggplot(df, aes(A, B)) + geom_point()

并看到这种关系是非线性的。添加:

p = p + geom_smooth(method = 'loess', span = 1)

给出了最合适的“好”线。给定A 的新值a 然后我用下面的方法来预测B 的值:

B.loess = loess(B ~ A, span = 1, data = df)
predict(B.loess, newdata = a)

到目前为止,一切都很好。但是,然后我意识到我无法使用loess 进行推断(大概是因为它是非参数的?!)。推断似乎很自然——这种关系看起来像是一种权力类型的事情,例如:

x = c(1:10)
y = 2^x
df = data.frame(A = x, B = y)

这就是我不解的地方。首先,在不使用loess 的情况下,我可以使用哪些方法来绘制最适合这种(“功率”)数据的线?可悲的尝试,例如:

p = ggplot(df, aes(A, B)) + geom_point() +
      geom_smooth(method = 'lm', formula = log(y) ~ x)

给我错误。此外,假设我实际上能够绘制一条我满意的最佳拟合线,我在使用predict 时遇到了问题,就像我在使用loess 时所做的那样。例如,假设我对最佳拟合线感到满意:

p = ggplot(df, aes(A, B)) + geom_point() +
      geom_smooth(method = 'lm', formula = y ~ x)

那么如果我想预测A 等于11(理论上是2^11)时B 会取什么值,下面的方法不起作用:

B.lm = lm(B ~ A)
predict(B.lm, newdata = 11)

非常感谢任何帮助。干杯。

【问题讨论】:

    标签: r ggplot2 prediction loess


    【解决方案1】:

    首先,要回答您的最后一个问题,您需要提供一个 data.frame,其中 colnames 是预测变量。

    B.lm <- lm(B ~ A,data=df)
    predict(B.lm, newdata = data.frame(A=11))
    
         1 
    683.3333 
    

    作为 loess 的替代方法,您可以尝试一些更高的多项式回归。在此图中,我使用 latticeExtra(更容易添加 xspline 插值)将 poly~3loess 进行比较,但语法与 ggplot2.(layer) 相似。

    xyplot(A ~ B,data=df,par.settings = ggplot2like(),
           panel = function(x,y,...){
             panel.xyplot(x,y,...)
             grid.xspline(x,y,..., default.units = "native") ## xspline interpolation
           })+
      layer(panel.smoother(y ~ poly(x, 3), method = "lm"), style = 1)+  ## poly
      layer(panel.smoother(y ~ x, span = 0.9),style=2)   ### loeess
    

    【讨论】:

    • 您好,感谢您的回答 agstudy。与其尝试更高的多项式回归,不如使用幂回归(我认为这些更适合我的数据)?如果可能的话,你会好心编辑你的帖子来告诉我如何做这些吗?我会很感激。干杯。
    【解决方案2】:

    loess.control 的默认 surfaceinterpolate,这毫不奇怪,不允许外推。替代方案direct 允许您进行推断,但仍然存在关于这是否有意义的问题。

    predict(loess(hp~disp,mtcars),newdata=1000)
    [1] NA
    predict(loess(hp~disp,mtcars,control=loess.control(surface="direct")),newdata=1000)
    [1] -785.0545
    

    【讨论】:

    • 为詹姆斯干杯。是的,我同意外推可能不一定有意义。在这种情况下它似乎有效的原因是数据的依赖关系看起来可以使用幂函数建模。
    • 整洁。请在 OP 的数据集上绘制图表,以便我们自己进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    相关资源
    最近更新 更多