核密度估计的峰值

And*_*ndy 10 r kernel-density

我需要尽可能精确地找到核密度估计的峰值(连续随机变量的模态值).我可以找到近似值:

x<-rlnorm(100)
d<-density(x)
plot(d)
i<-which.max(d$y)
d$y[i]
d$x[i]
Run Code Online (Sandbox Code Playgroud)

但是在计算d$y精确函数时已知.如何找到模式的确切值?

Jef*_*ans 11

以下是处理模式的两个函数.dmode函数查找具有最高峰值的模式(支配模式),n.modes识别模式的数量.

    dmode <- function(x) {
      den <- density(x, kernel=c("gaussian"))
        ( den$x[den$y==max(den$y)] )   
    }  

    n.modes <- function(x) {  
       den <- density(x, kernel=c("gaussian"))
       den.s <- smooth.spline(den$x, den$y, all.knots=TRUE, spar=0.8)
         s.0 <- predict(den.s, den.s$x, deriv=0)
         s.1 <- predict(den.s, den.s$x, deriv=1)
       s.derv <- data.frame(s0=s.0$y, s1=s.1$y)
       nmodes <- length(rle(den.sign <- sign(s.derv$s1))$values)/2
       if ((nmodes > 10) == TRUE) { nmodes <- 10 }
          if (is.na(nmodes) == TRUE) { nmodes <- 0 } 
       ( nmodes )
    }

# Example
x <- runif(1000,0,100)
  plot(density(x))
    abline(v=dmode(x))
Run Code Online (Sandbox Code Playgroud)


csg*_*pie 7

如果我理解你的问题,我认为你只是想要一个更好的离散化xy.要做到这一点,你可以改变的值ndensity功能(默认为n=512).

例如,比较

set.seed(1)
x = rlnorm(100)
d = density(x)
i = which.max(d$y)
d$y[i]; d$x[i]
0.4526; 0.722
Run Code Online (Sandbox Code Playgroud)

有:

d = density(x, n=1e6)
i = which.max(d$y)
d$y[i]; d$x[i]
0.4525; 0.7228
Run Code Online (Sandbox Code Playgroud)