首页 文章

如何在R中平滑并提取黄土上方的点?

提问于
浏览
2

(这篇帖子是问题的后半部分:How to apply loess.smoothing to both plot and then extract points?

我已经将黄土平滑绘制到散点图(即两个定量变量之间) . 我想只提取散点图中高于该平滑线的数据点 .

例如,如果这是我的散点图:

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)插入其最接近的预测黄土y值(wt) . 我完成此插值的唯一想法是使用类似于(http://www.ajdesigner.com/phpinterpolation/linear_interpolation_equation.php)的线性插值 . 之后,我只是将mtcars中的y值与插值的预测黄土y值进行比较 . 如果mtcars中的y值大于预测的黄土y值,那么我保留原始数据点;否则,我删除它 .

我开始对此进行编码,但意识到我不能以有效的方式这样做 . 一个问题是我的(真实)数据集(不是mtcars)非常大(~40,000行):首先,要进行线性插值,我需要找到黄土拟合中最接近的两个x值 . 我的数据集中的原始x值(如果没有完全匹配),并且我不知道如何有效地执行此操作而不搜索增加的黄土x值 .

如何有效地解决这个问题,例如,首先在mtcars数据集上进行测试?谢谢 .

1 回答

  • 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曲线上方的原始数据的所有点 .

相关问题