gpt4 book ai didi

r - 删除超出黄土曲线极限的值

转载 作者:行者123 更新时间:2023-12-04 10:48:24 27 4
gpt4 key购买 nike

我希望在应用模型之前删除异常值。我正在使用一条Loess曲线来划定趋势线,并设置了离群值极限。我想删除超出定义限制的行。除了使用自定义功能来做到这一点之外,该功能一次获取每个点并检查本地的黄土坡度等...还有更简单的方法吗?

# Code generating image above
scatter.smooth( idam$T_d, idam$T_x10d)
loessline <- loess.smooth( idam$T_d, idam$T_x10d)
lines(loessline$x, loessline$y, lwd=3)
lines(loessline$x, loessline$y*1.2, lwd=3, col='red')
lines(loessline$x, loessline$y/1.2, lwd=3, col='red')

最佳答案

可以使用DBSCAN R包(用于群集识别的著名算法)来检测异常值(有关更多详细信息,请参见WIKIPEDIA)。

此功能具有三个重要输入:

  • x:您的数据(仅数字值)
  • eps:目标最大距离
  • minPts:视为点的最小点数

  • 可以在knndist(...)和knndistplot(...)函数的帮助下完成eps的评估:
  • knndistplot将针对给定的k(即minPts)在数据集上绘制eps值==>您可以直观地选择有效的eps值(通常在膝盖曲线部分)
  • knndist将评估eps值并将其从矩阵中返回。 k输入将生成1:1:k估值,您可以使用该结果以编程方式确定准确的eps和k值

  • 接下来,您只需要使用dbscan(yourdata,eps,k)来获取具有以下组件的dbscan对象:
  • eps:用于计算的eps
  • minPts:用于识别集群的最小点数
  • cluster:一个整数矢量,标识属于(= 1)或不属于(= 0)的集群的点。最后一个对应于您要消除的异常值。

  • 请注意dbscan的以下限制:
  • dbscan使用欧几里得距离,因此将其提交给“尺寸标注”。使用PCA
  • 可以避免这种情况
  • dbscan消除了可能生成未识别点的重叠点。这可以通过使用左外部联接将结果与数据合并或使用抖动(...)函数来解决,该函数会给数据增加噪音。根据您显示的数据,我认为您的数据可能是

  • 知道了这些限制,dbscan软件包提供了两种替代方法:LOF和OPTICS(DBSCAN的扩展)

    编辑于2016年1月25日

    在@rawr回答之后,我将给出一个基于 mtcars数据集的示例,以显示如何使用 dbscan识别异常值。请注意,我的示例将使用出色的 data.table包而不是经典的 data.frame

    首先,我开始复制Rawr的方法来说明data.table的用法。
    require(data.table)
    require(ggplot2)
    require(dbscan)
    data(mtcars)
    dt_mtcars <- as.data.table(mtcars)

    # based on rawr's approach
    plot(wt~mpg, data=dt_mtcars)
    lo <- loess.smooth(dt_mtcars[,mpg], dt_mtcars[,wt])
    lines(lo$x,lo$y, lwd=3)
    lines(lo$x,lo$y * 1.2, lwd=3 , col=2 )
    lines(lo$x,lo$y / 1.2, lwd=3 , col=2 )

    enter image description here

    因此,我们可以独立于基础支持而评估得出相同的结果。

    其次,以下代码说明了DBSCAN方法,该方法首先确定 epsk,这是标识集群的必要点数:
    res_knn = kNNdist( dt_mtcars[, .(wt, mpg)] , k = 10)
    dim_knn = dim(res_knn)
    x_knn = seq(1, dim_knn[1])
    ggplot() +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 1]) , col = 1 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 2]) , col = 2 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 3]) , col = 3 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 4]) , col = 4 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 5]) , col = 5 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 6]) , col = 6 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 7]) , col = 7 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 8]) , col = 8 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 9]) , col = 9 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 10]) , col = 10 ) ) +
    xlab('sorted results') +
    ylab('kNN distance')

    结果绘制在下图中:

    enter image description here

    它表明,计算出的kNN距离对 k因子敏感,但是用于分离离群值的准确 eps值位于曲线的膝盖部分==>合适的 eps位于2到4之间。
    这是一种视觉评估,可以使用适当的搜索算法(例如 see this link)自动进行评估。
    关于 k,必须定义一个折衷方案,知道k越低,结果的严格性就越低。

    在下一部分中,我们将使用 eps = 3(基于视觉估计)和 k = 4对dbscan进行参数设置,以得到稍微严格的结果。我们将在rawr的代码的帮助下绘制这些结果:
    eps = 3
    k = 4
    res_dbscan = dbscan( dt_mtcars[, .(wt, mpg)] , eps , k )
    plot(wt~mpg, data=dt_mtcars, col = res_dbscan$cluster)
    lo <- loess.smooth(dt_mtcars[res_dbscan$cluster>0,mpg], dt_mtcars[res_dbscan$cluster>0,wt])
    lines(lo$x,lo$y, lwd=3)
    lines(lo$x,lo$y * 1.2, lwd=3 , col=2 )
    lines(lo$x,lo$y / 1.2, lwd=3 , col=2 )

    enter image description here

    我们得到了这个数字,在这里我们可以评估得出与Rawr的方法有不同的结果,其中 mpg = [10,13]中的点被认为是离群值。

    这些结果与Rawr的解决方案相比是奇怪的,而Rawr的解决方案是在具有双变量数据(Y〜X)的假设下工作的。但是 mtcars是一个多维数据集,其中变量之间的关系可能是线性的(或不是线性的)...为了评估这一点,我们可以对该数据集进行散点图处理,例如对数值进行过滤
    pairs(dt_mtcars[, .(mpg, disp, hp, drat, wt, qsec)])

    enter image description here

    如果仅关注结果 wt ~ mpg,我们可能会乍一看认为这是一种反线性关系。但是对于其他绘制的关系,情况可能并非如此,在N-Dim环境中查找异常值比较棘手。实际上,在进行特定的2D比较投影时,一个点可能被认为是离群值...但是,如果添加新的比较维度,则相反。确实,我们可能具有可以被识别的共线性,因此是否可以增强聚类关系。

    我的 friend 们,我同意有很多 if,为了说明这种情况,我们将对 dbscan的数值进行 mtcars分析。

    因此,我将复制前面介绍的过程,让我们从kNN距离分析开始:
    res_knn = kNNdist( dt_mtcars[, .(mpg, disp, hp, drat, wt, qsec)] , k = 10)
    dim_knn = dim(res_knn)
    x_knn = seq(1, dim_knn[1])
    ggplot() +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 1]) , col = 1 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 2]) , col = 2 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 3]) , col = 3 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 4]) , col = 4 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 5]) , col = 5 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 6]) , col = 6 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 7]) , col = 7 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 8]) , col = 8 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 9]) , col = 9 ) ) +
    geom_line( aes( x = x_knn , y = sort(res_knn[, 10]) , col = 10 ) ) +
    xlab('sorted results') +
    ylab('kNN distance')

    sorted kNN distances

    与对 wt ~ mpg进行的分析相比,我们可以看到 kNNdist(...)产生了更为重要的kNN距离(例如,直到200带有 k = 10为止)。但是,我们还有膝盖部分,可以帮助我们估计合适的 eps值。

    在下一部分中,我们将使用 eps = 75k = 5以及
    # optimal eps value is between 40 (k=1) and 130 (k=10)
    eps = 75
    k = 5
    res_dbscan = dbscan( dt_mtcars[, .(mpg, disp, hp, drat, wt, qsec)] , eps , k )
    pairs(dt_mtcars[, .(mpg, disp, hp, drat, wt, qsec)] , col = res_dbscan$cluster+2L)

    enter image description here

    因此,此分析的散点图突出表明,由于变量之间的复杂关系,在N-Dim环境中识别异常值可能很棘手。但是请注意,在大多数情况下,离群值位于2D投影的角部分,因此可以增强使用 wt ~ mpg获得的结果

    关于r - 删除超出黄土曲线极限的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26801242/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com