Neighbor joining

A tree can be inferred from pairwise distances using the neighbor joining algorithm (Satou & Nei 1987)

calculating distances

To read a DNA sequence alignment, see readphylip and PhyloNetworks.readfastatoarray. Then, to estimate distances from aligned sequences, see PhyloNetworks.hammingdistancematrix and consider PhyloNetworks.distancecorrection_JC!, with an example given in the hamming distance section.

Next, we use a pre-computed distance matrix.

getting the joining algorithm tree

The nj function takes a data frame of pairwise distances as input and constructs a tree using the neighbor joining method. The column names (headers) are used as taxon names. Rows are assumed to correspond to taxa in the same order as they do in columns.

julia> D = DataFrame(CSV.File(joinpath(dirname(pathof(PhyloNetworks)), "..","examples","caudata_dist.txt")); copycols=false);
julia> tree = nj(D)HybridNetwork, Semidirected Network 391 edges 392 nodes: 197 tips, 0 hybrid nodes, 195 internal tree nodes. tip labels: Dicamptodon_copei, Dicamptodon_tenebrosus, Dicamptodon_ensatus, Ambystoma_texanum, ... (((((((((((((((((Dicamptodon_copei:15.884,Dicamptodon_tenebrosus:15.884):8.233,Dicamptodon_ensatus:24.117):93.88,(((((((Ambystoma_texanum:9.553,Ambystoma_barbouri:9.553):30.728,Ambystoma_opacum:40.282):5.647,(Ambystoma_cingulatum:42.904,Ambystoma_annulatum:42.904):3.025):5.327,(Ambystoma_laterale:36.156,Ambystoma_jeffersonianum:36.156):15.1):0.919,(((Ambystoma_ordinarium:15.863,Ambystoma_mavortium:15.863):12.356,Ambystoma_velasci:28.219):14.551,Ambystoma_californiense:42.77):9.405):5.771,Ambystoma_macrodactylum:57.946):1.474,(Ambystoma_maculatum:51.411,Ambystoma_gracile:51.411):8.009):58.58):45.0,((Salamandrina_terdigitata:64.263,((Salamandra_atra:24.844,Salamandra_salamandra:24.844):33.738,(Chioglossa_lusitanica:53.572,Mertensiella_caucasica:53.572):5.009):5.682):38.737,(((((Taricha_granulosa:31.043,Taricha_torosa:31.043):4.426,Taricha_rivularis:35.47):37.651,(Notophthalmus_meridionalis:59.959,(Notophthalmus_perstriatus:42.314,Notophthalmus_viridescens:42.314):17.645):13.162):9.05,((Ichthyosaura_alpestris:66.952,((Lissotriton_vulgaris:10.674,Lissotriton_montandoni:10.674):28.878,(Lissotriton_helveticus:28.878,Lissotriton_boscai:28.878):10.674):27.399):0.309,((((Triturus_pygmaeus:23.155,Triturus_cristatus:23.156):17.383,Calotriton_asper:40.538):10.661,(Ommatotriton_vittatus:51.058,(Neurergus_crocatus:25.963,Neurergus_strauchii:25.963):25.095):0.142):1.005,((Cynops_pyrrhogaster:9.606,Cynops_ensicauda:9.606):24.532,((Paramesotriton_caudopunctatus:18.968,(Paramesotriton_chinensis:12.887,Paramesotriton_hongkongensis:12.887):6.081):8.325,Pachytriton_brevipes:27.293):6.846):18.066):15.056):14.911):6.662,((Echinotriton_andersoni:54.137,((Tylototriton_verrucosus:19.644,Tylototriton_kweichowensis:19.644):19.506,Tylototriton_asperrimus:39.149):14.988):23.936,Pleurodeles_waltl:78.073):10.76):14.167):60.0):18.0,((((Paradactylodon_mustersi:47.558,Ranodon_sibiricus:47.558):13.982,(((((Batrachuperus_pinchonii:23.927,Batrachuperus_yenyuanensis:23.927):18.314,Liua_shihi:42.241):5.514,Salamandrella_keyserlingii:47.755):3.939,((((((Hynobius_nebulosus:10.261,Hynobius_dunni:10.261):4.681,Hynobius_tsuensis:14.942):8.821,Hynobius_leechii:23.763):1.917,Hynobius_naevius:25.68):2.237,Hynobius_stejnegeri:27.917):1.432,((Hynobius_nigrescens:19.245,Hynobius_lichenatus:19.245):3.491,Hynobius_abei:22.736):6.613):22.345):5.219,Pachyhynobius_shangchengensis:56.912):4.628):99.46,(Cryptobranchus_alleganiensis:66.0,Andrias_davidianus:66.0):95.0):33.0,((Siren_lacertina:19.4,Siren_intermedia:19.4):54.6,Pseudobranchus_axanthus:74.0):160.0):13.0):11.0,((Necturus_punctatus:84.504,((Necturus_alabamensis:70.992,Necturus_beyeri:70.992):4.158,Necturus_maculosus:75.15):9.354):61.496,Proteus_anguinus:146.0):24.0):18.0,(((Rhyacotriton_olympicus:1.762,Rhyacotriton_kezeri:1.762):5.757,Rhyacotriton_cascadae:7.519):1.141,Rhyacotriton_variegatus:8.66):143.34):12.0,((Amphiuma_pholeter:2.741,Amphiuma_means:2.741):3.939,Amphiuma_tridactylum:6.68):133.32):31.0,(Hemidactylium_scutatum:99.96,(((Batrachoseps_wrighti:65.264,(Batrachoseps_attenuatus:38.072,Batrachoseps_major:38.072):27.192):15.383,(((((((Bolitoglossa_adspersa:13.221,Bolitoglossa_palmata:13.221):15.829,Bolitoglossa_subpalmata:29.032):12.917,(((Bolitoglossa_dofleini:30.533,Bolitoglossa_morio:30.515):2.198,(Bolitoglossa_engelhardti:14.579,Bolitoglossa_rostrata:14.579):18.134):6.307,((Bolitoglossa_platydactyla:21.296,(Bolitoglossa_mexicana:9.951,Bolitoglossa_yucatana:9.951):11.363):10.434,(Bolitoglossa_occidentalis:18.402,Bolitoglossa_rufescens:18.402):13.328):7.307):2.93):12.202,((Parvimolge_townsendi:45.79,((Pseudoeurycea_leprosa:28.711,Pseudoeurycea_werleri:28.746):7.289,((Pseudoeurycea_robertsi:10.184,Pseudoeurycea_gadovii:10.201):9.38,Pseudoeurycea_rex:19.563):16.437):9.791):3.305,(Pseudoeurycea_bellii:39.305,(Pseudoeurycea_cephalica:23.154,Pseudoeurycea_galeanae:23.154):16.151):9.808):5.056):9.487,((((Chiropterotriton_dimidiatus:13.453,Chiropterotriton_lavae:13.453):5.931,Chiropterotriton_priscus:19.385):6.342,Chiropterotriton_multidentatus:25.727):3.948,Chiropterotriton_chondrostega:29.675):33.963):6.521,(((Bradytriton_silus:46.844,((Oedipina_complex:9.219,Oedipina_parvipes:9.219):22.904,(Oedipina_cyclocauda:24.566,Oedipina_uniformis:24.566):7.539):14.722):8.415,Nototriton_picadoi:55.259):8.611,Nyctanolis_pernix:63.889):6.289):1.322,Cryptotriton_nasalis:71.482):9.165):8.04,(((Eurycea_quadridigitata:36.643,((((Eurycea_cirrigera:18.866,Eurycea_bislineata:18.866):4.091,((Eurycea_aquatica:10.38,Eurycea_junaluska:10.38):3.395,Eurycea_wilderae:13.775):9.183):9.058,(Eurycea_lucifuga:16.901,Eurycea_longicauda:16.901):15.097):3.377,(Eurycea_rathbuni:10.898,(Eurycea_nana:3.162,(Eurycea_sosorum:2.716,(Eurycea_neotenes:1.644,Eurycea_tridentifera:1.644):1.072):0.447):7.736):24.476):1.268):3.698,((Eurycea_tynerensis:25.548,Eurycea_spelaea:25.548):11.166,Eurycea_multiplicata:36.697):3.645):26.781,((Gyrinophilus_porphyriticus:37.0,Stereochilus_marginatus:37.0):4.663,(Pseudotriton_montanus:37.465,Pseudotriton_ruber:37.465):4.198):25.459):21.582):11.256):9.022):22.976,(((((((((((Desmognathus_brimleyorum:17.723,Desmognathus_auriculatus:17.723):2.412,Desmognathus_monticola:20.153):3.019,(Desmognathus_ochrophaeus:18.42,(Desmognathus_welteri:15.668,Desmognathus_fuscus:15.668):2.751):4.752):4.681,Desmognathus_imitator:27.853):4.681,(Desmognathus_quadramaculatus:28.943,Desmognathus_marmoratus:28.943):3.591):2.984,Desmognathus_aeneus:35.535):14.436,Desmognathus_wrighti:49.953):15.972,Phaeognathus_hubrichti:65.943):8.808,(((Aneides_flavipunctatus:29.872,Aneides_lugubris:29.872):8.486,Aneides_hardii:38.358):15.865,Aneides_aeneus:54.223):20.528):2.859,Ensatina_eschscholtzii:77.61):2.323,(Hydromantes_italicus:38.162,Hydromantes_platycephalus:38.162):41.771):6.074):11.13,(((Plethodon_vandykei:11.452,Plethodon_idahoensis:11.452):41.896,Plethodon_neomexicanus:53.33):1.054,((Plethodon_vehiculum:30.837,Plethodon_dunni:30.837):12.381,Plethodon_elongatus:43.2):11.184):20.474):26.459,((Plethodon_hoffmani:21.225,(((Plethodon_nettingi:11.631,Plethodon_hubrichti:11.631):1.733,Plethodon_richmondi:13.382):6.325,(Plethodon_cinereus:12.738,Plethodon_shenandoah:12.738):6.95):1.536):10.934,Plethodon_serratus:32.177):16.222):7.039,((Plethodon_punctatus:8.754,Plethodon_wehrlei:8.754):26.763,(Plethodon_welleri:28.264,(Plethodon_angusticlavius:18.759,(Plethodon_dorsalis:15.418,Plethodon_ventralis:15.418):3.341):9.505):7.271):5.842):13.507,Plethodon_yonahlossee:27.853):1.947,Plethodon_kentucki:25.923):1.126,(Plethodon_jordani:16.651,Plethodon_metcalfi:16.651):8.147):0.733,(Plethodon_caddoensis:18.688,Plethodon_ouachitae:18.688):5.36,((((Plethodon_albagula:8.2,Plethodon_grobmani:8.2):2.555,Plethodon_mississippi:10.755):5.646,Plethodon_glutinosus:16.401):6.182,(((Plethodon_chlorobryonis:8.147,(Plethodon_teyahalee:3.841,Plethodon_cylindraceus:3.841):4.288):1.626,(Plethodon_cheoah:8.915,Plethodon_shermani:8.915):0.858):7.236,((Plethodon_amplus:4.395,Plethodon_meridianus:4.395):4.877,Plethodon_montanus:9.272):7.736):5.574):1.465);

There is also a method PhyloNetworks.nj!, which takes a distance matrix and a vector of the names as argument. This function, however, would modify D. One also has to make sure the vector of names match the columns/rows of the distance matrix.