2015-04-12 40 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) 

這導致在80行和5列的數據幀loess.DF。

我現在知道我必須應用函數來檢查原始mtcars數據框的每一行,併爲每個x值(hp)插入其最接近的預測黃土y值(wt)。我完成這種插值的唯一想法是使用類似於(http://www.ajdesigner.com/phpinterpolation/linear_interpolation_equation.php)的線性插值。之後,我將簡單比較mtcars中的y值與插值預測黃土y值。如果mtcars中的y值大於預測的黃土y值,則保留原始數據點;否則,我刪除它。

我開始編寫代碼,但意識到我無法以有效的方式做到這一點。一個問題是我的(真實)數據集(不是mtcars)非常大(約40,000行):首先,爲了進行線性插值,我需要找到最接近於黃土擬合的兩個x值我的數據集中的原始x值(如果沒有完全匹配的話),我不知道如何有效地做到這一點,而不需要搜索增加的黃土x值。

如何有效的方法來處理這個問題,例如,首先在mtcars數據集上進行測試?謝謝。

回答

4

你有這樣的自動按loess返回residuals列表組件:

> 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曲線上方原始數據的所有點。