Допустим, у меня есть некоторые данные об относительной численности 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, но положительная корреляция между mat
и относительной численностью вида 2 и 3 с использованием JAGS:
library(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')
Это показывает, что у каждого есть значение перехвата и некоторая связь с mat
.В частности, вид 1 имеет отрицательную связь с mat
, тогда как виды 2 и 3 демонстрируют положительную связь с mat
, что отражено в значениях параметра 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, которое является многомерным обобщением бета-распределения.Для этого я устанавливаю модель dirlichet в JAGS, аналогичную бета-версии выше:
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.
"
Затем я настраиваю немного другой объект данных и запускаю модель:
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
и m1
, возвращаемые никоим образом, не похожи на параметры, возвращаемые циклом бета-модели.Кажется, что все параметры отражают предоставленные (плоские) предыдущие распределения, и данные никак не ограничивают параметры.Эта модель не может уловить отрицательную связь между mat
и относительной численностью вида 1. Она даже не слишком сильно ограничивает данные:
> 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
Стоит отметить, что если яв соответствии с моделью перехвата только для перехвата (без ковариации mat
), она может хорошо фиксировать относительные содержания, однако, только если я использую лог-ссылку, а не логит-ссылку, использованную в бета-случае (пример здесь).Расширение регистрационной ссылки и добавление ковариаты mat
не решает проблему.Что мне здесь не хватает?