这是我到目前为止所处的位置:
我的数据框df
包含两列A
和B
(均包含实数)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
任何帮助非常感谢。欢呼声。
答案 0 :(得分:10)
首先,要回答你的上一个问题,你需要提供一个带有colnames的data.frame作为预测器。
B.lm <- lm(B ~ A,data=df)
predict(B.lm, newdata = data.frame(A=11))
1
683.3333
作为黄土的替代品,您可以尝试更高的多项式回归。在这个图中,我使用poly~3
将loess
与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
答案 1 :(得分:5)
surface
的默认loess.control
为interpolate
,毫不奇怪,这不允许外推。替代方法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