1

複数の for ループを 1 つのループまたは関数に結合しようとしています。各ループは、保護されているサイトに個人が存在するかどうかを評価し、それに基づいて、各時間ステップで番号 (番号はサイトを表します) を割り当てます。その後、各時間ステップの結果がマトリックスに格納され、後で他の解析で使用されます。私が抱えている問題は、さまざまなシナリオ (10%、50%、100% の保護されたサイト) を評価するために、同じループを数回繰り返していることです。シナリオごとに結果を保存する必要があるため、これを単一のループまたは関数に単純化するより良い方法は考えられません。任意のアイデアや提案をいただければ幸いです。これは非常に小さく、問題の単純化されたアイデアです。元のループは複数の if ステートメントを使用しているため、ループの構造を維持したいと考えています。

N<-10 # number of sites
sites<-factor(seq(from=1,to=N))

sites10<-as.factor(sample(sites,N*1))     
sites5<-as.factor(sample(sites,N*0.5)) 
sites1<-as.factor(sample(sites,N*0.1)) 

steps<-10
P.stay<-0.9

# storing results

result<-matrix(0,nrow=steps) 
time.step<-seq(1,steps)
time.step<-data.frame(time.step)
time.step$event<-0

j<-numeric(steps)
j[1]<-sample(1:N,1)
time.step$event[1]<-j[1] 

for(i in 1:(steps-1)){

    if(j[i] %in% sites1){   

      if(rbinom(1,1,P.stay)==1){time.step$event[i+1]<-j[i+1]<-j[i]} else 

  time.step$event[i+1]<-0

  }

    time.step$event[i+1]<-j[i+1]<-sample(1:N,1)

}   

results.sites1<-as.factor(result)

###

result<-matrix(0,nrow=steps) 
time.step<-seq(1,steps)
time.step<-data.frame(time.step)
time.step$event<-0

j<-numeric(steps)
j[1]<-sample(1:N,1)
time.step$event[1]<-j[1] 

for(i in 1:(steps-1)){

  if(j[i] %in% sites5){   

    if(rbinom(1,1,P.stay)==1){time.step$event[i+1]<-j[i+1]<-j[i]} else 

      time.step$event[i+1]<-0

  }

  time.step$event[i+1]<-j[i+1]<-sample(1:N,1)

}   

results.sites5<-as.factor(result)

###

result<-matrix(0,nrow=steps) 
time.step<-seq(1,steps)
time.step<-data.frame(time.step)
time.step$event<-0

j<-numeric(steps)
j[1]<-sample(1:N,1)
time.step$event[1]<-j[1] 

for(i in 1:(steps-1)){

  if(j[i] %in% sites10){   

    if(rbinom(1,1,P.stay)==1){time.step$event[i+1]<-j[i+1]<-j[i]} else 

      time.step$event[i+1]<-0

  }

  time.step$event[i+1]<-j[i+1]<-sample(1:N,1)

}   

results.sites10<-as.factor(result)

#

results.sites1
results.sites5
results.sites10
4

1 に答える 1

2

これを行う代わりに:

sites10<-as.factor(sample(sites,N*1))     
sites5<-as.factor(sample(sites,N*0.5)) 
sites1<-as.factor(sample(sites,N*0.1)) 

3 つの変数のそれぞれに対して個別のループを実行すると、一般的なループを作成して関数に入れ、関数の 1 つを使用-applyして特定のパラメーターでそれを呼び出すことができます。例えば:

N<-10 # number of sites
sites<-factor(seq(from=1,to=N))
steps<-10
P.stay<-0.9

simulate.n.sites <- function(n) {
  n.sites <- sample(sites, n)

  result<-matrix(0,nrow=steps) 
  time.step<-seq(1,steps)
  time.step<-data.frame(time.step)
  time.step$event<-0

  j<-numeric(steps)
  j[1]<-sample(1:N,1)
  time.step$event[1]<-j[1] 

  for(i in 1:(steps-1)){

    if(j[i] %in% n.sites){ 

  ...etc...

  return(result)

}

results <- lapply(c(1, 5, 10), simulate.n.sites)

resultsこれで、3 つの行列要素を持つリストになります。

重要なのは、自分自身を繰り返す場所を特定し、それらの領域を関数にリファクタリングすることです。これはより簡潔であるだけでなく、将来拡張するのも簡単です。2 サイトのサンプルをご希望ですか? に渡すベクトルに 2 を入れますlapply

-apply関数のファミリーに慣れていない場合は、それらを調べてください。

また、あなたのコードの残りの部分の多くは単純化できるのではないかと思いますが、私には意味がわからないように、あなたはそれを骨抜きにしすぎていると思います。たとえば、条件に基づいて time.step$event の要素を定義しますが、その要素を上書きします。確かに、これは実際のコードが行うことではありませんか?

于 2013-06-01T02:28:34.273 に答える