Ошибка при укоренении дерева на основе экономичности в R (библиотека ape)

Я выполняю анализ начальной загрузки в R с использованием алгоритма максимальной экономии (pratchet () в библиотеке ape). Когда я запускаю анализ некорневых деревьев (созданных с помощью функции pratchet ()), начальная загрузка выполняется нормально. Но когда я хочу получить root-права для каждого загруженного дерева, прежде чем найти поддержку начальной загрузки, я получаю ошибку при случайном укоренении на любом из 100 деревьев. Обратите внимание, что это происходит перед вызовом любого кода для вычисления поддержки разделения или клады.

Если я использую алгоритм присоединения соседей (nj () в ape), проблем с рутированием вообще или с загрузкой в ​​нисходящем направлении не возникает, но, по-видимому, это происходит (случайным образом) при рутировании деревьев на основе экономичности с использованием внешней группы. Странная вещь, которую я заметил, заключается в том, что если я записываю некорневые деревья в файл перед их укоренением (в случае возникновения ошибки при укоренении), а затем хочу их укоренить, это работает отлично.

Вот код, который я использую для анализа.

performBootstraping = function(charMatrix, bsIterations) {
    # charMatrix is a DNA alignment matrix
    # bsIteration are number of bootstrap iterations.

    library(phangorn)

    phySeq = phyDat(charMatrix)

    treeMPRooted = getRootedParsimonyTree(charMatrix)

    bValuesMP = boot.phylo(treeMPRooted, charMatrix, FUN=function(xx) {tt = getRootedParsimonyTree(xx); return(tt) }, 
    B = bsIterations, trees=T, rooted=T)

   # convert to percentage
   bValues = bValuesMP$BP/bsIterations * 100;

   plot(treeMPRooted, use.edge.length = F); 
   title('Max Parsimony tree with bootstrap percentage')
    nodelabels(bValues, frame = 'rect')

    # write the tree as newick 
    write.tree(treeMPRooted, paste0(outDir,'/rooted_MP.tree'))
    return(bValuesMP)
}

getRootedParsimonyTree = function(cMatrix) {
    phySeq = phyDat(cMatrix);
    treeMP = pratchet(phySeq)
    treeMPRooted = root(treeMP, outgroup='Germline', resolve.root=T)

    return(treeMPRooted)
}

Вот трассировка стека и ошибка

 Error in phy$edge[sndcol, 2] <- newNb[phy$edge[sndcol, 2]] <- n + 2:phy$Nnode : 
  number of items to replace is not a multiple of replacement length 
6 root(treeMP, outgroup = "Germline", resolve.root = T) at libaryFunctions.R#105
5 getRootedParsimonyTree(xx) at libaryFunctions.R#32
4 FUN(x[, boot.samp]) 
3 boot.phylo(treeMPRooted, t.vaf, FUN = function(xx) {
    tt = getRootedParsimonyTree(xx)
    return(tt)
}, B = bstrapCount, trees = T, rooted = T) at libaryFunctions.R#32
2 performBootstraping(vaf, outDir, i, bsIterations) at runAllSitesBootstrapForAllPatients.R#15
1 runAllSitesBootstrapForAllPatients(ccfFileDir = ccfDir, outDirPref = outDir) 
In addition: Warning message:
In newNb[phy$edge[sndcol, 2]] <- n + 2:phy$Nnode :
  number of items to replace is not a multiple of replacement length

person Ikram Ullah    schedule 01.11.2015    source источник


Ответы (2)


Я был разочарован функцией «root», поэтому отредактировал исходный код обезьяны, чтобы создать функцию, которая укореняет дерево без ошибок. Он включен в пакет TreeTools как функция RootTree(), которая также реализует еще несколько вариантов установки рута.

Установите его в R, используя:

install.packages('TreeTools')
RootTree(tree, outgroup)

Боюсь, он не поддерживает длину кромок.

person ms609    schedule 13.04.2016

посмотрите примеры функций bootstrap.phyDat и plotBS в phangorn, это должно упростить вашу функцию. Кроме того, вам не нужно корневать отдельные деревья начальной загрузки, только дерево, которое вы хотите нарисовать. Это должно решить вашу проблему.

С уважением, Клаус

person klash    schedule 01.11.2015
comment
Уважаемый Клаус, я использовал некорневые деревья, но потом я понял, что внутренним узлам были присвоены некоторые явно неправильные значения начальной загрузки. Затем я наткнулся на этот поток stackoverflow (stackoverflow. com / questions / 27526522 /), где, ссылаясь на FAQ 14 (ape- package.ird.fr/ape_faq.html#bootphylo), рекомендуется создать корневое дерево перед назначением значений начальной загрузки. - person Ikram Ullah; 01.11.2015
comment
Я пробовал использовать bootstrap.phyDat (), используя FUN, который укореняет неориентированное дерево, и получил ту же ошибку. Ошибка в phy $ edge [sndcol, 2] ‹- newNb [phy $ edge [sndcol, 2]]‹ - n + 2: phy $ Nnode: количество заменяемых элементов не кратно длине замены - person Ikram Ullah; 01.11.2015
comment
treeMP = read.tree (text = write.tree (treeMP)) перед рутированием должно решить вашу проблему. - person klash; 02.11.2015