Как передать управление предыдущей итерации в цикле for в R

Я запускаю цикл for в R (как часть анализа мощности модели, которую я запускал с R2jags). В какой-то момент я хочу знать, сошлись ли мои цепочки MCMC, если нет, я хочу пропустить эту итерацию цикла. Однако я не хочу переходить к следующей итерации, я хочу, чтобы цикл снова начинался с той же итерации. В настоящее время я использую команду «Далее», но это пропускает итерацию. Как указать моему циклу for выполнить дополнительную итерацию? Ниже приведен весь код, но в основном меня беспокоит вот это:

  if(up1 > 1.1 | up2 > 1.1 | up3 > 1.1 | up4 > 1.1)
   next 

А это весь код:

G.vec <- rep(NA, 1000)
#-----model------

model1 <- function(){  

  # likelihood
  for (c in 1:16){
    D.diff[c] ~ dnorm(mu, tau)
  }

  # priors
  mu ~ dnorm(0, 10)
  tau <- 1/(sd*sd)
  sd ~ dunif(0, 10)
}

#---- for loop--------

for (i in 1:1000){


#--- data simulation ---------
# paired data
sim_bf <- rtnorm(16, mean = 0.4949, sd = 0.12, lower = 0.1)
sim_af <- rtnorm(16, mean = 0.3959, sd = 0.12, lower = 0.1)
diff = sim_bf - sim_af


#------setting up jags--------------

data <- list(D.diff = diff)
params <- c("mu", "tau", "sd")
inits <- function(){
  list(mu = rnorm(1),
       sd = rlnorm(1)) 
}

#-------run jags----------------

output <- jags(data=data, 
               # inits=inits, 
               parameters.to.save=params,
               n.iter=1000, 
               n.burn=100, 
               n.chains=2, 
               n.thin=1,
               model.file=model1,
               progress.bar = "gui")

#-------convergence checker----------------
output.mcmc <- as.mcmc(output)
x <- gelman.diag(output.mcmc)
up1 <- x$psrf[1,2]        # Approximate convergence is diagnosed when the upper limit is close to 1
up2 <- x$psrf[2,2] 
up3 <- x$psrf[3,2] 
up4 <- x$psrf[4,2] 


  if(up1 > 1.1 | up2 > 1.1 | up3 > 1.1 | up4 > 1.1)
   next                 

# one sided t-test
  lo = output$BUGSoutput$summary[2,4]
  G.vec[i] <- ifelse((lo < 0), 0, 1)
}

a <- table(G.vec)
G <- a[2]/1000
G

person Community    schedule 29.04.2015    source источник
comment
Есть ли заранее определенное количество раз, которое вы хотите сделать это? Если это так, вы можете использовать цикл while и увеличивать его только при соблюдении желаемого случая (или увеличивать в начале цикла и вычитать переменную, если она сходится.   -  person goodtimeslim    schedule 29.04.2015


Ответы (2)


вместо

for(i in 1:1000){...
    ...
    if(...
        next

do

i <- 0
while(i <=1000){...
    i <- i+1
    ...
    if(...
        i <- i-1
        break
person goodtimeslim    schedule 29.04.2015
comment
Кажется, я вижу, что ты там делаешь, я попробую - person ; 29.04.2015
comment
Замечательно, это имеет смысл! Но вы имели в виду «следующий» вместо «перерыв»? - person ; 29.04.2015
comment
Любой из них должен работать в этом случае. Я думаю, как работают next и break, допустим, у вас есть внешний цикл и внутренний цикл. Если вы вызовете next из внутреннего цикла, вы начнете следующую итерацию внешнего цикла. break не могли бы вы выйти из внутреннего цикла, но продолжить текущую итерацию внешнего цикла. - person goodtimeslim; 29.04.2015
comment
Ok. Почему-то break у меня не сработало, но я очень рад, что теперь оно работает, спасибо @goodtimeslim - person ; 29.04.2015

используйте оператор break для критериев сходимости.

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

lo = output$BUGSoutput$summary[2,4] G.vec[i] ‹- ifelse((lo ‹ 0), 0, 1)

Поместите их снаружи для цикла.

person Sankara Narayanan    schedule 29.04.2015