【发布时间】:2011-12-17 00:19:15
【问题描述】:
我正在尝试进行分层贝叶斯分析,但在使用 R 和 WinBUGS 代码时遇到了一点问题。我没有平衡的数据,并且正在努力编码。我每天使用 iButtons(温度记录设备)在横断面上收集温度数据,并试图生成一个将其与遥感数据相关联的模型。不幸的是,每个样带都有不同数量的 iButton,因此在样带 (j) 中创建按钮 (i) 的 3D 矩阵,在第 (t) 天重复“采样”对我来说是个问题。
最终,我的模型将类似于:
1 级 Temp[ijk] ~ N(theta[ijk], tau) theta[ijk] = b0 + b1*x1 + . . . + bn*xn
2 级 b0 = a00 + a01*y1 + 。 . .安*因 b1 = a10 + a11*y1 ...
3 级(也许?) - 2 级随机拦截
通常我会这样做: Wide
J <- length(unique(Data$block))
I <- length(unique(Data$iButton))
Ti <- length(unique(Data$julian))
Temp <- array(NA, dim = c(I, Ti, J))
for(t in 1:Ti) {
sel.rows <- Wide$block == t
Temp[,,t] <- as.matrix(Wide)[sel.rows, 3:Ti]
}
然后我可以有一个 3D 矩阵,我可以像这样在 WinBUGS 或 OpenBUGS 中循环:
for(i in 1:J) { # Loop over transects/blocks
for(j in 1:I) { # Loop over buttons
for(t in 1:Ti) { # Loop over days
Temp[i,j,t] ~ dnorm(theta[i,j,t])
theta[i,j,t] <- alpha.lam[i] + blam1*radiation[i,j] + blam2*cwd[i,j] + blam3*swd[i,j]
}}}
不管怎样,不用担心上面代码的细节,它只是从其他分析中作为示例放在一起。我的主要问题是,当我没有平衡设计且每个样带具有相同数量的 iButton 时,如何进行此类分析?任何帮助将不胜感激。我显然是 R 和 WinBUGS 的新手,之前没有太多的计算机编码经验。
谢谢!
哦,这是长(堆叠)格式的数据:
> Data[1:15, 1:4]
iButton julian block aveT
1 1 1 1 -4.5000000
2 1 2 1 -5.7500000
3 1 3 1 -3.5833333
4 1 4 1 -4.6666667
5 1 5 1 -2.5833333
6 1 6 1 -3.0833333
7 1 7 1 -1.5833333
8 1 8 1 -8.3333333
9 1 9 1 -5.0000000
10 1 10 1 -2.4166667
11 1 11 1 -1.7500000
12 1 12 1 -3.2500000
13 1 13 1 -3.4166667
14 1 14 1 -2.0833333
15 1 15 1 -1.7500000
【问题讨论】:
-
现在没时间写一个完整的答案但是...如果您有一个矩阵 theta 并且您希望在每个点都使用 dnorm,请尝试...Temp
-
我没有矩阵 theta。我会使用 WinBUGS 作为 MCMC 机器来估计 theta 和 beta 项。基本上我的问题是我在 i、j、t 处有 Temp 数据,但是每个 j 的 i 长度不同,所以我不知道如何将 Temp 编码为正确的形式来循环遍历它。我能想到的唯一另一件事是,我目前糟糕的编码技能将允许拥有一个 [i,t] 矩阵,然后使用块 (j) 作为使用虚拟变量的协变量。如果设计是平衡的,我会按照上面的代码进行编码,但在这种情况下不会起作用。
标签: r for-loop hierarchical reshape winbugs