首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用rjags定义条件线性高斯网络

用rjags定义条件线性高斯网络
EN

Stack Overflow用户
提问于 2017-08-23 15:26:13
回答 1查看 110关注 0票数 2

我很难用rjags定义一个条件线性高斯贝叶斯网络。( clg由具有连续正常和离散父节点(预测器)的连续子节点(结果)定义)。

对于下面的网,A是离散的,D和E是连续的:

对于rjags模型,我想要的是在值节点A上定义节点E的参数:伪代码

代码语言:javascript
复制
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)   
}

通过使用下面的代码,我可以得到一些有用的东西,但是它很快就会与更多的预测和分类级别混淆。

代码语言:javascript
复制
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

我的问题是:我如何简洁地定义这个模型?

这些数据来自

代码语言:javascript
复制
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"))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-23 23:02:13

只需使用变量A作为索引参数:

代码语言:javascript
复制
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中定义这些量,然后将它们作为数据传递给JAGS可能更有意义。通过这种方式,您可以调整向量的值和长度(只要catprobs、int、斜率和sigs匹配的长度),而不必修改JAGS代码。例如,(为方便起见使用runjags,但也可以使用jags):

代码语言:javascript
复制
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

哑光

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45843795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档