在r中有没有办法自动找到多个模式?

w6lpcovy  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(97)

我有一个向量值,我想找到统计模式。我最近了解到一个函数multimode::locmodes,它可以找到我想要的模式的位置。然而,我认为该函数假设我已经知道数据中存在的模式的数量。
例如,给定这个数据x,我可以绘制一个直方图,发现可能有3种模式。然后我可以使用locmodes和模式数量mod0 = 3来获取位置。然而,这种方法要求我已经知道mod0的值?有没有更编程的方法来找到mod0的值?

set.seed(123)
x <- c(rnorm(250, 0.125, 0.03), rnorm(25, 0.85, 0.05), rnorm(200, 1.24, 0.02))
hist(x)

字符串

mm <- multimode::locmodes(x, mod0 = 3)
mm
#> 
#> Estimated location
#> Modes: 0.1222717  0.853707   1.24139 
#> Antimodes: 0.4918366  1.060701 
#> 
#> Estimated value of the density
#> Modes:   4.4179  0.3331802  3.866845 
#> Antimodes: 8.32699e-13  0.001885466 
#> 
#> Critical bandwidth: 0.0383606


创建于2023-11-11使用reprex v2.0.2

t2a7ltrp

t2a7ltrp1#

你可以在带宽向量上循环

> bw <- seq.int(.02, .5, len=100)
> r <- sapply(bw, \(i) multimode::nmodes(x, i))
> plot(r, log='y', type='s', yaxt='n'); axis(2, 1:1e5)

字符串
并以图形方式评估

它建议了三种模式,因为从3到下一个更高的数字的步长是“非常高的”。也许你可以使用95%quantile,但即使这样也不能提供太多的保护来防止任意性。

> n_mod <- quantile(r, .95)
> mm <- multimode::locmodes(x, mod0=n_mod)
Warning message:
In multimode::locmodes(x, mod0 = n_mod) :
  If the density function has an unbounded support, artificial modes may have been created in the tails
> multimode::locmodes(x, mod0=n_mod, display=TRUE)

Estimated location
Modes: 0.1222717  0.853707   1.24139 
Antimodes: 0.4918366  1.060701 

Estimated value of the density
Modes:   4.4179  0.3331802  3.866845 
Antimodes: 8.326824e-13  0.001885466 

Critical bandwidth: 0.0383606

Warning message:
In multimode::locmodes(x, mod0 = n_mod, display = TRUE) :
  If the density function has an unbounded support, artificial modes may have been created in the tails

multimode::sizer还建议了三种模式,请查看?multimode::sizer的参考资料,了解它们是如何确定的:

> summary(multimode::sizer(x, display=FALSE))

The estimated modes are located between the following values
(for the log10 bandwidths range indicated in parenthesis)

Mode 1:  0.10288 | 0.649395 (-1.672682 0.09191453)
Mode 2:  1.009708 | 1.253947 (-1.672682 -0.3487716)
Mode 3:  0.7920692 | 0.9226525 (-1.205673 -1.061009)

  • 数据:*
set.seed(123)
x <- c(rnorm(250, 0.125, 0.03), rnorm(25, 0.85, 0.05), rnorm(200, 1.24, 0.02))

a64a0gku

a64a0gku2#

一个快速而肮脏的方法是找到内核密度的峰值:

with(density(x, bw = 0.05), x[which(diff(sign(diff(y))) == -2) + 1])
#> [1] 0.1221060 0.8584025 1.2400746

字符串
注意,这给出了与locmodes几乎相同的结果。
bw参数设置为更高的值是一种平滑噪声的方法。它需要一些图形探索来找到正确的值。

相关问题