2015-03-25 9 views
1

Я пытаюсь интерполировать/локально экстраполировать некоторые данные о зарплате, чтобы заполнить набор данных.Прогнозирование с помощью Lowess в R (ИЛИ согласование Loess & Lowess)

Вот набор данных и график имеющихся данных:

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 

Raw Data

Учитывая ясно Нелинейность, я надеюсь, что интерполировать & экстраполировать (Я хочу, чтобы заполнить опыт в течение многих лет 0 через 40) через локальную линейную оценку, поэтому я дефолт в lowess, что дает это:

Lowess

Это хорошо на участке, но необработанных данных нет - устройство для построения R заполнило пробелы для нас. Мне не удалось найти метод predict для этой функции, так как кажется, что R движется к использованию loess, что, как я понимаю, является обобщением.

Однако, когда я использую loess (настройка surface="direct", чтобы иметь возможность экстраполировать, как указано в ?loess), который имеет стандартный predict метод, подгонка менее удовлетворительным:

Loess

(Есть сильные теоретические основания утверждать, что зарплата должна быть неуклонной - есть некоторый шум/возможное неправильное измерение, приводящее здесь форму U)

И я не могу показаться, что вы можете играть с любым из пар для возврата назад неубывающей посадки, указанной lowess.

Любые предложения относительно того, что делать?

ответ

3

Я не знаю, как «согласовать» эти две функции, но я использовал пакет cobs (CONstrained B-Splines Nonparametric Regression Quantiles) с некоторым успехом для подобных задач. По умолчанию квантиль - это (локальная) медиана или 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) 

enter image description here

Это есть способ предсказать, хотя вам нужно будет использовать своеобразные аргументы, так как он не поддерживает обычный 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 
+0

удивительный! как узнать обо всех этих методах интерполяции, мне остается задаться вопросом ... – MichaelChirico

+1

В этом случае это была работа с виньеткой, которая поставляется с пакетом «quantreg'» Роджера Коенкера. –