2017-08-23 3 views
2

Je me bats pour définir un réseau bayésien gaussien linéaire conditionnel en utilisant rjags. (A clg BN est défini par un noeud enfant continue (résultat) ayant à la fois un processus continu normal et un parent discret (prédicteurs))Définir un réseau gaussien linéaire conditionnel en utilisant rjags

Pour le but ci-dessous, A est discret, D et E en continu:

enter image description here

pour le modèle rjags, je supose ce que je veux est pour les paramètres de noeud E à définir sur le nœud de valeur A prend: code pseudo

model { 
    A ~ dcat(c(0.0948, 0.9052)) 
    D ~ dnorm(11.87054, 1/1.503111^2) 

    if A==a then E ~ dnorm(6.558366 + 1.180965*D, 1/2.960002^2) 
    if A==b then E ~ dnorm(3.370021 + 1.532289*D, 1/6.554402^2) 
} 

Je peux obtenir quelque chose qui fonctionne en utilisant le code ci-dessous, mais il serait confus rapidement avec plus de niveaux prédictifs et catégoriques.

library(rjags) 

model <- textConnection("model { 
    A ~ dcat(c(0.0948, 0.9052)) 
    D ~ dnorm(11.87054, 1/1.503111^2) 

    int = 6.558366 - (A==2)*(6.558366 - 3.370021) 
    slope = 1.180965 - (A==2)*(1.180965 - 1.532289) 
    sig = 2.960002 - (A==2)*(2.960002 - 6.554402) 

    E ~ dnorm(int + slope*D, 1/sig^2) 
}") 

jg <- jags.model(model, n.adapt = 1000 

Ma question: Comment puis-je définir ce modèle succinctement s'il vous plaît?

Les données proviennent de

library(bnlearn) 
net = model2network("[A][D][E|A:D]") 
ft = bn.fit(net, clgaussian.test[c("A", "D", "E")]) 

coef(ft) 
structure(list(A = structure(c(0.0948, 0.9052), class = "table", .Dim = 2L, .Dimnames = list(
    c("a", "b"))), D = structure(11.8705363469396, .Names = "(Intercept)"), 
    E = structure(c(6.55836552742708, 1.18096500477159, 3.37002124328838, 
    1.53228891423418), .Dim = c(2L, 2L), .Dimnames = list(c("(Intercept)", 
    "D"), c("0", "1")))), .Names = c("A", "D", "E")) 

sigma(ft) 
structure(list(A = NA, D = 1.50311121682603, E = structure(c(2.96000206596326, 
6.55440224877698), .Names = c("0", "1"))), .Names = c("A", "D", 
"E")) 

Répondre

2

Vous avez juste besoin d'utiliser votre variable A comme paramètre d'indexation:

library('rjags') 

model <- " 
model { 
    A ~ dcat(c(0.0948, 0.9052)) 
    D ~ dnorm(11.87054, 1/1.503111^2) 

    ints <- c(6.558366, 3.370021) 
    int <- ints[A] 
    slopes <- c(1.180965, 1.532289) 
    slope <- slopes[A] 
    sigs <- c(2.960002, 6.554402) 
    sig <- sigs[A] 

    E ~ dnorm(int + slope*D, 1/sig^2) 
} 
" 

jg <- jags.model(textConnection(model), n.adapt = 1000) 

Par ailleurs, comme vous avez beaucoup de quantités fixes dans la modèle, il peut être plus logique de les définir dans R et de les passer ensuite en tant que données à JAGS. De cette façon, vous pouvez ajuster les valeurs et les longueurs des vecteurs (tant que les longueurs des catprobs, ints, pentes et sigs correspondent) sans avoir à modifier le code JAGS. Par exemple (en utilisant runjags pour des raisons pratiques, bien que possible avec Jags):

library("runjags") 

model <- " 
model { 
    A ~ dcat(catprobs) 
    D ~ dnorm(Dmu, Dprec) 

    int <- ints[A] 
    slope <- slopes[A] 
    sig <- sigs[A] 

    E ~ dnorm(int + slope*D, 1/sig^2) 

    #data# catprobs, Dmu, Dprec, ints, slopes, sigs 
    #monitor# A, D, E 
} 
" 

catprobs <- c(0.0948, 0.9052) 
Dmu <- 11.87054 
Dprec <- 1/1.503111^2 
ints <- c(6.558366, 3.370021) 
slopes <- c(1.180965, 1.532289) 
sigs <- c(2.960002, 6.554402) 

results <- run.jags(model) 
results 

Matt

+0

merci beaucoup, c'est exactement ce que j'espérais. – user2957945