Do not use order
when you want rank
.
Background
The update of “A comparison of some heuristic optimization methods” is due to the bug that Luca Scrucca spotted.
Actually, it is two bugs:
- I used
order
when I meantrank
- This somehow escaped being in The R Inferno
Problem
What I said in my code was (essentially):
ord <- order(x)
Now what I wanted was the order of the values in x. What I got was the permutation of indices that would put x into sorted order. Only under the rarest of circumstances are these the same. But they sound oh so similar.
What I really wanted to say was:
ord <- rank(x, ties.method="first")
(But see below.)
Timing
Using order
in this case doesn’t get us where we want to go. The advantage is that it gets us there really fast. The rank
function is much slower. (Timings in R version 2.15.0.)
> x10 <- runif(10) > system.time(for(i in 1:1e4) order(x10)) user system elapsed 0.11 0.00 0.11 > system.time(for(i in 1:1e4) rank(x10, ties.method="first")) user system elapsed 1.22 0.00 1.34 > x100 <- runif(100) > system.time(for(i in 1:1e4) order(x100)) user system elapsed 0.14 0.00 0.17 > system.time(for(i in 1:1e4) rank(x100, ties.method="first")) user system elapsed 1.61 0.00 1.64 > x1000 <- runif(1000) > system.time(for(i in 1:1e4) order(x1000)) user system elapsed 1.14 0.02 1.15 > system.time(for(i in 1:1e4) rank(x1000, ties.method="first")) user system elapsed 3.76 0.00 3.82
rank
is clearly slower than order
. The whole point, though, is that these two commands give us different things. The command order(order(x))
is another way to get what our rank
command gives us. Even though it is a bit kludgy, it can be significantly faster:
> system.time(for(i in 1:1e4) rank(x10, ties.method="first")) user system elapsed 1.39 0.00 1.39 > system.time(for(i in 1:1e4) order(order(x10))) user system elapsed 0.23 0.00 0.24 > system.time(for(i in 1:1e4) rank(x100, ties.method="first")) user system elapsed 1.56 0.00 1.56 > system.time(for(i in 1:1e4) order(order(x100))) user system elapsed 0.36 0.00 0.38 > system.time(for(i in 1:1e4) rank(x1000, ties.method="first")) user system elapsed 3.94 0.00 4.00 > system.time(for(i in 1:1e4) order(order(x1000))) user system elapsed 2.17 0.00 2.17 > x10000 <- runif(10000) > system.time(for(i in 1:1e4) rank(x10000, ties.method="first")) user system elapsed 34.88 0.00 35.01 > system.time(for(i in 1:1e4) order(order(x10000))) user system elapsed 29.51 0.00 29.94
Pingback: A comparison of some heuristic optimization methods | Portfolio Probe | Generate random portfolios. Fund management software by Burns Statistics