2013-04-27 25 views
8

Ho bisogno di trovare il più precisamente possibile il picco della stima della densità del kernel (valore modale della variabile casuale continua). Posso trovare il valore approssimato:Picco della stima della densità del kernel

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

Ma nel calcolo d$y funzione precisa è noto. Come posso individuare il valore esatto della modalità?

risposta

5

Se ho capito la tua domanda, penso che tu voglia solo una discretizzazione più precisa di x e . A tale scopo, è possibile modificare il valore di n nella funzione density (l'impostazione predefinita è n=512).

Per esempio, confrontare

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

con:

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

Grazie! ;) sembra funzionare in modo abbastanza accurato – 16per9

10

Qui ci sono due funzioni per trattare con i modi. La funzione dmode trova la modalità con il picco più alto (modalità dominante) e n.modes identifica il numero di modalità.

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

Penso che avete bisogno di due passaggi per archiviare quello che vi serve:

1) Trovare il valore x-asse del picco KDE

2) Ottenere il valore desnity del picco

Quindi (se non vi dispiace utilizzando un pacchetto) una soluzione che utilizza il pacchetto hdrcde sarebbe simile a questa:

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']]) 

Edit: Si potrebbe anche usare il

hdrResult[['falpha']] 

se è abbastanza preciso per voi!

Problemi correlati