【问题标题】:Given an empirical probability density function, how to find the value (in R) at which the density peaks? [duplicate]给定一个经验概率密度函数,如何找到密度峰值的值(在 R 中)? [复制]
【发布时间】:2013-10-08 17:48:09
【问题描述】:

我计算以下数据的密度函数:

> dput(mydat)  
c(-20, -13, 30, 4, -4, 34, 27, 19, 13.5, 15, 13, 18, 10, 12, 
21, -0.769999999999996, 2.5, -7, 0, -30.6, 6.39999999999999, 
-18.6, -0.199999999999989, -20.4, -19.9, 4.60000000000001, -19.4, 
4.5, -9, -15, 9, -1, -14, 8, 6, -17, 5, 7)  

> myden = density(mydat)  # default kernel and bandwidth  

这给了我这个结果:

我想找到两个密度峰值的位置。我最初想在myden$y 上使用diff(),然后检查所有有符号变化的位置,以此作为选择X 轴值的条件。我在几个测试向量上进行了尝试,但没有得到预期的结果,我怀疑它并不是那么简单。

有没有一种简单的方法可以做到这一点?我想要一个可重复的解决方案,因为我将作为随机模拟研究的一部分执行此操作,实现 ~ e​​+05 次,并且可能会发生峰值数量在模拟中发生变化的情况。

【问题讨论】:

  • 为什么您认为 diff() 方法没有按预期工作?我刚刚看到了 diff 输出,符号从 +ve 变为 -ve 的位置似乎在一个峰值附近。 Diff 应该近似于通常用于获得局部最大值的微分逻辑。
  • @Thomas 谢谢!是的,它是重复的。它必须被标记为这样,我不知道我是否有权限这样做。
  • @Codoremifa 在查看了 Thomas 发布的链接后,我记得在微积分课上必须使用二阶微分来测试它。

标签: r probability-density


【解决方案1】:

我经常使用pastecs::turnpoints 来查找局部最大值和最小值。

【讨论】:

  • @Roland “我发布了”免责声明在哪里? :-) //改组链接到他自己的turnpoints 帖子 *_O
  • turnpoints 就像一个魅力。但是,我可以想象,对于嘈杂的数据(类似于这篇文章 stackoverflow.com/questions/14319826/… 上所写的内容),我可能不得不寻找解决方法..但那是另一回事,现在,这应该可行。跨度>
  • 如果您的数据嘈杂,只需对其进行平滑处理。
【解决方案2】:

使用which.max:

myden$x[which.max(myden$y)]
# [1] 5.91428

您可以直观地对此进行测试:

plot(myden, col='red')
abline(v=myden$x[which.max(myden$y)])

【讨论】:

  • 我想找到两个(或多个,如果有更多)峰值的值,而不仅仅是全局最大值..
  • @AdvaitGodbole 啊,然后看看我刚刚发布的关于你原来的问题的问题和答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2015-03-20
  • 2021-01-03
  • 2015-11-27
  • 2012-11-21
  • 1970-01-01
相关资源
最近更新 更多