通过 R 中的 Lowess 进行预测(或协调 Loess 和 Lowess)
Predicting via Lowess in R (OR reconciling Loess & Lowess)
我正在尝试 interpolate/locally 推断一些工资数据以填充数据集。
这是数据集和可用数据图:
experience salary
1: 1 21878.67
2: 2 23401.33
3: 3 23705.00
4: 4 24260.00
5: 5 25758.60
6: 6 26763.40
7: 7 27920.00
8: 8 28600.00
9: 9 28820.00
10: 10 32600.00
11: 12 30650.00
12: 14 32600.00
13: 15 32600.00
14: 16 37700.00
15: 17 33380.00
16: 20 36784.33
17: 23 35600.00
18: 25 33590.00
19: 30 32600.00
20: 31 33920.00
21: 35 32600.00
鉴于明显的非线性,我希望通过局部线性估计器进行内插和外推(我想填写 0 到 40 年的经验),所以我默认为 lowess
,这给出了这个:
这在情节上很好,但缺少原始数据 -- R 的绘图设备已经为我们填补了空白。我一直没能找到这个函数的 predict
方法,因为它似乎 R
正在朝着使用 loess
的方向发展,据我所知这是一个概括。
但是,当我使用 loess
(设置 surface="direct"
以便能够推断,如 ?loess
中所述)时,它有一个标准的 predict
方法,合身度不太令人满意:
(有充分的理论依据表明工资应该不会下降——这里有一些 noise/possible 错误测量导致了 U 形)
而且我似乎无法 fiddle 使用任何参数来恢复 lowess
给出的非递减拟合。
有什么建议吗?
我不知道如何 "reconcile" 这两个函数,但我已经使用 cobs
包(约束 B 样条非参数回归分位数)在类似任务中取得了一些成功。默认分位数是(本地)中位数或 0.5 分位数。在此数据集中,跨度或内核宽度的默认选择似乎非常合适。
require(cobs)
Loading required package: cobs
Package cobs (1.3-0) attached. To cite, see citation("cobs")
Rbs <- cobs(x=dat$experience,y=dat$salary, constraint= "increase")
qbsks2():
# Performing general knot selection ...
#
# Deleting unnecessary knots ...
Rbs
#COBS regression spline (degree = 2) from call:
# cobs(x = dat$experience, y = dat$salary, constraint = "increase")
#{tau=0.5}-quantile; dimensionality of fit: 5 from {5}
#x$knots[1:4]: 0.999966, 5.000000, 15.000000, 35.000034
plot(Rbs, lwd = 2.5)
它确实有一个预测方法,尽管您需要使用特殊参数,因为它不支持通常的 data=
形式主义:
help(predict.cobs)
predict(Rbs, z=seq(0,40,by=5))
z fit
[1,] 0 21519.83
[2,] 5 25488.71
[3,] 10 30653.44
[4,] 15 32773.21
[5,] 20 33295.84
[6,] 25 33669.14
[7,] 30 33893.12
[8,] 35 33967.78
[9,] 40 33893.12
我正在尝试 interpolate/locally 推断一些工资数据以填充数据集。
这是数据集和可用数据图:
experience salary
1: 1 21878.67
2: 2 23401.33
3: 3 23705.00
4: 4 24260.00
5: 5 25758.60
6: 6 26763.40
7: 7 27920.00
8: 8 28600.00
9: 9 28820.00
10: 10 32600.00
11: 12 30650.00
12: 14 32600.00
13: 15 32600.00
14: 16 37700.00
15: 17 33380.00
16: 20 36784.33
17: 23 35600.00
18: 25 33590.00
19: 30 32600.00
20: 31 33920.00
21: 35 32600.00
鉴于明显的非线性,我希望通过局部线性估计器进行内插和外推(我想填写 0 到 40 年的经验),所以我默认为 lowess
,这给出了这个:
这在情节上很好,但缺少原始数据 -- R 的绘图设备已经为我们填补了空白。我一直没能找到这个函数的 predict
方法,因为它似乎 R
正在朝着使用 loess
的方向发展,据我所知这是一个概括。
但是,当我使用 loess
(设置 surface="direct"
以便能够推断,如 ?loess
中所述)时,它有一个标准的 predict
方法,合身度不太令人满意:
(有充分的理论依据表明工资应该不会下降——这里有一些 noise/possible 错误测量导致了 U 形)
而且我似乎无法 fiddle 使用任何参数来恢复 lowess
给出的非递减拟合。
有什么建议吗?
我不知道如何 "reconcile" 这两个函数,但我已经使用 cobs
包(约束 B 样条非参数回归分位数)在类似任务中取得了一些成功。默认分位数是(本地)中位数或 0.5 分位数。在此数据集中,跨度或内核宽度的默认选择似乎非常合适。
require(cobs)
Loading required package: cobs
Package cobs (1.3-0) attached. To cite, see citation("cobs")
Rbs <- cobs(x=dat$experience,y=dat$salary, constraint= "increase")
qbsks2():
# Performing general knot selection ...
#
# Deleting unnecessary knots ...
Rbs
#COBS regression spline (degree = 2) from call:
# cobs(x = dat$experience, y = dat$salary, constraint = "increase")
#{tau=0.5}-quantile; dimensionality of fit: 5 from {5}
#x$knots[1:4]: 0.999966, 5.000000, 15.000000, 35.000034
plot(Rbs, lwd = 2.5)
它确实有一个预测方法,尽管您需要使用特殊参数,因为它不支持通常的 data=
形式主义:
help(predict.cobs)
predict(Rbs, z=seq(0,40,by=5))
z fit
[1,] 0 21519.83
[2,] 5 25488.71
[3,] 10 30653.44
[4,] 15 32773.21
[5,] 20 33295.84
[6,] 25 33669.14
[7,] 30 33893.12
[8,] 35 33967.78
[9,] 40 33893.12