基于均值标准差的子集

Posted

技术标签:

【中文标题】基于均值标准差的子集【英文标题】:Subsetting based on standard deviation of the mean 【发布时间】:2021-08-01 03:52:43 【问题描述】:

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

如何删除“黄色区域”之外的点,这些点不在平均值的 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)

任何帮助都会很棒。

【问题讨论】:

【参考方案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

DiffNPVFnpvZ 之间的差值是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)

【讨论】:

以上是关于基于均值标准差的子集的主要内容,如果未能解决你的问题,请参考以下文章

计算给出数组中最小标准差的子集

matlab中均值和标准差的像素计算

具有给定均值和标准差的正随机数生成

Javascript:生成具有固定均值和标准差的随机数

Random.nextgaussian() 可以从具有不同均值和标准差的分布中采样值吗?

如何计算给定均值和标准差的正态分布中的概率?