基于均值标准差的子集

Subsetting based on standard deviation of the mean

我有一个包含两列变量的数据框(混合了验证和测试数据)。我计算了两列均值的标准差,现在,我想 trim 数据以删除误差线之外的点。

如何删除 'yellow area' 之外的点,这些点不在均值的 1 个标准差范围内?

为了说明我的问题,这是数据框的一小部分,包括目前使用的函数。

ppv_dataset <- data.frame(NPVF=c(537428267.18, 593361648.89, 239331813.71, 564188133.09, 309720858.48, 286511353.97, 240790667.83, 484104247.40), 
                       npv=c(406866996.1019452, 679310854.3856647, 3816961.8569191, 685153713.2962445, 677629647.0433271, 450006801.2676973, 192824789.9761059, 492550821.6983585))

x <- apply((ppv_dataset$NPVF/100000000), 2, mean)
x.sd <- apply((ppv_dataset$NPVF/100000000), 2, sd)
y <- apply((ppv_dataset$npv/100000000), 2, mean)
y.sd <- apply((ppv_dataset$npv/100000000), 2, sd)

x_coordinates <- seq(0,8,by=1)
y_coordinates <- seq(0,8,by=1)

 # Add error bars

arrows(x0=x_coordinates-x.sd, y0=y_coordinates, x1=x_coordinates+x.sd, y1=y_coordinates, code=3, angle=90, length=0.1)
arrows(x0=y_coordinates, y0=x_coordinates-x.sd, x1=y_coordinates, y1=x_coordinates+x.sd, code=3, angle=90, length=0.1)

任何帮助都会很棒。

要按照您的示例进行操作有点困难,但这可能会有所帮助。您的所有示例代码都因示例数据而失败。 apply 命令不能与矢量一起使用,您可以通过除以 1e8 而不是数据来缩放统计数据。这可能就是你想要的。根据第一个图中的图例,该行是 npv = NPVF,x 轴为 NPVF,y 轴为 npv。这意味着与直线的垂直和水平偏差相等,但任何点的符号都相反。在按 1e8 缩放数据后,我们可以向您的数据添加两列:

ppv_dataset <- ppv_dataset/1e8
ppv_dataset$Diff <- with(ppv_dataset, NPVF - npv)
std <- sd(ppv_dataset$Diff)
ppv_dataset$Z <- ppv_dataset$Diff/std
pv_dataset
    NPVF     npv      Diff         Z
1 5.3743 4.06867  1.305613  0.697659
2 5.9336 6.79311 -0.859492 -0.459273
3 2.3933 0.03817  2.355149  1.258482
4 5.6419 6.85154 -1.209656 -0.646384
5 3.0972 6.77630 -3.679088 -1.965933
6 2.8651 4.50007 -1.634954 -0.873644
7 2.4079 1.92825  0.479659  0.256307
8 4.8410 4.92551 -0.084466 -0.045135

DiffNPVFnpv 之间的差异,而 ZDiff 除以标准差。您的异常值是绝对值大于 1 的行。这些是第二个图中黄色框外的两个点。以下代码删除它们:

ppv_dataset[abs(ppv_dataset$Z) < 1, ]
#     NPVF    npv      Diff         Z
# 1 5.3743 4.0687  1.305613  0.697659
# 2 5.9336 6.7931 -0.859492 -0.459273
# 4 5.6419 6.8515 -1.209656 -0.646384
# 6 2.8651 4.5001 -1.634954 -0.873644
# 7 2.4079 1.9282  0.479659  0.256307
# 8 4.8410 4.9255 -0.084466 -0.045135

这是您的剧情的简单版本:

notout <- abs(ppv_dataset$Z) < 1
out <- abs(ppv_dataset$Z) > 1
plot(ppv_dataset[notout, 1:2], xlim=c(0, 10), ylim=c(0, 10), pch=16, col="blue", asp=1)
points(ppv_dataset[out, 1:2], pch=16, col="red")
abline(a=0, b=1)
bounds <- cbind(x=c(0, 10, 10, 0), y=c(std, 10+std, 10-std, -std))
polygon(bounds, lty=3)