Neighbor joining
A tree can be inferred from pairwise distances using the neighbor joining algorithm (Satou & Nei 1987)
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.