Я хотел бы создать филогенетические деревья из генетических данных. Я нашел несколько пакетов для рисования деревьев в R и python, которые выглядят великолепно, например. ggtree в R. Но для этого требуются входные данные, которые уже находятся в древовидном формате, например. Ньюик.
Я думаю, что большинство людей начинают с файлов vcf и создают файлы FASTA, но моя отправная точка - это таблица генотипов - я работаю с гаплоидным организмом, поэтому каждая позиция либо 0 (ссылка), либо 1 (не ссылка). Исходя из этого, я вычисляю попарное генетическое расстояние, используя dist () в R. Примеры данных для 5 образцов, A-E, с попарным расстоянием по десяти вариантам позиций:
# Generate dataframe with example genotypes
Variant <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
A <- c(0, 0, 1, 1, 0, 0, 1, 1, 0, 0)
B <- c(1, 1, 0, 0, 1, 1, 0, 0, 1, 1)
C <- c(0, 0, 1, 1, 0, 0, 1, 1, 0, 1)
D <- c(1, 0, 1, 1, 0, 0, 1, 1, 0, 1)
E <- c(1, 0, 0, 0, 1, 1, 0, 0, 1, 1)
df = data.frame(Variant, A, B, C, D, E)
df
# Remove first column with variant names
df$Variant <- NULL
# Transpose the columns and rows
df_t = t(df)
# Compute pairwise distance (Euclidean)
pdist = dist(df_t, method = "euclidean", diag = TRUE, upper = TRUE, p = 2)
pdist
Я хотел бы создать выходной файл иерархического дерева из pdist, например. в формате Newick, чтобы я мог подключить его к таким пакетам, как ggtree, чтобы рисовать красивые деревья, например. круговые филограммы, раскрашенные ко-вариациями и т. д. Я пробовал искать, но не знаю, с чего начать.
ИЗМЕНИТЬ / ОБНОВИТЬ Этот веб-сайт был полезен http://www.phytools.org/Cordoba2017/ex/2/Intro-to-phylogenies.html Я использовал пакеты: ape, phangorn, phytools, geiger
Кажется, этот код работает -
# Produce dendrogram
hclust = hclust(pdist)
# Check dendrogram looks sensible
plot(hclust)
class(hclust) # check that class is hclust
# Save to Newick file
my_tree <- as.phylo(hclust)
write.tree(phy=my_tree, file="ExampleTree.newick") # Writes a Newick file
# Produce tree
plot(unroot(my_tree),type="unrooted",cex=1.5,
use.edge.length=TRUE,lab4ut="axial",
edge.width=2,
no.margin=TRUE)