这就是我到目前为止所处的位置:
我有一个数据帧df,它有两列A和B (都包含实数),其中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)任何帮助都非常感谢。干杯。
发布于 2013-02-23 01:25:12
首先,要回答您的最后一个问题,您需要提供一个以colname为预测变量的data.frame。
B.lm <- lm(B ~ A,data=df)
predict(B.lm, newdata = data.frame(A=11))
1
683.3333 作为对黄土的替代,你可以尝试一些更高的多项式回归。在这里,我在这张图中使用latticeExtra(更容易添加x样条插值)比较了poly~3和loess,但语法与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

发布于 2013-02-23 01:36:05
loess.control的默认surface是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.0545https://stackoverflow.com/questions/15029638
复制相似问题