2015-04-12 2 views
2

(Это сообщение является второй половиной проблемы из: How to apply loess.smoothing to both plot and then extract points?)Как интерполировать и извлечь точки над лессовой гладкой в ​​R?

Я нанесен лессом сглаживания на диаграмме рассеяния (то есть между двумя количественными переменным). Я хотел бы извлечь только точки данных в диаграмме рассеяния, которые находятся выше этой линии сглаживания.

Например, если это мое рассеивание:

qplot(mpg, cyl, data=mtcars) 

Я могу построить тем более гладкий, как:

qplot(hp,wt,data=mtcars) + stat_smooth(method="loess") 

Теперь я хочу, чтобы извлечь только точки данных, которые выше гладкого. Я играл с кодом, представленным в (Method to extract stat_smooth line fit):

model <- loess(wt ~ hp, data=mtcars) 
xrange <- range(mtcars$hp) 
xseq <- seq(from=xrange[1], to=xrange[2], length=80) 
pred <- predict(model, newdata = data.frame(hp = xseq), se=TRUE) 
y = pred$fit 
ci <- pred$se.fit * qt(0.95/2 + .5, pred$df) 
ymin = y - ci 
ymax = y + ci 
loess.DF <- data.frame(x = xseq, y, ymin, ymax, se = pred$se.fit) 

Это приводит к кадру данных loess.DF 80 строк и 5 столбцов.

Теперь я знаю, что я должен применить функцию для прохождения каждой строки исходного фрейма данных mtcars и интерполировать для каждого x-значения (hp) его ближайшее предсказанное значение yess yess (wt). Моя единственная идея выполнить эту интерполяцию - использовать линейную интерполяцию, подобную (http://www.ajdesigner.com/phpinterpolation/linear_interpolation_equation.php). После этого я бы просто сравнил значение y в mtcars с интерполированным предсказанным значением yess leess. Если значение y в mtcars больше, чем предсказанное значение y leess, тогда я сохраняю эту исходную точку данных; В противном случае я удаляю его.

Я начал кодировать это, но понимаю, что я не могу сделать это эффективным образом. Одна из проблем заключается в том, что мой (реальный) набор данных (который не является mtcars) очень велик (~ 40 000 строк): во-первых, чтобы выполнить линейную интерполяцию, мне нужно найти два значения x в лессовой подгонке, которые наиболее близки к исходное значение x в моем наборе данных (если нет точно одного идеального совпадения), и я не знаю, как это сделать эффективно, не просматривая увеличивающиеся значения x.

Как эффективный способ приблизиться к этому, например, сначала проверить его на наборе данных mtcars? Спасибо.

ответ

4

Вы должны это автоматически в качестве компонента residuals список возвращенного loess:

> str(model) 
List of 17 
$ n  : int 32 
$ fitted : num [1:32] 2.83 2.83 2.57 2.83 3.74 ... 
$ residuals: Named num [1:32] -0.2133 0.0417 -0.2477 0.3817 -0.2997 ... 
    ..- attr(*, "names")= chr [1:32] "Mazda RX4" "Mazda RX4 Wag" "Datsun 710" "Hornet 4 Drive" ... 
$ enp  : num 4.94 
$ s  : num 0.655 
$ one.delta: num 26.1 
$ two.delta: num 25.8 
$ trace.hat: num 5.43 
$ divisor : num 1 
... 

Если вы делаете: model$residuals, положительные значения выше линии, так и отрицательные линии ниже:

> which(sign(model$residuals) == 1) 
     Mazda RX4 Wag  Hornet 4 Drive    Valiant   Merc 240D   Merc 230   Merc 280 
        2     4     6     8     9     10 
      Merc 280C   Merc 450SE Cadillac Fleetwood Lincoln Continental Chrysler Imperial   Fiat 128 
       11     12     15     16     17     18 
    Dodge Challenger   AMC Javelin Pontiac Firebird  Maserati Bora 
       22     23     25     31 

выше результат - все точки от исходных данных, которые превышают кривую LOESS.

Смежные вопросы