在 JAGS for R 中拟合多变量 dirlichet 模型
Fitting a multivariate dirlichet model in JAGS for R
我正在尝试使用 R 中实现的 JAGS 将多变量模型拟合到物种组成数据。我有 3 个物种相对丰度的数据(在 [0,1] 之间),其中两个是相关的。这是生成类似数据的代码。
#generate some correlated fractional composition data.
y1 <- runif(100,10,200)
y2 <- y1*1.5 + rnorm(100, sd = 5)
y3 <- runif(100,10,200)
total <- y1+y2+y3
y1 <- y1/(total)
y2 <- y2/(total)
y3 <- y3/(total)
y <- data.frame(y1,y2,y3)
y
是我的三个因变量 y1
、y2
和 y3
的 data.frame。我想为这些数据拟合一个仅截距模型,使用 dirlichet 分布(beta 分布的多变量扩展)来解释因变量之间的协方差。
我有点卡住了。我可以使用 R 中的 runjags
包使用 beta 分布精细地将其编码为单个因变量,如下所示:
library(runjags)
#Write JAGS model, save as R object.
jags.model = "
model{
# priors
a0 ~ dnorm(0, .001)
t0 ~ dnorm(0, .01)
tau <- exp(t0)
# likelihood for continuous component - predicted value on interval (0,1)
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]) <- a0
}
}
"
#generate JAGS data as list.
jags.data <- list(y = y1,
N = length(y1))
#Fit a JAGS model using run.jags
jags.out <- run.jags(jags.model,
data=jags.data,
adapt = 1000,
burnin = 1000,
sample = 2000,
n.chains=3,
monitor=c('a0'))
Mu 问题是:如何使用 JAGS 中的 dirlichet 分布将其扩展到多变量情况,并在 R 中实现?如果我们可以在 y
矩阵中考虑协方差,那么奖励。
这是 JAGS 中的一个直接解决方案,使用原始问题中提供的 pseudo-data。
JAGS 数据对象:
y <- as.matrix(y)
jags.data <- list(y = y,
N = nrow(y),
N.spp = ncol(y))
JAGS 模型作为 R 对象 jags.model
:
jags.model = "
model {
#setup priors for each species
for(j in 1:N.spp){
m0[j] ~ dgamma(1.0E-3, 1.0E-3) #intercept prior
}
#implement dirlichet
for(i in 1:N){
for(j in 1:N.spp){
log(a0[i,j]) <- m0[j] ## eventually add linear model here
}
y[i,1:N.spp] ~ ddirch(a0[i,1:N.spp])
}
} #close model loop.
"
继续拟合模型,监测 m0
截距参数,这是一个矢量,每个物种组的截距。
#Fit a JAGS model using run.jags
jags.out <- run.jags(jags.model,
data=jags.data,
adapt = 100,
burnin = 100,
sample = 200,
n.chains=3,
monitor=c('m0'))
我正在尝试使用 R 中实现的 JAGS 将多变量模型拟合到物种组成数据。我有 3 个物种相对丰度的数据(在 [0,1] 之间),其中两个是相关的。这是生成类似数据的代码。
#generate some correlated fractional composition data.
y1 <- runif(100,10,200)
y2 <- y1*1.5 + rnorm(100, sd = 5)
y3 <- runif(100,10,200)
total <- y1+y2+y3
y1 <- y1/(total)
y2 <- y2/(total)
y3 <- y3/(total)
y <- data.frame(y1,y2,y3)
y
是我的三个因变量 y1
、y2
和 y3
的 data.frame。我想为这些数据拟合一个仅截距模型,使用 dirlichet 分布(beta 分布的多变量扩展)来解释因变量之间的协方差。
我有点卡住了。我可以使用 R 中的 runjags
包使用 beta 分布精细地将其编码为单个因变量,如下所示:
library(runjags)
#Write JAGS model, save as R object.
jags.model = "
model{
# priors
a0 ~ dnorm(0, .001)
t0 ~ dnorm(0, .01)
tau <- exp(t0)
# likelihood for continuous component - predicted value on interval (0,1)
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]) <- a0
}
}
"
#generate JAGS data as list.
jags.data <- list(y = y1,
N = length(y1))
#Fit a JAGS model using run.jags
jags.out <- run.jags(jags.model,
data=jags.data,
adapt = 1000,
burnin = 1000,
sample = 2000,
n.chains=3,
monitor=c('a0'))
Mu 问题是:如何使用 JAGS 中的 dirlichet 分布将其扩展到多变量情况,并在 R 中实现?如果我们可以在 y
矩阵中考虑协方差,那么奖励。
这是 JAGS 中的一个直接解决方案,使用原始问题中提供的 pseudo-data。
JAGS 数据对象:
y <- as.matrix(y)
jags.data <- list(y = y,
N = nrow(y),
N.spp = ncol(y))
JAGS 模型作为 R 对象 jags.model
:
jags.model = "
model {
#setup priors for each species
for(j in 1:N.spp){
m0[j] ~ dgamma(1.0E-3, 1.0E-3) #intercept prior
}
#implement dirlichet
for(i in 1:N){
for(j in 1:N.spp){
log(a0[i,j]) <- m0[j] ## eventually add linear model here
}
y[i,1:N.spp] ~ ddirch(a0[i,1:N.spp])
}
} #close model loop.
"
继续拟合模型,监测 m0
截距参数,这是一个矢量,每个物种组的截距。
#Fit a JAGS model using run.jags
jags.out <- run.jags(jags.model,
data=jags.data,
adapt = 100,
burnin = 100,
sample = 200,
n.chains=3,
monitor=c('m0'))