[R] Is R the right choice for simulating first passage times of random walks?

Dennis Murphy djmuser at gmail.com
Mon Aug 1 06:10:12 CEST 2011


Hi Steve:

Very, very nice. Thanks for the useful Rcpp script. I'm not surprised
that a C++ version blows my humble little R function out of the water
:) I noticed that the R function ran a lot more slowly when the
sojourns were very long. It suggests that algorithms that entail
conditional iteration are quite likely to be better off written in a
compiled programming language that can communicate with R. It also
shows off the capabilities of the Rcpp package.

Best regards,
Dennis

On Sun, Jul 31, 2011 at 8:32 PM, Steve Lianoglou
<mailinglist.honeypot at gmail.com> wrote:
> Hi,
>
> I haven't been following this thread very closely, but I'm getting the
> impression that the "inner loop" that's killing you folks here looks
> quite simple (assuming it is the one provided below).
>
> How about trying to write the of this `f4` function below using the
> rcpp/inline combo. The C/C++ you will need to write looks to be quite
> trivial, let's change f4 to accept an x argument as a vector:
>
> I've defined f4 in the same way as Dennis did:
>
>> f4 <- function()
>>  {
>>     x <- sample(c(-1L,1L), 1)
>>
>>      if (x >= 0 ) {return(1)} else {
>>           csum <- x
>>           len <- 1
>>               while(csum < 0) {
>>                   csum <- csum + sample(c(-1, 1), 1)
>>                   len <- len + 1
>>                                          }     }
>>      len
>>  }
>
> Now, let's do some inline/c++ mojo:
>
> library(inline)
> inc <- "
> #include <stdio.h>
> #include <stdlib.h>
> #include <time.h>
> "
>
> fxx <-cxxfunction(includes=inc, plugin="Rcpp", body="
>  int len = 1;
>  int x = ((rand() % 2 ) == 0) ? 1 : -1;
>  int csum = x;
>
>  while (csum < 0) {
>    x = ((rand() % 2 ) == 0) ? 1 : -1;
>    len++;
>    csum = csum + x;
>  }
>
>  return wrap(len);
> ")
>
> Assuming I've faithfully translated this into c++, the timings aren't
> all that comparable.
>
> Doing 500 replicates with the pure R version:
>
> set.seed(123)
> system.time(out <- replicate(500, f4()))
>   user  system elapsed
>  31.525   0.120  32.510
>
> Doing 10,000 replicates using the fxx function doesn't even break a sweat:
>
> system.time(outxx <- replicate(10000, fxx()))
>   user  system elapsed
>  0.371   0.001   0.373
>
> range(out)
> [1]       1 1994308
>
> range(outxx)
> [1]        1 11909394
>
> Hope I'm not too off of the mark, here.
> -steve
> --
> Steve Lianoglou
> Graduate Student: Computational Systems Biology
>  | Memorial Sloan-Kettering Cancer Center
>  | Weill Medical College of Cornell University
> Contact Info: http://cbio.mskcc.org/~lianos/contact
>



More information about the R-help mailing list