替换方法='黄土'

use*_*259 1 r prediction ggplot2 loess

这是我到目前为止的地方:

我有一个数据框,df有两列AB(都包含实数)b依赖a.我将列相互绘制:

p = ggplot(df, aes(A, B)) + geom_point()
Run Code Online (Sandbox Code Playgroud)

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

p = p + geom_smooth(method = 'loess', span = 1)
Run Code Online (Sandbox Code Playgroud)

给出了"良好"的最佳匹配线.给定I 的新值a,A然后使用以下方法来预测值B:

B.loess = loess(B ~ A, span = 1, data = df)
predict(B.loess, newdata = a)
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.然而,我意识到我无法推断使用loess(大概是因为它是非参数的?!).推断看起来相当自然 - 这种关系看起来像是一种强大的东西,例如:

x = c(1:10)
y = 2^x
df = data.frame(A = x, B = y)
Run Code Online (Sandbox Code Playgroud)

这是我失去的地方.首先,我可以使用哪些方法来绘制最适合这种('power')数据的线而不使用loess?可悲的尝试,例如:

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

给我错误.此外,假设我实际上能够绘制一条我最满意的最佳合适线,我在使用时遇到的问题与我使用predict的方式类似loess.例如,假设我对最佳拟合线感到满意:

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

然后,如果我想预测B如果A等于11(理论上为2 ^ 11)将采取什么值,则以下方法不起作用:

B.lm = lm(B ~ A)
predict(B.lm, newdata = 11)
Run Code Online (Sandbox Code Playgroud)

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

ags*_*udy 10

首先,要回答你的上一个问题,你需要提供一个带有colnames的data.frame是预测变量.

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

     1 
683.3333 
Run Code Online (Sandbox Code Playgroud)

作为黄土的替代方案,您可以尝试更高的多项式回归.在这里,我在这个情节我比较poly~3loess使用latticeExtra(更容易添加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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Jam*_*mes 5

默认surfaceloess.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
Run Code Online (Sandbox Code Playgroud)