Problema de codificación de bucle simple

Soy un nuevo usuario de R y he intentado escribir un script para simular la invasión de especies y la estabilidad de la comunidad. Casi lo he terminado y solo tengo un pequeño problema en un bucle.

Tengo un pool de 40 especies (1,2, ...) y creo una comunidad por sucesivas invasiones. Las especies de la comunidad abandonan el grupo de invasores a menos que se extingan (puse un valor de umbral de densidad).

Quiero muchas invasiones (> 4000), así que creé un vector con un número 4000 entre 1 y 40 (orden aleatorio) pero tengo un problema porque mi matriz con la densidad de especies (init.x) no tiene el mismo número de elementos como mi vector.

time<- list(start=0,end=4000,steps=100)
# Initial conditions (set all species to zero in the beginning)
init.x <- runif(n)*0
# generate random order in which species are introduced
init.order<- sample(1:n)
order<-rep(order,100)
random.order<-sample(order,size=length(order))
outt <- init.x
**for (i in 1:4000){
    # Introduce 1 new species (according to vector "random.order") with freq 1000*tol
                # if the species is not yet in the init.x matrix  
    if (init.x[random.order[i]]<tol) {init.x[random.order[i]] <- 1000*tol}**
                # integrate lvm model
    out <-n.integrate(time=time,init.x=init.x,model=lvm)
    # save out and attach it to outt
                  outt <- rbind(outt,out)
    # generate new time window to continue integration
                  time <- list(start=time$end, end = time$end+time$end-time$start,
                     steps=100)
}       

Sé que esto probablemente sea muy simple, pero no puedo encontrar una manera de escribir mi ciclo para tener más invasiones que el número de especies (número de raws en mi matriz).

Muchas gracias,

preguntado el 10 de mayo de 11 a las 14:05

La línea order<-rep(order,100) puede estar causando problemas porque no parece estar inicializando order en cualquier lugar. -

Además, si conoce el tamaño que outt debería terminar, es mejor preasignarlo en lugar de hacerlo crecer en el ciclo con rbind. -

No entiendo tu código. Por ejemplo, ¿qué es n? n es 4000? ¿Qué es tol? y que es n. integrar? Tal vez la gente pueda ayudarte con la información que proporcionaste, pero necesitaría más información para ayudarte. -

3 Respuestas

Probablemente quieras cambiar

# Initial conditions (set all species to zero in the beginning)
init.x <- runif(n)*0
# generate random order in which species are introduced
init.order<- sample(1:n)
order<-rep(order,100)
random.order<-sample(order,size=length(order))

Dentro

# Initial conditions (set all species to zero in the beginning)
init.x <- rep.int(0, n) #should be a lot faster
# generate random order in which species are introduced
random.order<-sample.int(n,size=4000, replace=TRUE)

... para resolver su problema principal (¿comprobar? muestra). No he comprobado el resto de su código, pero es posible que haya espacio para una mayor optimización.

contestado el 10 de mayo de 11 a las 18:05

No tengo claro cuál es tu problema y en qué se está metiendo. outt. Es posible que desee iniciarlo con list().

En cuanto a elegir un invasor aleatorio, puedes probar:

init.x[sample(which(init.x<tol),1)] <- 1000*tol

Esto evita el if declaración y la necesidad de ensayos aleatorios precalculados (que pueden no producir una invasión si se selecciona una especie comunitaria).

contestado el 10 de mayo de 11 a las 19:05

time<- list(start=0,end=1000,steps=1000)
# Initial conditions (set all species to zero in the beginning)
init.x <- runif(n)*0
# generate random order in which species are introduced
order <- sample(1:n)
outt <- init.x
for (i in 1:n){
    # Introduce 1 new species (according to vector "order") with freq 1000*tol
    init.x[order[i]] <- 1000*tol
    # integrate lvm model
    out <-n.integrate(time=time,init.x=init.x,model=lvm)
    # save out and attach it to outt
        outt <- rbind(outt,out)
    # generate new time window to continue integration
        time <- list(start=time$end, end = time$end+time$end-time$start,
                     steps=1000)
}

Respondido 17 ago 13, 03:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.