2013-03-14 11 views
7

Ich versuche, für die Modellierung von Mehrkorn Thema Modelle (genau dieses Papier ->http://www.ryanmcd.com/papers/mg_lda.pdf) ein Windoof/Jags Modell zu schreibenWahl Unterschiedliche Distributionen basierend auf if - else Zustand in Windoof/JAGS

Hier möchte ich wählen eine andere Verteilung basierend auf einem bestimmten Wert. Für zB: Ich möchte etwas tun, wie

`if (X[i] > 0.5) 
{ 
Z[i] ~ dcat(theta-gl[D[i], 1:K-gl]) 
W[i] ~ dcat(phi-gl[z[i], 1:V]) 
} 
else 
{ 
Z[i] ~ dcat(theta-loc[D[i], 1:K-loc]) 
W[i] ~ dcat(phi-loc[z[i], 1:V]) 
} 
` 

ist das möglich in Windoof/JAGS zu tun?

+1

mir nicht ganz sicher, ich Ihren Code vollständig zu verstehen. Wenn Anweisungen in WinBUGS möglich sind .... http://www.mrc-bsu.cam.ac.uk/bugs/faqs/contents.shtml#q15 – gjabel

Antwort

8

Winbugs/JAGS ist keine prozedurale Sprache, daher können Sie das Konstrukt nicht so verwenden. Verwenden Sie die Funktion step. Zitat aus dem Handbuch:

Schritt (e) ...... 1 wenn e> = 0; 0 sonst

So benötigen Sie einen Trick, den Zustand zu ändern:

X[i] > 0.5 <=>  
X[i] - 0.5 > 0 <=> 
!(X[i] - 0.5 <= 0) <=> 
!(-(X[i] - 0.5) >= 0) <=> 
!(step(-(X[i] - 0.5)) == 1) <=> 
step(-(X[i] - 0.5)) == 0 

und diese dann für Trick Indizierung verwenden:

# then branch 
Z_branch[i, 1] ~ dcat(theta-gl[D[i], 1:K-gl]) 
W_branch[i, 1] ~ dcat(phi-gl[z[i], 1:V]) 

# else branch 
Z_branch[i, 2] ~ dcat(theta-loc[D[i], 1:K-loc]) 
W_branch[i, 2] ~ dcat(phi-loc[z[i], 1:V]) 

# decision here 
if_branch[i] <- 1 + step(-(X[i] - 0.5)) # 1 for "then" branch, 2 for "else" branch 
Z[i] ~ Z_branch[i, if_branch[i]] 
W[i] ~ W_branch[i, if_branch[i]] 
+0

Was ist '<=>' hier? Gibst du nur an, dass sie gleichwertig sind? – jbaums

+1

@jbaums genau :-) Dies ist nur ein mathematisches Symbol, um Äquivalenz anzuzeigen, nicht ein Symbol der tatsächlichen Computersprache :) – TMS