Попытка создать и перебрать матрицу несбалансированных данных в R - PullRequest
0 голосов
/ 17 декабря 2011

Я пытаюсь провести иерархический байесовский анализ, но у меня возникли небольшие проблемы с кодом R и WinBUGS.У меня нет сбалансированных данных, и я борюсь с кодированием.Я ежедневно собираю данные о температуре с помощью iButtons (устройств регистрации температуры), и пытаюсь создать модель, которая связывает это с данными дистанционного зондирования.К сожалению, у каждого трансекта есть разное количество iButton, поэтому создание трехмерной матрицы кнопки (i) в трансекте (j), неоднократно «сэмплированной» в день (t), является для меня проблемой.

В конечном счете,моя модель будет выглядеть примерно так:

Уровень 1 Temp [ijk] ~ N (theta [ijk], tau) theta [ijk] = b0 + b1 * x1 +.,,+ bn * xn

Уровень 2 b0 = a00 + a01 * y1 +.,,an * yn b1 = a10 + a11 * y1 ...

Уровень 3 (может быть?) - случайные перехваты уровня 2

Обычно я бы делал что-то вроде этого: Wide <- reshape (Data1, idvar = c ("iButton", "block"), timevar = "julian", direction = "wide") </p>

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 как таковой:

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]
}}}

В любом случае, не беспокойтесь о деталях кода выше, он просто собран как пример из других анализов.Мой главный вопрос - как проводить анализ такого типа, когда у меня нет сбалансированного дизайна с равным количеством iButtons на трансект?Любая помощь будет принята с благодарностью.Я явно новичок в 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 ]

4 голосов
/ 17 декабря 2011

Создайте вектор или массив длин и используйте субиндексирование. Используя ваш пример:

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 голос
/ 17 декабря 2011

Можете ли вы попробовать вместо этого использовать 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])
      }
    }
  }
...