2013-04-27 11 views
8

मुझे कर्नेल घनत्व अनुमान (निरंतर यादृच्छिक चर के मोडल मान) की चोटी के रूप में यथासंभव सटीक रूप से खोजने की आवश्यकता है।कर्नेल घनत्व अनुमान का पीक

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

लेकिन जब की गणना d$y सटीक समारोह में जाना जाता है: मैं अनुमानित मूल्य मिल सकता है। मैं मोड के सटीक मूल्य का पता कैसे लगा सकता हूं?

उत्तर

5

यदि मैं आपका प्रश्न समझता हूं, तो मुझे लगता है कि आप x और y का एक बेहतर विघटन करना चाहते हैं। ऐसा करने के लिए, आप 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 
+0

धन्यवाद! ;) यह बहुत सटीक काम करता प्रतीत होता है – 16per9

10

यहाँ मोड से निपटने के लिए दो कार्य कर रहे हैं। डीएमओडी फ़ंक्शन उच्चतम शिखर (हावी मोड) के साथ मोड पाता है और 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)) 
0

मैं तुम्हें कि तुम क्या जरूरत है संग्रह करने के लिए दो कदम की जरूरत है:

1) केडीई शिखर

2 की X- अक्ष मान ज्ञात) चोटी के 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']] 

अगर यह आप के लिए काफी सटीक है!

संबंधित मुद्दे