我希望有人可以帮助在 OpenBUGS 中拟合非线性模型。这个问题有点不适,但我们有很多数据。
我们有一个陷阱网络,可以在映射树木的森林地块中收集落叶。
我试图通过拟合以下模型来确定树直径和枯枝落叶产量之间的异速生长关系:
在距离直径为“DBH”厘米的树“z”米的位置收集的预期垃圾量
tree1.litter = alpha*gamma^2 * DBH^Beta/(2*pi) * exp(-gamma*z-delta*DBH)
但是,我们的陷阱数据包含来自多棵树的输入。
Obs.Litter = tree1.litter + tree2.litter + ... + treej.litter + error
数据格式如下:
list(Total.trees = 646, N.trap=4.600E+01,
DBH=c(3.470E+01, 2.940E+01,...) diameters (cm) for 656 trees
z=c(2.500E+01, 1.632E+01, ...) displacment (m) for 656 trees
trap.id = c(1, 1, 1,1, 1, 2, 2,, 2, 2, ..., 46, 46) for 656 trees
Obs.Litter = c(24, 12, ...) amount of litter(g) for each of 46 traps
cumulative.trees = c(36, 39, ...) cumulative number of trees in each of 46 trap neighborhoods
model{
for(i in 1:Total.trees){
tree[i] <- alpha*pow(gamma,2)/(2*3.141593) * pow(DBH[i],Beta) *exp(-gamma*z[i]-delta*DBH[i])
}
Obs.Litter[1] ~ dnorm(Expected.Litter[1], tau)
Expected.Litter[1]<- sum(tree[1 : cumulative.trees[1]])
for(j in 2: N.trap){
Obs.Litter[j] ~ dnorm(Expected.Litter[j], tau)
Expected.Litter[j] <- sum(tree[cumulative.trees[j-1]: cumulative.trees[j] ])
}
#Priors
tau ~ dgamma(0.001, 0.001)
sigma <- 1/sqrt(tau)
alpha~dgamma(0.001, 0.001)
Beta~dgamma(0.001, 0.001)
gamma~dgamma(0.001, 0.001)
delta~dgamma(0.001, 0.001)
}
list(alpha=20,Beta=5,gamma=5,delta=5,tau = 10)
list(alpha=20,Beta=6,gamma=2,delta=1,tau = 10)
我在这方面取得了进展,并多次更新了帖子。我已经能够运行 Gibb 的采样器,但没有得到令人满意的混合和不合理的结果。观察到的垃圾值以 10 克为单位,但我估计 <10^-7 g 垃圾输入。
因为我希望所有参数都取正值,所以我决定使用 gamma 先验。我认为问题在于先验。我的意图是使用无知的先验,但我有一个模糊的想法,即参数将采用以下值: alpha = 2 : 20 Beta = ~2 gamma = .2 delta = .02