Обмен стека.
Я пытаюсь построить филогенетическое дерево для> 100 человек, используя R.
Однако в то время как учебные пособия для таких пакетов, как APE и ggtree, легко показывают, как это сделать, используя необработанную ДНК или предварительно отсортированные группы (например, (((А,В),(С,D)),Е)), мои данные имеют форму списка тегов с машинной нумерацией, собранных со всего генома.
Например:
sample <- c("A", "B", "C"...)
ID <- c("1 2 4 5", "2 4 5", "1 2 3 5"...)
df <- data.frame(sample, ID)
| образец | Я БЫ |
|---|---|
| А | 1 2 4 5 |
| Б | 2 4 5 |
| С | 1 2 3 5 |
Я изо всех сил пытаюсь понять, как (или даже если это возможно) построить филогению из такого рода произвольной нумерации. Кто-нибудь знаком? (Корневой/некорневой/круговой не имеет особого значения)
Спасибо за чтение!





(Филогенетическое) дерево — это просто иерархическая группировка образцов. Единственное, что необходимо, — это определить меру несходства между всеми парами выборок. В вашем случае у вас есть наборы чисел для каждой строки, и поэтому мы можем использовать для этого Jaccard. Например, все элементы выборки B также находятся в выборке A, поэтому в дереве их нужно поставить рядом друг с другом:
library(tidyverse)
library(proxy)
sample <- c("A", "B", "C")
ID <- c("1 2 4 5", "2 4 5", "1 2 3 5")
df <- data.frame(sample, ID)
df
#> sample ID
#> 1 A 1 2 4 5
#> 2 B 2 4 5
#> 3 C 1 2 3 5
distances <-
df %>%
separate_rows(ID) %>%
mutate(has_ID = 1) %>%
pivot_wider(names_from = ID, values_from = has_ID, values_fill = list(has_ID = 0)) %>%
column_to_rownames("sample") %>%
proxy::dist(by_rows = TRUE, method = "Jaccard")
distances
#> A B
#> B 0.25
#> C 0.40 0.60
distances %>%
hclust() %>%
plot()

Created on 2022-05-13 by the reprex package (v2.0.0)
Все дубликаты уже удалены, но это хорошо знать.
Этот ответ подразумевает, что нет дубликатов, например.
ID = "1 1 2 3"