2

関数がシーケンスを引数としてとらず、関数がシーケンスの前の値で関数自体から返された値を使用する場合、シーケンスに関数を適用するのが難しい。

次の問題があります。私のメイン メソッド functionでは、最初に , , ,をmainn初期化し、それを関数の引数として使用します。(値を返し、 3 つの値を返すという意味で、私のとが正しく/適切に機能していることを確信していることに注意してください)famu.amu.bsigmastep2px.q4step2px.q4step2

これが私の質問が入るところです。シーケンスに対して適用を実行したいのですがstep2、シーケンスに対して適用するたびに (最初の反復を除く)、step2関数は初期値ではなく、前のfa.itermu.a.iter、の値を使用します。これはRで行うことができますか?それとも、この種の質問には for ループを使用する必要がありますか?mu.b.iterstep2

forループを使用してこれを行うことができました。しかし、私は R についてもっと学びたいと思っています。問題を回避するために使用できる (より効率的な) 特定のコマンドはありますか?

#this function returns a value    
px.q4 <- function(fa, mu.a, mu.b,sigma)
{   
  v <- fa + mu.a + mu.b * sigma
  v
}

#this function returns 3 values, fa.iter, mu.a.iter, and mu.b.iter
#for completeness I include the full code of what i am trying to do. 
#But all you need to know is that the function step2 returns 3 values .
step2 <- function(fa, mu.a, mu.b)
{

  #set prev = iter values // this also allow set initial values = prev in 
  #the 1st iteration
  mu.a.prev <- mu.a.iter
  mu.b.prev <- mu.b.iter
  fa.prev <- fa.iter

  #draw a trail point x.trail from propsal distribution ~ N(x_i-1,0.1)
  mu.a.trail <- rnorm(1, mu.a.prev, 0.1)
  mu.b.trail <- rnorm(1, mu.b.prev, 0.1)
  fa.trail <- rnorm(1, fa.prev, 0.1)
  while(fa.trail < 0 || fa.trail > 1)         
  {
    fa.trail <- rnorm(1, fa.prev, sigma)
  }
  #if p(x_trail) >= p(x_i-1) set x_i = x_trail
  a <- px.q4(fa.trail, mu.a.trail, mu.b.trail, sigma) 
  b <- px.q4(fa.prev ,mu.a.prev , mu.b.prev,sigma)
  if(a >= b)
  {
    mu.a.iter <- mu.a.trail
    mu.b.iter <- mu.b.trail
    fa.iter <- fa.trail
  }else{
    r <- runif(1,min = 0, max = 1)
    if(r < a/b){
      mu.a.iter <- mu.a.trail
      mu.b.iter <- mu.b.trail
      fa.iter <- fa.trail
    }else{
      mu.a.iter <- mu.a.prev
      mu.b.iter <- mu.b.prev
      fa.iter <- fa.prev
    }
  }

  res <-  list(mu.a.iter,  mu.b.iter,  fa.iter)
  res
}
#main body

mainn <- function(n,fa,mu.a,mu.b)
{
  sigma <- 0.3
  mu.a.init <- mu.a               #initial values 
  mu.b.init <- mu.b
  fa.init <- fa           #(must be between 0 and 1)

  #set initial values = iter values (for entering for loop)
  mu.a.iter <- mu.a.init
  mu.b.iter <- mu.b.init
  fa.iter <- fa.init

  #where to the logical flaw comes in and how can I overcome it
    y <- sapply(n,FUN = step2)

}
4

1 に答える 1

4

リストに関数を再帰的に適用するために使用できますReduce。たとえば、

Reduce(`+`, 1:10, accumulate=TRUE)

と同等cumsum(1:10)です。

あなたの場合、リストに関数を適用するのではなく、単に繰り返しますReduce.2番目の引数を無視すれば、引き続き使用できます。

# It is easier if your function takes a vector and returns a vector.
# The second argument is ignored.
step2 <- function(x, u) cumsum(x) + rnorm(length(x))
r <- Reduce(step2, 1:100, init=c(0,0,0), accumulate = TRUE)

しかし、ループを使用することに問題はありません。関数が非常に高速でない限り、大幅に遅くなることはありません。

于 2012-11-27T12:28:04.113 に答える