2016-04-24 3 views
0

Ich arbeite an einem Experiment Design Problem und versuche, ein JAGS Modell über R und r2jags anzupassen.R, JAGS, r2jags: Zugriff auf das letzte Element am Anfang einer `for` Schleife

Um den Verschleppungseffekt zu messen, muss ich auf das Element i-1 in der Liste für eine der Variablen zugreifen. Wenn i=1, muss diese Variable das letzte Element in seiner Werteliste zurückgeben. Ich habe versucht, ein ifelse() zu verwenden, aber das hat nicht funktioniert.

Was ich versucht:

for (i in 1:Ntotal){ 
    j <- ifelse(i==1,Ntotal,j) 
    y[i] ~ dnorm(y.hat[i], tau) 
    y.hat[i] <- mu + beta*a[i] + tau_d*b[i]*period[i] + rho*product[j] + epsilon[i] 
    epsilon[i] ~ dnorm(0, tau) # gaussian error 
    } 

ich den Fehler:

Error in jags.model(file = "TEMPmodel.txt", data = dataList, n.chains = 3, : 
    RUNTIME ERROR: 
Compilation error on line 7. 
Possible directed cycle involving j 

Einsicht darüber, wie meine Lösung zu erreichen, wird geschätzt.

Ein einfaches Beispiel in R von dem, was ich versuche zu erreichen, falls das obige nicht klar ist. Für die Variable d muss ich auf das vorhergehende Element zugreifen. Wenn am Anfang des Indexes begonnen wird, ist das vorhergehende Element das letzte Element. Für JAGS bin ich nicht sicher, wie ich mein Modell dafür codiere.

i = 1 
exam <- data.frame(a=c(5,6,7), b=c(10,11,12), d=c(20,21,22)) 

exam$a[i] + exam$b[i] + exam$d[i-1] 

Antwort

0

Es gibt ein paar Probleme mit dieser Codezeile, die es wert sind Hinweis auf:

j <- ifelse(i==1,Ntotal,j) 

Erstens ist es innerhalb einer for-Schleife ist, so dass Sie Knoten j neu zu definieren versuchen - also musst du j mit i indexieren. Zweitens wird j als selbst definiert - daher die gerichtete Zyklusnachricht. Der folgende Code tut, was ich glaube, Sie wollen:

m <- 'model{ 

    for(i in 1:10){ 
     j[i] <- ifelse(i==1, 10, i-1) 
    } 

    #monitor# j 
}' 

runjags::run.jags(m) 

Allerdings könnte es einfacher sein, ja Dummy-Variable in R zu machen und es zu JAGS bieten als Daten, dh:

m <- 'model{ 

    for(i in 1:N){ 
     new[i] <- j[i] 
     # Or something else involving j[i] 
    } 

    #monitor# new 
    #data# j, N 
}' 

N <- 10 
j <- c(2:N, 1) 
runjags::run.jags(m) 

So oder so, wann immer Sie beziehen sich auf j durch i indizieren Sie benötigen - zB:

product[j[i]] 

Matt

Verwandte Themen