2017-08-23 14 views
2

rjagsを使用して条件付き線形ガウスベイジアンネットワークを定義するのは苦労しています。以下ネットの (CLGは、BNは、通常、連続的および離散的な親(予測子)の両方を有する連続子ノード(結果)によって定義される)rjagsを使用して条件付き線形ガウスネットワークを定義する

、AはDおよびEは、連続的、離散的である:

rjagsモデルの場合enter image description here

、私は私が欲しいものsuposeノードEのパラメータは、値ノードA上で定義されるのであるかかる:擬似コード

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

は、私は以下のコードを使用して作業何かを得ることができますが、それはより多くの予測因子と質的なレベルで迅速に混乱になるだろう。

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 

私の質問:どのように私は簡潔にこのモデルを定義することができますしてください?

データは、あなただけのインデックスパラメータとして、あなたの変数Aを使用する必要が

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")) 

答えて

2

から来た:

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) 

ところで、あなたが中に固定量の多くを持っているとして、モデルは、それがRでこれらを定義するにはより多くの意味を行い、その後、ぎざぎざにデータとして渡すことがあります。この方法は、あなたはぎざぎざのコードを変更することなく、(限りcatprobs、int型、斜面やSIGSの長さが一致するよう)ベクトルの値と長さを調整することができます。例えば、(ジャグでも可能であるが便宜上runjagsを使用して):

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 

マット

+0

私が期待していたまさに厥、どうもありがとうございました。 – user2957945

関連する問題