(这篇文章是问题的后半部分: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")
现在,我只想提取平滑器上方的数据点。我玩过(提取 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 值大于预测的 loess y 值,那么我保留那个原始数据点;否则,我将其删除。
我开始编写代码,但意识到我不能以有效的方式这样做。一个问题是我的(真实)数据集(不是 mtcars)非常大(约 40,000 行):首先,要进行线性插值,我需要在 loess 拟合中找到最接近的两个 x 值我的数据集中的原始 x 值(如果不完全匹配),我不知道如何在不搜索增加的黄土 x 值的情况下有效地做到这一点。
解决这个问题的有效方法是什么,例如,首先在 mtcars 数据集上对其进行测试?谢谢你。