Проблема простого циклического кодирования - PullRequest
1 голос
/ 10 мая 2011

Я новый пользователь R, и я попытался написать сценарий для аналогичного вторжения видов и стабильности сообщества.Я почти закончил это, и у меня есть только одна крошечная проблема в цикле.

У меня есть пул из 40 видов (1,2, ...), и я создаю сообщество путем последовательных вторжений.Виды в сообществе покидают пул захватчиков, если они не исчезнут (я поставил пороговое значение плотности).

Я хочу много вторжений (> 4000), поэтому я создал вектор с числом 4000 от 1 до 40 (random.order) но у меня есть проблема, потому что моя матрица с видовой плотностью (init.x) имеет не то же количество элементов, что и мой вектор.

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)
}       

Я знаю, что это, вероятно, очень просто, но яЯ не могу найти способ написать мой цикл, чтобы иметь больше инвазий, чем количество видов (количество строк в моей матрице).

Большое спасибо,

Ответы [ 3 ]

5 голосов
/ 10 мая 2011

Возможно, вы захотите изменить

# 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))

На

# 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)

... для решения вашей основной проблемы (проверьте? Пример).Я не проверял остальную часть вашего кода, но может быть место для дальнейшей оптимизации.

0 голосов
/ 17 августа 2013
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)
}
0 голосов
/ 10 мая 2011

Мне не ясно, в чем ваша проблема, и в чем дело outt.Вы можете захотеть инициализировать его с помощью list().

Что касается выбора случайного захватчика, вы можете попробовать:

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

Это позволяет избежать оператора if и необходимости предварительновычисленные случайные испытания (которые могут не привести к вторжению, если выбран вид сообщества).

...