试图创建和循环R中的不平衡数据矩阵

时间:2011-12-17 00:19:15

标签: r for-loop hierarchical reshape winbugs

我正在尝试进行分层贝叶斯分析,但是我对R和WinBUGS代码有点麻烦。我没有平衡的数据,我正在努力编码。我每天用横断面上的iButton(温度记录设备)收集温度数据,并试图生成一个与遥感数据相关的模型。不幸的是,每个横断面都有不同数量的iButton,所以创建按钮(i)的3D矩阵,在横断面(j)中,在第(t)天重复“采样”对我来说是一个问题。

最终,我的模型将是:

1级 温[ijk] ~N(theta [ijk],tau) theta [ijk] = b0 + b1 * x1 +。 。 。 + bn * xn

2级 b0 = a00 + a01 * y1 +。 。 。有* YN b1 = a10 + a11 * y1 ......

等级3(可能?) - 随机等级2拦截

通常我会这样做:     宽< - 重塑(Data1,idvar = c(“iButton”,“block”),timevar =“julian”,direction =“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]
}

然后我可以在WinBUGS或OpenBUGS中循环使用3D矩阵:

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

2 个答案:

答案 0 :(得分:4)

创建长度的矢量或数组并使用子索引。 使用您的示例:

J <- length(unique(Data$block))
I <- tapply(Data$iButton, Data$block, function(x) length(unique(x))
Ti <- tapply(Data$julian, list(Data$iButton, Data$block), function(x) length(unique(x))


for(i in 1:J) {          # Loop over transects/blocks
  for(j in 1:I[i]) {        # Loop over buttons
    for(t in 1:Ti[i, j]) {     # 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]
}}}

我认为它会起作用,但我没有测试,因为没有数据。

答案 1 :(得分:1)

您可以尝试使用list吗?

这允许列表中每个项目的变量长度,其中每个索引都对应于横断面。

这样的事情:

theta <- list()

for(i in unique(Data$block)) {
  ibuttons <- unique(Data$iButton[Data$block==i])
  days <- unique(Data$julian[Data$block==i])
  theta[[i]] <- matrix(NA, length(ibuttons), length(days)) # Empty matrix with NA's
    for(j in 1:length(ibuttons)) {
      for(t in 1:length(days)) {
        theta[[i]][j,t] <- fn(i, ibuttons[j], days[t])
      }
    }
  }