#r
#r
Вопрос:
Я пытаюсь выполнить некоторые анализы функционального разнообразия для сообществ пчел в Северном Онтарио. Я использую пакет R SYNCSA и пытаюсь вычислить разнообразие Rao. Продолжает появляться ошибка, в которой говорится, что «Из данных сообщества есть виды, которых нет в матрице признаков».
Чтобы выполнить анализ с помощью функции rao.diversity, мне нужно было составить таблицу данных о численности (например, 2 сообщества пчел и количество каждого вида в них) и таблицу признаков (например, каждый вид в сообществе и его специфичность к пыльце, гнездовое поведение и т. Д., Которыесодержит порядковые данные, которые я оценил численно).
Теперь существует правило, использующее эту функцию, согласно которому названия видов, которые находятся в столбцах в данных сообщества (численности), должны точно соответствовать названиям видов в строках в данных признаков. Когда я получил эту ошибку, я сразу же убедился, что столбцы данных сообщества соответствуют строкам данных признаков, и они соответствуют, насколько я могу видеть. Я также попробовал функцию organize.syncsa, которая должна исправлять несоответствие столбцов / строк, только чтобы получить сообщение об ошибке «comm должен содержать только числовые или двоичные переменные». Мой comm (то есть данные сообщества) действительно содержит только числовые переменные, поэтому я тоже не знаю, что я делаю не так.
Ниже приведены текстовые представления ASCII моих 2 таблиц для данных сообщества и данных признаков соответственно:
dput(community.data.raos)
structure(list(X = structure(2:1, .Label = c("Akimiski", "Far North"
), class = "factor"), Andrena.algida = 1:0, Andrena.barbilabris = 1:0,
Andrena.frigida = 1:0, Anthophora.terminalis = 0:1, Bombus.flavidus = c(6L,
0L), Bombus.flavifrons = 2:1, Bombus.frigidus = c(65L, 27L
), Bombus.melanopygus = c(0L, 8L), Bombus.mixtus = 1:2, Bombus.sandersoni = c(21L,
0L), Bombus.sylvicola = c(4L, 17L), Bombus.ternarius = c(5L,
15L), Bombus.terricola = c(8L, 0L), Bombus.vagans = c(9L,
0L), Colletes.americanus = 0:1, Colletes.impunctatus = c(0L,
6L), Colletes.nigrifrons = c(1L, 5L), Halictus.ligatus = c(0L,
2L), Halictus.rubicundus = c(2L, 0L), Halictus.tripartitus = 1:0,
Halictus.virgatellus = c(2L, 12L), Lasioglossum.ephialtum = c(2L,
0L), Lasioglossum.laevissimum = 1:0, Lasioglossum.inconditum = c(5L,
0L), Lasioglossum.quebecense = 1:0, Coelioxys.sodalis = 2:1,
Hoplitis.albifrons = 1:0, Megachile.circumcincta = 0:1, Megachile.frigida = 2:3,
Megachile.gemula = 1:2, Megachile.lapponica = c(1L, 1L),
Megachile.melanophaea = c(0L, 3L), Megachile.montivaga = 1:0,
Megachile.perihirta = c(0L, 3L), Megachile.relativa = 1:2,
Osmia.bucephala = c(1L, 1L), Osmia.laticeps = 1:0, Osmia.nigrifrons = c(2L,
0L), Osmia.nigriventris = c(5L, 1L), Osmia.paradisica = c(0L,
8L), Osmia.tarsata = 1:0, Osmia.tersula = 1:0), class = "data.frame", row.names = c(NA,
-2L))
dput(trait.table.raos)
structure(list(X = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L,
9L, 10L, 11L, 12L, 13L, 14L, 16L, 17L, 18L, 19L, 20L, 21L, 22L,
24L, 26L, 25L, 27L, 15L, 23L, 28L, 29L, 30L, 31L, 32L, 33L, 34L,
35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L), .Label = c("Andrena.algida ",
"Andrena.barbilabris ", "Andrena.frigida ", "Anthophora.terminalis",
"Bombus.flavidus", "Bombus.flavifrons ", "Bombus.frigidus ",
"Bombus.melanopygus ", "Bombus.mixtus", "Bombus.sandersoni ",
"Bombus.sylvicola", "Bombus.ternarius ", "Bombus.terricola ",
"Bombus.vagans ", "Coelioxys.sodalis ", "Colletes.americanus",
"Colletes.impunctatus", "Colletes.nigrifrons", "Halictus.ligatus",
"Halictus.rubicundus", "Halictus.tripartitus", "Halictus.virgatellus ",
"Hoplitis.albifrons ", "Lasioglossum.ephialtum", "Lasioglossum.inconditum",
"Lasioglossum.laevissimum ", "Lasioglossum.quebecense ", "Megachile.circumcincta ",
"Megachile.frigida", "Megachile.gemula", "Megachile.lapponica",
"Megachile.melanophaea", "Megachile.montivaga ", "Megachile.perihirta",
"Megachile.relativa", "Osmia.bucephala", "Osmia.laticeps", "Osmia.nigrifrons",
"Osmia.nigriventris", "Osmia.paradisica ", "Osmia.tarsata", "Osmia.tersula "
), class = "factor"), Pollen.Specificity = c(2L, 2L, 1L, 2L,
0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L,
1L, 2L, 2L, 2L, 1L, 2L), Tongue.Length = c(0L, 0L, 0L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L), Sociality = c(1L, 1L, 1L, 1L, 0L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 3L, 2L, 2L, 3L, 3L, 2L,
1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L), Nesting.Behavior = c(0L, 0L, 0L, 2L, 1L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 2L, 1L,
0L, 1L, 1L), Average.Female.ITD = c(NA, NA, NA, NA, 3.64, NA,
3.02, NA, 4.52, 3.21, 3.67, 4.17, 4.14, 3.59, NA, 2.15, 1.97,
NA, 2.21, NA, 1.79, NA, NA, 1.43, NA, NA, NA, NA, 3.14, 3.57,
3.21, 3.24, NA, 3.92, NA, 4, NA, 3.29, 3.86, 3.09, NA, NA)), class = "data.frame", row.names = c(NA,
-42L))
И пример ошибки, которую я получаю:
rao.diversity(comm = community.data.raos, traits = trait.table.raos)
Error in rao.diversity(comm = community.data.raos, traits = trait.table.raos) :
There are species from community data that are not on traits matrix
>
Функция rao.diversity должна выдавать серию небольших таблиц со значением от 0 до 1 для каждого сайта (в моем случае таких сайтов два), указывающих разные показатели разнообразия. Вместо этого я получаю сообщение об ошибке, что «Из данных сообщества есть виды, которых нет в матрице признаков».
Комментарии:
1. У меня нет пакета, но, просматривая документы и код на Github, по крайней мере, вам нужно избавиться от первого столбца
community.data.raos
, columnX
. Возможно, вы могли бы преобразовать его вrow.names
, если хотите сохранить информацию, сrow.names(community.data.rao) = community.data.rao$X
помощью, а затем удалить столбец сcommunity.data.rao$X = NULL
помощью . Аналогично, вам нужно преобразоватьX
столбец изtrait.table.raos
в имена строк. Посмотрите на верхнюю часть функции , чтобы понять, почему.2. Вам также может потребоваться выполнить некоторую очистку. Некоторые названия видов в вашей таблице признаков содержат пробелы в конце, например, ,
"Bombus.frigidus "
, но имена столбцов данных сообщества этого не делают.trimws()
Функция обрезает пробелы для вас.3. Я попробую посмотреть, работает ли это. Это хорошие идеи. Я опубликую сообщение снова, если проблема не устранена, или закрою поток, если это устранит проблему.
4. @Грегор, это сработало. Теперь мне просто нужно выяснить, как повысить ваш голос и отметить этот вопрос как ответ.
5. Рад это слышать! Я не хотел публиковать ответ, поскольку я не загружал пакет для тестирования, но с вашим подтверждением я сделаю краткую запись, которую вы можете затем принять. Я постараюсь добраться до него сегодня днем.
Ответ №1:
В документации это не очень понятно, но, глядя на код функции, мы видим, что имена столбцов объекта сообщества должны совпадать с именами строк объекта черт. С помощью этой информации мы можем просмотреть ваши входные данные и определить несколько проблем:
- У вашего объекта сообщества есть первый столбец
X
, который не является видом. Избавьтесь от этого, превратив значения в имена строк, если вы хотите сохранить эту информацию. - Ваш объект traits имеет вид в первом столбце, но они должны быть именами строк.
- Ваши метки видов несовместимы между двумя объектами: в таблице признаков некоторые из них имеют завершающий пробел. Используйте
trimws()
, чтобы избавиться от этого, чтобы совпадения были точными.
Если у вас по-прежнему возникают проблемы, вы можете захотеть посмотреть setdiff(row.names(trait.table.raos), colnames(community.data.rao))
и наоборот, setdiff(colnames(community.data.rao), row.names(trait.table.raos))
, чтобы убедиться, что совпадение между названиями видов является точным. Оба этих оператора не должны возвращать никаких результатов.