首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法= 'loess‘的替代方法

方法= 'loess‘的替代方法
EN

Stack Overflow用户
提问于 2013-02-23 01:12:26
回答 2查看 2.3K关注 0票数 1

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

我有一个数据帧df,它有两列AB (都包含实数),其中b依赖于a。我将这些列相互对比:

代码语言:javascript
复制
p = ggplot(df, aes(A, B)) + geom_point()

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

代码语言:javascript
复制
p = p + geom_smooth(method = 'loess', span = 1)

给出最佳拟合的“好”行。给定A的新值a,然后使用以下方法预测B的值

代码语言:javascript
复制
B.loess = loess(B ~ A, span = 1, data = df)
predict(B.loess, newdata = a)

到现在为止还好。然而,然后我意识到我不能使用loess进行推断(大概是因为它是非参数的?!)。这种推断看起来相当自然--关系看起来像是一种幂类型的事情正在进行,例如:

代码语言:javascript
复制
x = c(1:10)
y = 2^x
df = data.frame(A = x, B = y)

这就是我解脱的地方。首先,在不使用loess的情况下,我可以使用什么方法来绘制一条最适合这种(‘幂’)数据的直线?可悲的尝试,例如:

代码语言:javascript
复制
p = ggplot(df, aes(A, B)) + geom_point() +
      geom_smooth(method = 'lm', formula = log(y) ~ x)

给我一些错误。此外,假设我实际上能够绘制出一条我满意的最佳拟合线,那么我在使用predict时遇到了问题,就像使用loess时一样。举个例子,假设我对最适合的那行很满意:

代码语言:javascript
复制
p = ggplot(df, aes(A, B)) + geom_point() +
      geom_smooth(method = 'lm', formula = y ~ x)

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

代码语言:javascript
复制
B.lm = lm(B ~ A)
predict(B.lm, newdata = 11)

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

EN

回答 2

Stack Overflow用户

发布于 2013-02-23 01:25:12

首先,要回答您的最后一个问题,您需要提供一个以colname为预测变量的data.frame。

代码语言:javascript
复制
B.lm <- lm(B ~ A,data=df)
predict(B.lm, newdata = data.frame(A=11))

     1 
683.3333 

作为对黄土的替代,你可以尝试一些更高的多项式回归。在这里,我在这张图中使用latticeExtra(更容易添加x样条插值)比较了poly~3loess,但语法与ggplot2.(层)相似。

代码语言:javascript
复制
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

票数 10
EN

Stack Overflow用户

发布于 2013-02-23 01:36:05

loess.control的默认surfaceinterpolate,这并不奇怪,它不允许外推。另一种方法是direct,它允许您进行推断,但这是否有意义仍然是一个问题。

代码语言:javascript
复制
predict(loess(hp~disp,mtcars),newdata=1000)
[1] NA
predict(loess(hp~disp,mtcars,control=loess.control(surface="direct")),newdata=1000)
[1] -785.0545
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15029638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档