基于均值标准差的子集
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
Diff
是 NPVF
和 npv
之间的差异,而 Z
是 Diff
除以标准差。您的异常值是绝对值大于 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)
我有一个包含两列变量的数据框(混合了验证和测试数据)。我计算了两列均值的标准差,现在,我想 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
Diff
是 NPVF
和 npv
之间的差异,而 Z
是 Diff
除以标准差。您的异常值是绝对值大于 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)