1

这是我目前所处的位置:

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

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

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

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

给出最合适的“好”线。给定一个新值aIA然后使用以下方法来预测 的值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)

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

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

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

4

2 回答 2

10

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

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

     1 
683.3333 

作为 loess 的替代方案,您可以尝试一些更高的多项式回归。在此图中,我与poly~3使用loesslatticeExtra更容易添加 xspline 插值)进行比较,但语法与 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

在此处输入图像描述

于 2013-02-22T17:25:12.130 回答
5

不出所料,默认情况下不允许surface外推。替代方案允许您进行推断,但仍然存在关于这是否有意义的问题。loess.controlinterpolatedirect

predict(loess(hp~disp,mtcars),newdata=1000)
[1] NA
predict(loess(hp~disp,mtcars,control=loess.control(surface="direct")),newdata=1000)
[1] -785.0545
于 2013-02-22T17:36:04.593 回答