基于均值标准差的子集
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
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)
【讨论】:
以上是关于基于均值标准差的子集的主要内容,如果未能解决你的问题,请参考以下文章