将dirlichet模型拟合到JAGS中的模拟数据,在R中实现(beta工程)

时间:2018-05-15 16:19:14

标签: r jags runjags rjags

假设我有一些关于3种物种相对丰度的数据。物种1与年平均温度(mat)呈负相关。相对丰度数据存储在矩阵r.spp.y

#Simulate some species count data.
y1 <- round(rnorm(100, 100, 5)) 
mat <- rnorm(length(y1), 10, 3)
y1 <- y1 + round(mat*-3)
y2 <- round(rnorm(100, 100, 5)) 
y3 <- round(rnorm(100, 100, 5)) 
spp.y <- as.matrix(data.frame(y1,y2,y3))
r.spp.y <- spp.y / rowSums(spp.y)

我可以在JAGS中一次一个地对每个物种进行β回归,以显示mat与物种1的相对丰度之间存在负相关,但matlibrary(runjags) beta.model = " model{ #priors m0 ~ dnorm(0, 1.0E-3) #intercept prior m1 ~ dnorm(0, 1.0E-3) # mat prior t0 ~ dnorm(0, .01) tau <- exp(t0) #drop beta for (i in 1:N){ y[i] ~ dbeta(p[i], q[i]) p[i] <- mu[i] * tau q[i] <- (1 - mu[i]) * tau logit(mu[i]) <- m0 + m1 * mat[i] } }#close model loop. " output <- list() for(i in 1:ncol(r.spp.y)){ beta.data <- list(y = r.spp.y[,i], mat = mat, N = nrow(r.spp.y)) jags.beta <- run.jags(beta.model, data=beta.data, adapt = 200, burnin = 1000, sample = 1000, n.chains = 3, monitor = c('m0','m1')) output[[i]] <- summary(jags.beta) } names(output) <- c('species 1','species 2','species 3') 之间存在正相关关系。使用JAGS的物种2和3的相对丰度:

mat

这表明每个都有一个拦截值和一些与mat的关系。具体而言,物种1与mat具有负相关,而物种2和3与m1呈正相关,这反映在$`species 1` Lower95 Median Upper95 Mean SD Mode MCerr MC%ofSD SSeff AC.10 psrf m0 -0.71012252 -0.66164521 -0.61324227 -0.66175203 0.025504290 -0.65828829 0.0025395302 10.0 101 0.4951512 1.005070 m1 -0.04608964 -0.04139645 -0.03671938 -0.04138209 0.002453942 -0.04148652 0.0002420001 9.9 103 0.5013018 1.006634 $`species 2` Lower95 Median Upper95 Mean SD Mode MCerr MC%ofSD SSeff AC.10 psrf m0 -0.74993189 -0.70794571 -0.67146076 -0.70773078 0.019593399 -0.70704999 0.0018992840 9.7 106 0.4913926 1.006231 m1 0.01479929 0.01849042 0.02212619 0.01844102 0.001845884 0.01825645 0.0001812411 9.8 104 0.4964613 1.006281 $`species 3` Lower95 Median Upper95 Mean SD Mode MCerr MC%ofSD SSeff AC.10 psrf m0 -0.71786559 -0.67713045 -0.63342213 -0.67726218 0.021507927 -0.67767494 0.001908073 8.9 127 0.4398105 1.024932 m1 0.01160666 0.01560139 0.01958145 0.01561193 0.002017519 0.01576153 0.000187649 9.3 116 0.4513887 1.026890 参数的值中。

dirlichet.model = "
model {
  #setup priors for each species
  for(j in 1:N.spp){
    m0[j] ~ dnorm(0, 1.0E-3) #intercept prior
    m1[j] ~ dnorm(0, 1.0E-3) #      mat prior
  }

  #implement dirlichet
  for(i in 1:N){
    for(j in 1:N.spp){
      logit(a0[i,j]) <- m0[j] + m1[j] * mat[i]
  }
  y[i,1:N.spp] ~ ddirch(a0[i,1:N.spp]) 
  }

} #close model loop.
"

我想使用多变量模型同时拟合所有丰度。这可以使用dirlichet分布来完成,这是beta分布的多变量推广。为此,我在JAGS中设置了一个dirlichet模型,类似于上面的beta:

jags.data <- list(y = r.spp.y,mat = mat,N = nrow(r.spp.y), N.spp = ncol(r.spp.y))
jags.out <- run.jags(dirlichet.model,
                     data=jags.data,
                     adapt = 200,
                     burnin = 2000,
                     sample = 2000,
                     n.chains=3,
                     monitor=c('m0','m1'))
summary(jags.out)

然后我设置了一个稍微不同的数据对象,并运行模型:

m0

然而,返回的m1mat参数决不会与循环测试模型返回的参数类似。似乎所有参数都反映了所提供的(平坦的)先前分布,并且数据没有以任何方式约束参数。这个模型无法捕捉> summary(jags.out) Lower95 Median Upper95 Mean SD Mode MCerr MC%ofSD SSeff AC.10 psrf m0[1] -49.005761 6.181091 63.01256 6.393293 28.43734 6.628375 0.5359853 1.9 2815 -0.0018363868 1.000590 m0[2] -45.469227 6.723323 67.85340 6.978617 28.52249 5.924171 0.5417058 1.9 2772 0.0129357542 1.000718 m0[3] -49.227870 6.233448 61.60683 6.599494 28.43137 4.742497 0.5279870 1.9 2900 -0.0057574414 1.000546 m1[1] -1.869337 24.268826 64.16340 27.391725 19.13417 20.322548 0.4572891 2.4 1751 0.0109859218 1.006568 m1[2] -1.465451 23.725515 64.21979 27.071232 18.98391 15.823296 0.4294849 2.3 1954 -0.0005437107 1.002363 m1[3] -1.907332 24.031360 62.18261 27.017599 18.57743 18.597688 0.4290431 2.3 1875 -0.0086604393 1.001171 与物种1的相对丰度之间的负相关关系。它甚至似乎都没有对数据进行过多限制:

mat

值得注意的是,如果我适合仅限拦截的dirlichet模型(没有mat协变量),它可以很好地捕获相对丰度,但是只有当我使用对数链接而不是logit-时测试用例中使用的链接(example here)。扩展日志链接案例并添加{{1}}协变量并不能解决问题。我在这里缺少什么?

0 个答案:

没有答案