[R-es] optimización de código en R

"Olivier Nuñez" onunez en unex.es
Vie Ene 18 11:14:19 CET 2013


Carlos,

tu ultima opción es de lejos la más rápida entre las insesgadas.
Por cierto, ya que te tengo, el adjetivo "craso" se puede utilizar con otro
sustantivo que no sea "error"?
Un abrazo. Olivier

> Hola, ¿qué tal?
>
> Sí, mi opción 2 ha sido un craso error. Aquí va otra un poco más fina:
>
> sim4 <- function(nreps)  {
>   nb1 <- 10  # 10 blue marbles in Urn 1
>   nb2 <- 6  # 6 blue marbles orig. in Urn 2
>   n1  <- 18  # number of marbles in Urn 1 at 1st pick
>   n2  <- 13  # number of marbles in Urn 2 at 2nd pick
>
>   # number of cases in which you pick blue in first urn
>   n.blue <- rbinom(1, nreps, nb1 / n1)
>
>   n.blue.1 <- rbinom(1, nreps - n.blue, nb2 / n2)
>   n.blue.2 <- rbinom(1, n.blue, (nb2+1) / n2)
>
>   (n.blue.1 + n.blue.2) / nreps
> }
>
>> system.time(sim4(100000))
>    user  system elapsed
>   0.000   0.000   0.001
>> system.time(sim1(100000))
>    user  system elapsed
>   0.904   0.000   0.918
>
> Un saludo,
>
> Carlos J. Gil Bellosta
> http://www.datanalytics.com
>
> 2013/1/18 Olivier Nuñez <onunez en unex.es>:
>> Tania,
>>
>> aquí se optimiza vectorizando el bucle (ver The Art of R Programming: A Tour
>> of Statistical Software Design de Norman Matloff)
>>
>> sim3 <- function(nreps)  {
>>
>>    nb1 <- 10  # 10 blue marbles in Urn 1
>>    nb2 = 6  # 6 blue marbles orig. in Urn 2
>>    n1 <- 18  # number of marbles in Urn 1 at 1st pick
>>    n2 <- 13  # number of marbles in Urn 2 at 2nd pick
>>    count <- 0  # number of repetitions in which get blue from Urn 2
>>    u <- matrix(c(runif(2*nreps)),nrow=nreps,ncol=2)
>>    cndt <- (u[,1] <= nb1/n1) & (u[,2] <= (nb2+1)/n2) | (u[,1] > nb1/n1) &
>> (u[,2] <= nb2/n2)
>>    return(mean(cndt))  # est. P(pick blue from Urn 2)
>> }
>>
>> Un saludo. Olivier
>>
>> PD: creo que la función que propone Carlos lleva a una estimación sesgada.
>>
>>> system.time(sim3(100000))
>>    user  system elapsed
>>   0.039   0.018   0.058
>>> system.time(sim1(100000))
>>    user  system elapsed
>>   2.002   0.035   2.034
>>
>> -- ____________________________________
>>
>> Olivier G. Nuñez
>> Email: onunez en unex.es
>> http://matematicas.unex.es/~onunez
>> Tel : +34 663 03 69 09
>> Departamento de Matemáticas
>> Universidad de Extremadura
>>
>> ____________________________________
>>
>>
>>
>>
>>
>> El 17/01/2013, a las 20:00, Tania Patiño escribió:
>>
>>
>>>  nb1 <- 10  # 10 blue marbles in Urn 1
>>>    n1 <- 18  # number of marbles in Urn 1 at 1st pick
>>>    n2 <- 13  # number of marbles in Urn 2 at 2nd pick
>>
>>
>> _______________________________________________
>> R-help-es mailing list
>> R-help-es en r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>


--
____________________________________


Olivier G. Nuñez
Email: onunez en unex.es
http://kolmogorov.unex.es/~onunez
Tel : +34 663 03 69 09
Departamento de Matemáticas
Universidad de Extremadura



Más información sobre la lista de distribución R-help-es