Редкость, матрица сообществ и циклы for

Я новый пользователь R, поэтому заранее прошу прощения за свое невежество. У меня есть матрица сообщества потоковых данных о макробеспозвоночных (графики в виде заголовков строк и видов в виде заголовков столбцов). Я хотел бы сузить данные до 500 человек на графике, сделать это 1000 раз, а затем рассчитать показатель состояния потока (например,% EPT). На данный момент мне не удалось построить цикл для разрежения данных 1000 раз (или даже 10 раз). Я использую упрощенный набор данных (6 видов, 12 графиков), чтобы определить правильный код, поскольку в моей матрице сообщества более 100 видов. Я использую этот веб-сайт (http://ichthyology.usm.edu/courses/multivariate/diversity.R) в качестве шаблона для разработки правильного кода. Заранее благодарим вас за любую помощь с этим кодом.

Моя матрица с 6 видами, 12 участков

comm
    X Attenella.margarita Baetidae Baetis.sp. Baetis.tricaudatus Caenis.sp. Diphetor.hageni
1   1                   0        0          0                  0          0              36
2   2                   0        0          0               1009          0             682
3   3                  51       51          0                609          0             406
4   4                   0        0         40                  0          0               0
5   5                   0        0         68                  0         68             203
 6   6                   0        0          0               1244          0               0
 7   7                   0        0       2090                  0          0               0
 8   8                   0        0         11                  0          0               0
 9   9                   0        0          0               4621          0               0
 10 10                   0        0          0               1515          0               0
 11 11                   0        0          0                 33          0               0
 12 12                   0        0          0                116          0               0

I can rarefy this data set 1x using the vegan package, but I would like to do this repeatedly

rrarefy(comm, sample=5)
      X Attenella.margarita Baetidae Baetis.sp. Baetis.tricaudatus Caenis.sp. Diphetor.hageni
 [1,] 0                   0        0          0                  0          0               5
 [2,] 0                   0        0          0                  4          0               1
 [3,] 0                   2        0          0                  2          0               1
 [4,] 0                   0        0          5                  0          0               0
 [5,] 0                   0        0          1                  0          1               3
 [6,] 0                   0        0          0                  5          0               0
 [7,] 0                   0        0          5                  0          0               0
 [8,] 3                   0        0          2                  0          0               0
 [9,] 0                   0        0          0                  5          0               0
 [10,] 0                   0        0          0                  5          0               0
 [11,] 0                   0        0          0                  5          0               0
 [12,] 0                   0        0          0                  5          0               0

но мне не повезло, когда я пытался сделать это как цикл 10 раз

> ComLoop = 0
> for (i in 1:10) ComLoop[i] = rrarefy(comm, sample=5)
  Warning in ComLoop[i] = rrarefy(comm, sample = 5) :

person user1943324    schedule 02.01.2013    source источник
comment
если вы не получите здесь ответа через день или два, вы можете попробовать опубликовать (дать ссылку на эту попытку) в список [email protected], где вы найдете других людей, которые понимают контекст вопроса лучше ...   -  person Ben Bolker    schedule 02.01.2013


Ответы (3)


Может ли что-нибудь подобное решить вашу проблему?

res <- lapply(as.list(1:10), function(x) rrarefy(comm, sample=5)) 

Есть конечно более элегантные решения, но я не очень понимаю, что делает разрежение, и ваша ссылка у меня не сработала.

person tophcito    schedule 02.01.2013

Проблема в том, что ComLoop является числовым вектором, а rrarefy() возвращает фрейм данных с данными сообщества. Итак, вы пытаетесь засунуть весь фрейм данных в один элемент числового вектора. Это не сработает.

Ответ @tophcito будет работать, потому что он возвращает список, компоненты которого являются результатом пяти отдельных вызовов rrarefy().

Версия цикла может быть выполнена следующим образом:

require(vegan)
data(dune)
ComLoop <- vector(mode = "list", length =  5)
for (i in seq_along(ComLoop)) {
    ComLoop[[i]] <- rrarefy(dune, sample = 5)
}

Который дает

> str(ComLoop)
List of 5
 $ : num [1:20, 1:30] 0 0 0 0 0 0 0 1 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "2" "13" "4" "16" ...
  .. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
 $ : num [1:20, 1:30] 0 0 0 0 0 0 0 1 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "2" "13" "4" "16" ...
  .. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
 $ : num [1:20, 1:30] 0 0 0 0 0 0 0 0 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "2" "13" "4" "16" ...
  .. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
 $ : num [1:20, 1:30] 0 0 0 0 0 0 0 0 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "2" "13" "4" "16" ...
  .. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
 $ : num [1:20, 1:30] 0 0 0 0 0 0 0 0 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "2" "13" "4" "16" ...
  .. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...

Другими словами, список, каждый из компонентов которого представляет собой фрейм данных, сгенерированный из случайной матрицы сообщества разреженных данных (к заявленному sample).

Обратите внимание, что при создании списка ComLoop для хранения результатов я явно указывал на длину. Вам не нужно явно указывать длину, поскольку увеличение списка - это та область, где вам не нужно заранее выделять хранилище. Итак, вы могли сделать это:

ComLoop <- list()

Но тогда вы не можете использовать идиому seq_along(), которую я использовал выше. Здесь вам нужно явно указать значения, которые i должны принимать, как вы это делали изначально:

for(i in 1:5)
    ComLoop[i] <- rrarefy(dune, sample = 5)

Я думаю, что лучше установить размер цикла, который вам нужен, отсюда и мое оригинальное решение.

person Gavin Simpson    schedule 02.01.2013

user1943324, я тоже пытаюсь разрежить, а затем вычислить показатели беспозвоночных, такие как% EPT. Однако я придерживаюсь другого подхода и сталкиваюсь с камнями преткновения из-за ограниченного опыта r-программирования.

Я предполагаю, что вы пытаетесь создать разреженную матрицу много раз, чтобы затем подсчитать количество таксонов EPT в каждом прогоне разрежения и вычислить среднее значение и изменчивость.

Вместо этого, можем ли мы изменить существующий код rarfy {vegan}, чтобы учесть определенные пользователем признаки (например, EPT или нет, функциональная группа кормления или значение толерантности) и в дополнение к существующему общему количеству таксонов, усредненному за несколько прогонов, использовать IF Команда типа THAN для усреднения таксонов для каждого отдельного состояния признака за эти прогоны?

Нет необходимости создавать несколько выходных матриц.

person BugNumbers    schedule 22.05.2013