【问题标题】:How to find inflection points in a Kernel density plot in R?如何在 R 的核密度图中找到拐点?
【发布时间】:2020-10-29 19:53:16
【问题描述】:

我正在尝试在我使用 density() 函数计算的核密度图曲线中找到拐点的 x 值。

我发现以下已回答的问题有助于找到转折点:

How to find all the turning points on a kernel density curve when window width varies.

所以我认为也必须有一种方法来找到拐点的 x 值。 如果有人给小费就好了。

【问题讨论】:

    标签: r kernel-density


    【解决方案1】:

    根据定义,拐点是函数的二阶导数为零的点。在实践中,这意味着拐点将是斜率从增加到减少的点,或 v.v.使用这个定义,我采用了这种近似且非自动的方法: 假设您有一个数据框,我将其命名为 all,其中包含第一列中的 x 值,以及第二列中的密度计算结果。从这个数据框中,我们可以计算出两个连续点的斜率,如下所示:

    slopes <- vector()
    for(i in (2:nrow(all))){
      x1 <- all[i-1, 1]
      x2 <- all[i, 1]
      y1 <- all[i-1, 2]
      y2 <- all[i, 2]
      slope_i <- (y2-y1)/(x2-x1)
      slopes <- append(slopes, slope_i)
    }
    

    根据拐点的定义,我们现在可以计算从一个点到另一个点的斜率是变大还是变小:

    increment <- vector()
    for(j in 2:length(slopes)){
      increment_j <- slopes[j] - slopes[j-1]
      increment <- append(increment, increment_j)
    }
    

    拐点将是这个增量从正到负传递的那些点,或 v.v.

    现在,让我们将这些增量分为正数和负数:

    pos <- which(increment>0)
    neg <- which(increment<0
    

    现在,只要这些posneg 向量发生跳跃,就意味着我们有一个拐点。所以,再一次:

    steps_p <- vector()
    for(k in 2:length(pos)){
      steps_k <- pos[k] - pos[k-1]
      steps_p <- append(steps_p, steps_k)
    }
    steps_n <- vector()
    for(k in 2:length(neg)){
      steps_k <- neg[k] - neg[k-1]
      steps_n <- append(steps_n, steps_k)
    }
    

    现在,问 R:

    which(steps_p>1)
    which(steps_n>1)
    

    这是您的拐点的索引,现在只需转到您的原始数据框并询问 x 值:

    all[pos[which(steps_p>1)],1]
    all[neg[which(steps_n>1)],1]
    

    请记住,x 值将接近精确,但并不完全,因为在每个循环中我们都会丢失一个索引,但它仍然是一个非常接近的解决方案。

    【讨论】:

    • 听起来不错。我试图计算它,但它给了我下面的计算错误,说“2:nrow(all)中的错误:长度为零的参数”你知道这里出了什么问题吗?对不起,我又问了......我在统计方面很笨......
    • 我怀疑您将循环应用于向量而不是数据帧。您首先必须为我的代码创建一个数据框才能工作。如果将密度函数应用于向量 x:结果
    • 再次感谢您!我能够坚持一切,但最终我得到了对我没有任何意义的负面价值观。我将尝试在此处附加我的数据集。也许你可以看到发生了什么?
    • 你是绝对正确的,@Becca。我的错,我没有正确索引最后一步。希望它现在可以工作。至少在我的虚拟示例中是这样
    • 我已经用你的数据进行了测试,它有效。我找到的值是:5.069415、21.997896、12.26125。正如我告诉你的,请注意这些不是确切的 x 值,因为有几个循环;但是,它们距离真实数据点不到 3 个数据点。该图的目视检查还表明,这些确实是真正的拐点。最好的问候,将答案标记为解决问题,如果您觉得有用,请投赞成票!
    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2018-01-23
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2014-10-16
    相关资源
    最近更新 更多