替换方法='黄土'

时间:2013-02-22 17:12:26

标签: r ggplot2 prediction loess

这是我到目前为止所处的位置:

我的数据框df包含两列AB(均包含实数)b依赖于a。我将列相互绘制:

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

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

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

给出了“良好”的最佳匹配线。根据{{​​1}}的新值[{1}},我会使用以下方法预测a的值:

A

到目前为止,这么好。然而,我意识到我无法使用B进行推断(大概是因为它是非参数的?!)。推断看起来相当自然 - 这种关系看起来像是一种强大的东西,例如:

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

这是我失去的地方。首先,我可以使用哪些方法在不使用loess的情况下绘制最适合此类('power')数据的线?可怜的尝试如:

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等于11(理论上为2 ^ 11)时将采用的值p = ggplot(df, aes(A, B)) + geom_point() + geom_smooth(method = 'lm', formula = y ~ x) ,则以下方法不起作用:

B

任何帮助非常感谢。欢呼声。

2 个答案:

答案 0 :(得分:10)

首先,要回答你的上一个问题,你需要提供一个带有colnames的data.frame作为预测器。

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

     1 
683.3333 

作为黄土的替代品,您可以尝试更高的多项式回归。在这个图中,我使用poly~3loesslatticeExtra进行比较(更容易添加xspline插值),但语法类似于ggplot2。(图层)。

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

enter image description here

答案 1 :(得分:5)

surface的默认loess.controlinterpolate,毫不奇怪,这不允许外推。替代方法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