如何得到R的黄土和R的lowess函数得到相同的结果?

时间:2013-06-30 15:09:25

标签: r statistics regression

如何使用loess复制使用lowess的黄土适合度?

黄土代码

> data = data.frame(x=c(1,0.5,3,4,5,5.5,6,7), y=c(10, 25, 38, 44.5, 500, 550, 600, 705))
> fit = loess("y ~ x", data=data)
> new_y = predict(fit, data$x)
> new_y
[1]   6.251022  28.272100  -2.840750 150.006042 481.927307 563.161187 640.825415 693.166150

低位代码

> new_fit = lowess(data, f=0.8)
> new_fit
$x
[1] 0.5 1.0 3.0 4.0 5.0 5.5 6.0 7.0

$y
[1]  -4.330119  38.931265 255.000000 400.000000 500.000000 550.241949 601.519903 704.247275

结果非常不同。我正在尝试为y给定值x获取新的拟合值。 loess给出了

[1]   6.251022  28.272100  -2.840750 150.006042 481.927307 563.161187 640.825415 693.166150

虽然lowess给出了:

[1]  -4.330119  38.931265 255.000000 400.000000 500.000000 550.241949 601.519903 704.247275

如何重写我的lowess来电,为新y值提供非常相似的结果predict loess拟合和x值?感谢。

3 个答案:

答案 0 :(得分:3)

你为什么需要这个?

我不认为在一般情况下可以做到。这是一个特定的案例,它给出了几乎相同的结果,但由于某种原因,最后一个值仍然不同:

fit1 <- loess(y~x,data=data,span=0.8,degree=1)
predict(fit1)
#[1]  19.08622  12.55692  37.93642 188.35019 401.53528 506.87040 591.41854 740.71060

fit2 <- lowess(data$x,data$y,f=0.8,iter=0)
fit2

# $x
# [1] 0.5 1.0 3.0 4.0 5.0 5.5 6.0 7.0
# 
# $y
# [1]  12.55692  19.08622  37.93642 188.35019 401.53528 506.87040 591.41854 741.12187
#Note that lowess reorders by x.

答案 1 :(得分:3)

显然无法完成的原因是这两个函数在引擎盖下使用了不同的算法,我能找到的唯一解释是Brian Ripley在这里:

http://www.mail-archive.com/r-help@stat.math.ethz.ch/msg63623.html

"It is not possible: the algorithms differ considerably in their details. 

...

In determining 'local' loess() uses a tricubic weighting, lowess() uses a 
uniform weighting (on reading the code)."

文档清楚地说明了如何选择span / f参数与默认参数类似,但由于不同的平滑算法,所有其他参数在两个函数之间不可互换。使用

答案 2 :(得分:1)

data = data.frame(x=c(1,0.5,3,4,5,5.5,6,7), y=c(10, 25, 38, 44.5, 500, 550, 600, 705))
 fit = loess("y ~ x", data=data)
 new_y = predict(fit, data$x)
 plot( data$x , new_y)
lines(lowess(data, f=0.8)$x, lowess(data, f=0.8)$y)
# Obviously lowess with f=0.8 is giving different smoothing

与较低的f值比较

lines(lowess(data, f=0.8)$x, lowess(data, f=0.5)$y, col="red") 

enter image description here