He bucles for anidados como a continuación. Necesito p:p=1:300, y n=20. La función de «marca» es el modelo de mi interés(Paquete de RMark). Sé rbind puede ser lento, pero no tengo idea de lo que debe ser usado para reemplazar. De lo contrario, ¿qué otra cosa puedo hacer para hacer que esta función es más rápido? Gracias.

foo<-function(data, p, q, n){
results.frame <- data.frame()
for (i in 1:n){
    for (i in p:q) {
        run.model<-mark(data[sample(nrow(data), i),], model="Occupancy")       
        results<-data.frame(summary(run.model)$real$p, Occupancy=summary(run.model)$real$Psi, se.p=t(as.matrix(summary(run.model, se=T)$real$p$se)), se.Psi=summary(run.model, se=T)$real$Psi$se, stations=i)
        results.frame<-rbind(results.frame, results)
        } 
    }
write.table(results.frame, "C:\\RWorkspace\\simulation_results.txt")
return(results.frame)
}
  • 1) usted debe asignar previamente las dimensiones de results.frame y, a continuación, rellene la indexación. 2) ¿usted realmente necesita un data.frame() o un matrix() suficiente?. Todos sus resultados parece que va a ser valores numéricos, por lo que una matriz puede ser suficiente. 3) cmpfun() su función a través de la compiler paquete para ver si se consigue que los reductores de velocidad. 4) nos Dicen donde la función mark() viene de como no está en la base y su pregunta no es reproducible para que la gente encontrará que es difícil ofrecer consejo real.
  • 1) Suena razonable, voy a probar eso. 2) Sí, todas mis salidas son numéricos así que voy a cambiar la matriz(). 3) voy a echar un vistazo a cmpfun() y complier. 4) función de mark() viene de paquete «RMark», es para el animal la dinámica de la población. Gracias por sus sugerencias.
  • También, usted está utilizando i en ambos bucles; mejor uso de las diferentes variables para que pueda asegurarse de que usted está utilizando la i desea dentro del bucle.
  • Veo, gracias.
InformationsquelleAutor lamushidi | 2012-09-01

1 Comentario

  1. 0

    Sí, rbind puede ser lento; el más rápido cosa es por lo general para hacer la matriz del tamaño correcto para empezar y rellenar adecuadamente. Es también generalmente más rápido para llenar una matriz en lugar de un marco de datos.

    Sin embargo, con el tamaño que usted indique, yo sospecho que mark es lo que está ralentizando la función de abajo y usted no conseguirá mucho notable aceleración por hacer eso. Sería fácil probar que al almacenar un único resultado en run.model y, a continuación, comentar que la línea de su bucle; que le dirá cuánto tiempo es el gasto almacenar los resultados. (También se podría «perfil» de la función, pero esto sería más sencillo.)

    EDIT: en realidad estoy equivocado; el tamaño de indicar es lo suficientemente grande que el rbind es muy posible que causen problemas. En mi sistema, que es bastante rápido y tiene una cantidad decente de memoria, toma 7.73 sec a rbind el uso de tramas de datos con n=20 y sólo el 0.09 sec con n=1, tan claramente parte de la memoria de batido que está sucediendo. Como para speedup, con n=20 sólo se tarda 1.00 s a rbind matrices y 0.033 sec para rellenarlo.

    foo <- function(data, p, q, n){
      # make a single results line; remove this line when you put in your code 
      results <- c(1, Occupancy=2, se.p=3, se.Psi=4, stations=5)
      # make the matrix the right size to start with
      results.frame <- matrix(ncol=5, nrow=(q-p+1)*n)
      for (i in 1:n){
        for (j in p:q) {
          # get results here; commented out to show loop speed only
          # put in your actual code here instead
          results.frame[ 1+(i-1)*(q-p+1)+(j-p), ] <- results
        } 
      }
      # get the names right by taking the names from the last time through the loop
      colnames(results.frame) <- names(results)
      results.frame
    }
    • Gracias por tu consejo. Probé por primera vez el p:q=1:200 sin n y que tomó sólo 8 minutos para finalizar. Luego he añadido otro bucle for para n y ejecutar p:q=1:300, n=20, luego se tomó casi 5 horas para terminar. Así que pensé que podría ser el bucle anidado en lugar de mark(). ¿Qué entiende usted por commenting that line out of my loop? Me disculpo primero si es una pregunta tonta. Yo no soy un programador profesional y sigo aprendiendo.
    • No puedo esperar a probar el código modificado. Pero tengo que esperar hasta que mi actual simulación termina. T_T

Dejar respuesta

Please enter your comment!
Please enter your name here