Nested Hierarchy and Bootstrap Values

Hi all,

Sorry to start yet another new thread, but I have a question about nested hierarchies and bootstrap values.

I created a simple program that generates DNA sequences via an evolutionary algorithm, where each generation, every sequence splits into two ‘daughter’ sequences that gain several mutations. I then input the sequences into FastME, a program that infers phylogenetic trees from sequence data (Lefort et al. 2015).

I also created a different program that generates random sequences, and input those into FastME as well.

I did this in order to test for myself how accurate phylogenetic algorithms are, to see if they could correctly identify the true relationships between each descendant sequence. (The random sequences were basically meant to be a control group.) This was partially inspired by Holloway’s claim of “the fallacy of the phylogenetic signal,” since he suggested that non-evolutionarily produced sequences have just as much phylogenetic signal as evolutionarily produced sequences, and I wanted to test that claim for myself.

What I found was, unsurprisingly, that the random sequences had no discernable phylogenetic signal, and the resulting tree had bootstrap values of 0 at every single node. Furthermore, FastME was able to correctly reconstruct the relationships between the ‘descendant’ sequences produced by the evolutionary algorithm, with much higher bootstrap values than the tree produced by random sequences.

However, despite the fact that FastME was able to reconstruct the correct relationships between the ‘descendant’ sequences every time, some of the bootstrap values were very low – even zero. For example, here are two of the trees produced by FastME:



I thought that maybe the problem was just that there weren’t enough characters (the sequences were only 100 nucleotides long), so I then generated sequences that were 10,000 nucleotides long. But I still had the same problem:

file copy 2
As you can see, although the bootstrap values were higher overall, some nodes still had bootstrap values of zero.

Can someone explain what this might mean? Does this reflect on the validity of bootstrapping techniques for phylogenetics? Or was there something wrong with my analysis?


Hey, you ask interesting questions, Keep firing! :slight_smile:

I went a few rounds with @EricMH on this topic (or close to it) on Biologos two years ago, This slightly predates the same claims that appeared at The Skeptical Zone.



Something might be wrong with your bootstrap. I wouldn’t expect to see any values of 0, much less at every node, even with random data. I’m afraid your graphics don’t show up for me, so I can’t comment on the trees.


Question about FastME: how is it possible to use branch-swapping with a clustering algorithm similar to neighbor-joining? Branch-swapping demands an optimality criterion to enable choice among trees, but what is that criterion here?

Seems to be a FastME problem. All but one nodes have 100% support in Maximum Likelihood analysis for the evolutionary simulation data (I did one with 6 generations and 1500 bp sequences). The one node that didn’t, had 83% support.


On a tangential note the FastME algorithm is incredibly fast compared to ML it seems. Took under 1 minute to infer the tree with bootstrap for FastME, it’s on 15 minutes now for ML and still isn’t finished. I just wanted to see if the same problem appears with the ML and bootstrap.

1 Like

FWIW, I was interested in related questions, so I generated three sequence data sets using a version of the simulation described here: X-Men Constructive Neutral Evolution

(More details available via this blog series which starts here.)

The first data set involved multiple populations, each with a random starting genome.

The second data set involved multiple populations all starting from the same initial genome.

The third data set involved a single starting population sampled at various times.

In the third chart, the color of the labels represents the generation number, to indicate that the tree not only has high bootstrap values but also in fact reproduces the relationships between the sequences (since similar colors are closer together on the tree).

Crucially, all sequences in all trees represent full solutions to the same problem. So they are functionally equivalent and satisfy the same design requirements. Yet they do not all possess the same degree of phylogenetic signal.

All analysis was done in R using the NJ, optim.pml and bootstrap.pml functions from the phangorn package.

This was a learning exercise for me as well as hopefully an illustration of the differences between what is expected from convergent evolution, unnested divergence from a common starting point, and common descent. So if there are ways to improve or if some version of this would be helpful to someone, I’m happy to discuss.


I think it probably gets a tree by an MLish NJ-like clustering and then branch-swaps on it using ML as the criterion.

Can anyone confirm that? This seems unlikely given that it’s so fast.

Thanks all, this has been very helpful. I guess FastME just has a bad bootstrapping algorithm (?). What other, better programs are out there to run phylogenies?

Why do only a few nodes have support values in the two top trees? Also what’s the actual data the trees are inferred from?

Do taxa names actually say something about relationships in the first two trees?

I don’t understand FastME’s phylogenetic algorithm, that claims to swap branches without any criterion for determining whether the swap improves fit. Can’t tell about the bootstrap.

As for good programs, there’s nothing wrong with PHYLIP or PAUP. RaxML is popular.

1 Like

FastME infers trees by the Minimum Evolution distance method. That involves clustering to get a tree, with each tree having the lengths of its branches inferred by the Fitch-Margoliash least squares method. Then the evaluation of the tree is the sum of the lengths of all branches (this is slightly weird because it does not use the least-squares measure for the score of the tree, but so be it). The tree can be rearranged since each alternative tree does then have a score. At this link: ATGC: FastME one can find that FastME has options for Nearest-Neighbor Interchange rearrangement, and also for the more extensive Subtree Pruning and Regrafting method, which is described as slower.

1 Like

My error. FASTME is not doing ML but ME (Minimum Evolution) which is a distance method.

1 Like

Ah, yes, sorry. Because the support value is below the threshold for printing, which I set as low as it goes. Effectively, no two bootstrap iterations agreed at those nodes.

The genomes sampled from the evolutionary computation simulation. I coded the simulation to use strings with an ACGT alphabet for compatibility with other tools.

The names are in the format T#G#, with T# indicating the trial number and G# representing the generation number.


I don’t have anything constructive to contribute, but just want to say, as a veteran/alum of reddit r/debateevolution and r/creation, this makes me so happy.


What do you think about PhyML?

Never tried it. My advice would be to try the programs that are referenced in phylogenetics papers. And you should use whatever model of evolution your simulation uses.

1 Like

Can I ask why? What does this have to do with r/debateevolution?

Sorry, maybe I have you confused with someone else, I thought you were a poster on the reddit subs. Seeing people from there pop up elsewhere talking about this stuff, and actually testing things, is extremely refreshing and rewarding.