Speed up a loop in R -


i using following function estimate kernel density of data

kdens = function(x,h,n) {          fx = matrix(0,n,1)          kx = ak(x,h,n)          (i in 1:n) {          fx[i] = sum(kx[i,], na.rm=t)/n          }          return(fx) } 

i know not first question speeding loop. checked around in site, found using apply function faster, not case if manage correctly set loop.

in above code, every "not needed thing" left out of loop, - if understood correctly - suggested speed computation. however, made comparison between above kdens function , density function implemented in r default. well, density needs 1 or 2 seconds, while kdens needs ~30 on machine.

trywiththis <- rnorm(4800) x = trywiththis n = length(trywiththis) h = 1.059*sd(trywiththis , na.rm=t)*(n^(-0.2)) 

edit: information provided not complete

kerf = function(x){ return(dnorm(x)) } ker = function(x,x0,h){        temp = kerf((x-x0)/h)/h        return(temp)        }  ak = function(x,h,n) {       k = array(0,c(n,n))                           (i in 1:n) {          (j in 1:n) {          k[i,j] = ker(x[i],x[j],h)         }}        return(k) } 

suppose want speed kdens function, how ?

try this... original 4800 length dataset takes 2.5 seconds.

kdens2 = function(x,h,n) { kx <- outer( x , x , fun = function(x,y) dnorm( ( x-y ) / h ) / h ) fx <- as.matrix( rowsums( kx ) / n , ncol = 1 ) return( fx ) } 

testing

set.seed(1) trywiththis <- rnorm(480) x = trywiththis n = length(trywiththis) h = 1.059*sd(trywiththis , na.rm=t)*(n^(-0.2))  #produce same result? (posibly not identical because of 'dnorm' function) all.equal( kdens(x,h,n) , kdens2(x,h,n) ) [1] true  #rough timing on n=480 length data... system.time( kdens2(x,h,n) ) #   user  system elapsed  #   0.01    0.00    0.02   system.time( kdens(x,h,n) ) #   user  system elapsed  #    2.7     0.0     2.7  

and when n=4800...

system.time( kdens2(x,h,n) )    user  system elapsed     2.33    0.19    2.51 

Comments

Popular posts from this blog

java - Intellij Synchronizing output directories .. -

git - Initial Commit: "fatal: could not create leading directories of ..." -