简单的循环编码问题

时间:2011-05-10 14:00:42

标签: r loops size sample

我是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 个答案:

答案 0 :(得分:5)

您可能想要更改

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

...解决您的主要问题(检查?样本)。我没有检查你们其余的代码,但可能还有更多的优化空间。

答案 1 :(得分:0)

我不清楚你的问题是什么,以及它进入outt的内容。您可能希望使用list()初始化它。

至于选择一个随机入侵者你可以尝试:

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

这避免了if语句以及预先计算的随机试验的需要(如果选择了社区物种,可能无法产生入侵)。

答案 2 :(得分:0)

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