如何使用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
值?感谢。
答案 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")