2015-04-29 2 views
0

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

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 
+0

Есть ли заданное число раз вы хотите сделать это? Если это так, вы можете использовать цикл while и увеличивать только при желаемом случае (или увеличивать в начале цикла и вычитать переменную, если она сходится). – goodtimeslim

ответ

0

вместо

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

сделать

i <- 0 
while(i <=1000){... 
    i <- i+1 
    ... 
    if(... 
     i <- i-1 
     break 
+0

Думаю, я вижу, что вы там делаете, я «У меня будет попытка –

+0

Замечательно, это имеет смысл! Но вы имели в виду« next »вместо« break »? –

+0

Либо один должен работать в этом случае. Я думаю, что работа' next' и 'break' такова, допустим, у вас есть внешний цикл и внутренний цикл.Если вы вызываете 'next' из внутреннего цикла, вы начнете следующую итерацию внешнего цикла.' break' вы вытащили бы вас из внутреннего цикла, но продолжайте текущая итерация внешнего цикла. – goodtimeslim

0

используйте оператор разрыв критериев конвергенции.

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

ло = выход $ BUGSoutput $ Резюме [2,4] G.vec [I] < - IfElse ((< ло 0), 0, 1)

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

Смежные вопросы