2017-01-17 7 views
1

マトリックスベースの母集団モデルを作成しましたが、散らばっている個体が行列間を移動できるように、異なる動物グループを表すために複数の行列を同時に実行したい。もともと、私は2番目の行列を得るためにすべてを繰り返していましたが、特定の条件(特定の行列が実行を停止する、つまりそのグループが終了したとき)でforループとbreak()を使ってモデルを実行したので、単なる行列ではなく、モデル全体を止めることができます。複数の行列モデルを同時に実行する際に問題が発生する

私は誰かがモデルをコード化する最良の方法について提案しているので、forループ全体を中断して停止するのではなく、その特定のマトリックスを越えて実行することを止めていたのだろうかと思っていました。私は少し困惑しています。私は以下の1つの行列の1つの実行を含みます。

また、誰かが9つのマトリックスを作成して実行するより効率的な方法を持っている場合、9回のアドバイスを書き出すよりもずっと感謝しています。

n.steps <- 100 
mats <- array(0,c(85,85,n.steps)) 
ns <- array(0,c(85,n.steps)) 
ns[1,1]<-0 
ns[12,1]<-rpois(1,3) 
ns[24,1]<-rpois(1,3) 
ns[85,1] <- 1 
birth<-4 
nextbreed<-12 
for (i in 2:n.steps){ 
    # set up an empty matrix; 
    mat <- matrix(0,nrow=85,ncol=85) 
    surv.age.1 <- 0.95 
    x <- 2:10 
    diag(mat[x,(x-1)]) <- surv.age.1 
    surv.age.a <- 0.97 
    disp <- 1:74 
    disp <- disp*-0.001 
    disp1<-0.13 
    disp<-1-(disp+disp1) 
    survdisp<-surv.age.a*disp 
    x <- 11:84 
    diag(mat[x,(x-1)])<-survdisp 
    if (i == nextbreed) { 
    pb <- 1 
    } else { 
    pb <- 0 
    } 

    if (pb == 1) { 
    (nextbreed <- nextbreed+12) 
    } 
    mat[1,85] <- pb*birth 
    mat[85,85]<-1 
    death<-sample(c(replicate(1000, 
          sample(c(1,0), prob=c(0.985, 1-0.985), size = 1))),1) 
    if (death == 0) { 
    break()} 

    mats[,,i]<- mat 
    ns[,i] <- mat%*%ns[,i-1] 
} 

group.size <- apply(ns[1:85,],2,sum) 
plot(group.size) 
View(mat) 
View(ns) 
+1

おそらく、計算する必要があるかどうかを決定するフラグを各マトリックスに設定します。ループの中で 'if'を使ってテストしてください – dww

+1

空間的な場所の間に分散がある場合、それが孤立した場所を再コロニー化できますか? (マトリックス全体を0に設定することでグループを無視しないことが考慮されているのだろうかと思っています) –

+0

はい、ディスペンサが回転できるようにすることが最終的な目的です - しかし、そのカラムを0に設定して、利用可能な場合は犬を使用してください。 – redferry

答えて

1

他の誰かがTwitterで示唆したように、1つの解決策は、deathが発生したときに、単純にすべて0に行列をオンにするかもしれません。それは地元の人口が消える確率はdeathのように私に見える?その場合、母集団全体を0にするだけの生物学的意味があるようです。

その他の小さな変更点:レプリケートシミュレーションのリストを作成しました。これを簡単に要約できます。

私が正しく理解していれば、

death<-sample(c(replicate(1000,sample(c(1,0), prob=c(0.985, 1-0.985), size =1))),1) 

は "地元住民が確率で完全に1.5%死ぬ" と言います。その場合は、rbinom()と置き換えることができます。私は下で行い、私のプロットはあなたのコードで作ったものと似ています。

希望に役立ちます!

lots <- replicate(100, simplify = FALSE, expr = { 
    for (i in 2:n.steps){ 
    # set up an empty matrix; 
    mat <- matrix(0,nrow=85,ncol=85) 
    surv.age.1 <- 0.95 
    x <- 2:10 
    diag(mat[x,(x-1)]) <- surv.age.1 
    surv.age.a <- 0.97 
    disp <- 1:74 
    disp <- disp*-0.001 
    disp1<-0.13 
    disp<-1-(disp+disp1) 
    survdisp<-surv.age.a*disp 
    x <- 11:84 
    diag(mat[x,(x-1)])<-survdisp 
    if (i == nextbreed) { 
     pb <- 1 
    } else { 
     pb <- 0 
    } 

    if (pb == 1) { 
     (nextbreed <- nextbreed+12) 
    } 
    mat[1,85] <- pb*birth 
    mat[85,85]<-1 
    death<-rbinom(1, size = 1, prob = 0.6) 
    if (death == 0) { 
     mat <- 0 
    } 

    mats[,,i]<- mat 
    ns[,i] <- mat%*%ns[,i-1] 
    } 
    ns 
}) 

lapply(lots, FUN = function(x) apply(x[1:85,],2,sum)) 
関連する問題