2013-03-14 23 views
7

Próbuję napisać model Winbugs/Jags do modelowania modeli tematycznych wielu ziarna (dokładnie ten papier ->http://www.ryanmcd.com/papers/mg_lda.pdf)Wybór różnych dystrybucjach opartych na razie - warunek innego w WinBugs/Jags

Tutaj chciałbym wybrać inna dystrybucja oparta na określonej wartości. EG: Chciałbym zrobić coś takiego

`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]) 
} 
` 

to możliwe do zrobienia w Winbugs/Jags?

+1

ja nie zbyt pewny, że w pełni zrozumieć swój kod. jeśli instrukcje są możliwe w WinBUGS .... http: //www.mrc-bsu.cam.ac.uk/bugs/faqs/contents.shtml#q15 – gjabel

Odpowiedz

8

Winbugs/JAGS nie jest językiem proceduralnym, więc nie można używać takiego konstruktu. Użyj funkcji step. Cytat z instrukcji:

krok (e) ...... 1, jeśli e> = 0; 0 inaczej

Więc trzeba trick, aby zmienić stan:

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 

a następnie użyć tego do indeksowania trick:

# 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

Co to jest '<=>' tutaj? Czy właśnie wskazujesz, że są one równoważne? – jbaums

+1

@jbaums dokładnie :-) To tylko matematyczny symbol wskazujący na równoważność, a nie symbol rzeczywistego języka komputerowego :) – TMS