Как сгенерировать вывод дерева Ньюика из попарной матрицы расстояний

Я хотел бы создать филогенетические деревья из генетических данных. Я нашел несколько пакетов для рисования деревьев в 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)

Дерево вывода:  Некорневое дерево расстояний из примера данных


person Will Hamilton    schedule 08.10.2018    source источник


Ответы (2)


Это нетривиальная задача. Чтобы построить дерево (как в бифуркационном) из матрицы расстояний, вам нужно будет использовать филогенетические алгоритмы и, вероятно, лучше не делать этого из матрицы расстояний (обратите внимание, что могут быть недостатки от использования евклидова расстояния для двоичной матрицы. ).

Однако при этом задача все еще может быть выполнена с помощью пакета phangorn < / а>. Например, вы можете создать спектр расщеплений из матрицы расстояний (то есть вероятных расщеплений, присутствующих в матрице (подробности здесь - платные).

require(phangorn)
# 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)

# calculate the Hadamard distance spectrum
distances <- distanceHadamard(as.matrix(pdist))
# representing the distances
lento(distances)
# Plotting the distances as a tree (a network actually)
plot(as.networx(distances), "2D")

Обратите внимание, что в том же пакете доступен neighborNet, но в руководстве подчеркивается, что эта функция является экспериментальной. Я предлагаю связаться с автором пакета для получения дополнительной информации.

Затем вы можете преобразовать свою сеть в "phylo", который может использоваться ape и, возможно, ggtree путем принуждения:

# Converting into a phylo object
phylo <- as.phylo(distances)

Но опять же, обратите внимание, что это результирующее дерево, вероятно, неверно в филогенетическом смысле (т.е. предполагает происхождение с модификацией), и я настоятельно рекомендую просто оценить дерево, используя подход, основанный на модели (например, с MrBayes или BEAST2).

person Thomas Guillerme    schedule 08.10.2018
comment
Спасибо за ваш ответ. Я исправил свой вопрос найденным решением, которое, похоже, работает. Я буду читать, чтобы понять, какие подходы, которые вы предложили (MrBayes / BEAST2) включают в себя! - person Will Hamilton; 08.10.2018

Как упоминал @ thomas-guillerme, двоичные данные можно эффективно использовать для построения филогенетического дерева с помощью MrBayes. Входной файл должен включать двоичный блок data и команды mrbayes.

#nexus
begin data;
dimensions ntax = 5 nchar = 10;
format datatype = restriction;
matrix
A 0011001100
B 1100110011
C 0011001101
D 1011001101
E 1000110011;
end;

begin mrbayes;
lset coding = variable;
mcmc ngen = 1000000 samplefreq = 1000;
sump burnin = 200;
sumt burnin = 200;
end;

Длину mcmc прогона необходимо отрегулировать с учетом сходимости цепи. Для начала код должен давать хорошее представление о взаимосвязях, которые могут вывести данные.

person nya    schedule 11.10.2018