簡體   English   中英

核密度估計的峰值

[英]Peak of the kernel density estimation

我需要盡可能精確地找到核密度估計的峰值(連續隨機變量的模態值)。 我可以找到近似值:

x<-rlnorm(100)
d<-density(x)
plot(d)
i<-which.max(d$y)
d$y[i]
d$x[i]

但是在計算d$y精確函數是已知的。 如何找到模式的確切值?

以下是處理模式的兩個函數。 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))

如果我理解你的問題,我認為你只是想要更精細地分離xy 為此,您可以在density函數中更改n的值(默認值為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

有:

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

我認為您需要兩個步驟來存檔您需要的內容:

1)找到KDE峰的x軸值

2)獲得峰值的desnity值

所以(如果你不介意使用包),使用hdrcde包的解決方案將如下所示:

require(hdrcde)

x<-rlnorm(100)
d<-density(x)

# calcualte KDE with help of the hdrcde package
hdrResult<-hdr(den=d,prob=0)

# define the linear interpolation function for the density estimation
dd<-approxfun(d$x,d$y)
# get the density value of the KDE peak
vDens<-dd(hdrResult[['mode']])

編輯:你也可以使用

hdrResult[['falpha']]

如果它足夠精准你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM