(这篇帖子是问题的后半部分: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 回答
您自动将此作为
loess
返回的residuals
列表组件:如果你这样做:
model$residuals
,正值高于线,负线低于:上述结果是来自LOESS曲线上方的原始数据的所有点 .