【问题标题】: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)

任何帮助都会很棒。

【问题讨论】:

    标签: r subset mean standard-deviation


    【解决方案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)
    

    【讨论】: