macro [ 500 ; macro * 7 10000 ; report- ; lquote=; lquote[; macro=; if ( !argnumber ) errmsg &10&10Must indicate characters to run (use &34--help&34&32 for help) &10&10; end var : finalp evolv_var extern_var usertree numrecs daprob inc_evolv_var [ (2*root) ] goestonod[ (2*root) ] plotrow plotcol maxstorrays numstord_recs i rali[ (2*root) ] matches compsize atcomp truetreenodz numsavedplots states_evolv_var [ (2*root) ] states_extern_var [ (2*root) ] simulated_var[ ( 2*root) ] numrandomz saveplots rec_pick begval atnod pickdchgs [ (2*root) ] myr myalfa mybeta helped prundsome factor simple obsr obsalfa obsbeta twotailed ispos nummatches instp ; goto = %0 ; goto parseargs %1 %2 %3 %4 %5 %6 %7 %8 %9 %(10) %(11) %(12) %(13) %(14) %(15) %(16) %(17) %(18) %(19) ; if ( 'helped' ) proc/; end /*** Eliminate taxa with missing entries in either character, and calculate compsize *************/ sil = all ; set prundsome 0 ; agroup =0 (unobserved) ; loop 0 ntax if ( ( ( contmins[ 'evolv_var' #1 ] == 0 ) && ( contmaxs[ 'evolv_var' #1 ] == 65.535 ) ) || ( ( contmins[ 'extern_var' #1 ] == 0 ) && ( contmaxs[ 'extern_var' #1 ] == 65.535 ) ) ) if ( isintree [ 'usertree' #1 ] ) set prundsome 1 ; end agroup >0 #1 ; end stop pruntax 'usertree' /{ unobserved } ; set compsize 0 ; loop 0 ntax if ( !isintree [ 'usertree' #1 ] ) continue ; end set compsize ++ ; stop set atcomp 0 ; sil-all ; if ( 'prundsome' ) quote &10NOTE: taxa with missing entry in either character deleted from tree &10&10; end if ( 'saveplots' ) var: obstates['compsize'] plotx['compsize'] ploty['compsize'] ; set plotrow 0 ; set plotcol 0 ; end loop 0 nnodes[ 'usertree' ] if ( !isintree [ 'usertree' #1 ] ) continue ; end set goestonod [ 'atcomp' ] #1 ; set atcomp ++ ; stop set truetreenodz 'atcomp' ; silent = all ; set numrecs 0 ; iterrecs 'usertree' 'evolv_var' inc_evolv_var set numrecs ++ ; endrecs sil-all ; quote TOTAL RECONSTRUCTIONS: 'numrecs' &10; sil = all ; var: stordx [ 'maxstorrays' (2*ntax+2) ] ; set atcomp 0 ; loop 0 ntax if ( !isintree[ 'usertree' #1 ] ) continue ; end set states_extern_var[ 'atcomp' ] contmins[ 'extern_var' #1 'usertree' ] + contmaxs[ 'extern_var' #1 'usertree' ] / 2 ; set states_evolv_var[ 'atcomp' ] contmins[ 'evolv_var' #1 'usertree' ] + contmaxs[ 'evolv_var' #1 'usertree' ] / 2 ; set atcomp ++ ; stop var & states_evolv_var states_extern_var 'compsize' ; if ( 'saveplots' ) set * obstates states_evolv_var ; end set obsr spearman [ states_evolv_var states_extern_var 'compsize' ] ; set ispos 1 ; sil-all ; quote OBSERVED CORRELATION: 'obsr' &10 ; sil = all ; if ( 'twotailed' ) if ( 'obsr' < 0 ) set obsr (-'obsr') ; end else if ( 'obsr' < 0 ) set ispos 0 ; end end if ( 'simple' ) if ( 'twotailed' ) set finalp spearman [ states_evolv_var states_extern_var 'compsize' * 'numrandomz' ] ; else if ( 'obsr' < 0 ) set finalp spearman [ states_evolv_var states_extern_var 'compsize' < 'numrandomz' ] ; else set finalp spearman [ states_evolv_var states_extern_var 'compsize' > 'numrandomz' ] ; end end sil-all ; quote Final P (simple permutation): '/.3finalp' &10('numrandomz' permutations done)&10; proc/; end /********* Randomly select some reconstructions for X (for subsequent testing) ***************/ set numstord_recs (-1) ; if ( 'numrecs' <= 'maxstorrays' ) iterrecs 'usertree' 'evolv_var' + inc_evolv_var set numstord_recs ++ ; set atcomp 0 ; loop 0 nnodes['usertree'] if ( !isintree [ 'usertree' #1 ] ) continue ; end set stordx['numstord_recs' 'atcomp'] 'inc_evolv_var[#1]' ; set atcomp ++ ; stop endrecs else var : atmpsel['maxstorrays'] ; loop 1 'maxstorrays' set i getrandom[0 ('numrecs'-1)] ; if ( 'numstord_recs' >= 0 ) set matches 0 ; loop 0 'numstord_recs' if ( 'atmpsel[#2]' == 'i' ) set matches 1 ; endloop ; end stop if ( 'matches' ) setloop #1 ; end end set numstord_recs ++ ; set atmpsel['numstord_recs'] 'i' ; stop set numstord_recs (-1) ; set i 0 ; iterrecs 'usertree' 'evolv_var' + inc_evolv_var set matches 0 ; loop 0 ('maxstorrays'-1) if ( 'atmpsel[#1]' == 'i' ) set matches 1 ; endloop ; end stop set i ++ ; if ( !'matches' ) proc/; end set numstord_recs ++ ; set atcomp 0 ; loop 0 nnodes['usertree'] set stordx['numstord_recs' 'atcomp' ] 'inc_evolv_var[#1]' ; set atcomp ++ ; stop endrecs var - atmpsel ; end set begval ( contmins[ 'evolv_var' root 'usertree' ] + contmaxs[ 'evolv_var' root 'usertree' ] ) / 2 ; loop 1 'numrandomz' set rec_pick getrandom[ 0 'numstord_recs' ] ; set simulated_var[ root ] 'begval' ; set rali randomlist[ 'truetreenodz' ] ; /* this list must randomize as many values as nodes are actually in tree **/ set atcomp 0 ; loop 0 nnodes['usertree'] if ( !isintree [ 'usertree' #2 ] ) continue ; end set pickdchgs[ #2 ] 'stordx[ 'rec_pick' 'goestonod[ 'rali[ 'atcomp' ]' ]' ]' ; set atcomp ++ ; stop travtree up terms 'usertree' root - atnod set simulated_var['atnod'] 'simulated_var[anc[ 'usertree' 'atnod']]' + 'pickdchgs[ 'atnod' ]' ; endtrav set atcomp 0 ; loop 0 nnodes [ 'usertree' ] if ( !isintree[ 'usertree' #2 ] ) continue ; end set states_evolv_var[ 'atcomp' ] 'simulated_var[ #2 ]' ; set atcomp ++ ; stop var & states_evolv_var states_extern_var 'compsize' ; set myalfa regalfa ; set mybeta regbeta ; set myr spearman [ states_evolv_var states_extern_var 'compsize' ] ; set matches 0 ; if ( 'twotailed' ) if ( 'myr' < 0 ) set i (-'myr') ; else set i 'myr' ; end if ( 'i' >= 'obsr' ) set matches 1 ; end else if ( ( 'obsr' < 0 ) && ( 'myr' <= 'obsr' ) ) set matches 1 ; end if ( ( 'obsr' > 0 ) && ( 'myr' >= 'obsr' ) ) set matches 1 ; end end if ( 'matches' ) set nummatches ++ ; end if ( 'numsavedplots' < 'saveplots' ) goto doplots 'matches' ; end set instp 'nummatches' / (#1+1) ; sil - all ; quote Randomized: '/+8myr' matches = '/-5.0nummatches' inst. P ='/6.3instp' ; if ( 'matches' ) quote -- A MATCH!! ; end quote &10 ; sil = all ; stop sil - all ; set numrandomz ++ ; set finalp 'nummatches' / ('numrandomz') ; quote Final P: '/.3finalp' &10('nummatches' matches out of 'numrandomz')&10; if ( 'saveplots' ) var ! ; end proc/; label parseargs ; set helped 0 ; if ( argnumber == 1 ) if ( eqstring [ %1 --help ] ) sil - all ; quote &10&10 DUAL-COR - a TNT script by Goloboff and Giannini, &10 using Spearman correlation to effect the test &10 Options (defaults in square brackets): &10 twotailed perform a two tailed test [ one-tailed ] tree N perform test on tree N [ tree 0 ] evol N use char N as the evolving one [ char 0 ] nevol N use char N as the non-evolving variable [ char 1 ] repls N do N randomizations for the test [ 499 ] save N save N randomization plots to file plots.svg [ don&39t ] simple instead of permuting on tree, just [ permute permute ranks (=faster) on tree ] &10 Tested characters must all be continuous! &10&10; set helped 1 ; proc/; end end set saveplots 0 ; set numsavedplots 0 ; set twotailed 0 ; set numrandomz 499; set evolv_var 0 ; set extern_var 1 ; set usertree 0 ; set maxstorrays 10 ; /* Change this to store more arrays! */ set nummatches 1 ; set simple 0 ; var: i j ; loop 1 argnumber set i #1 ; set j #1 + 1 ; if ( eqstring [ %('i') twotailed ] ) set twotailed 1 ; quote SETTING TWO-TAILED TEST &10 ; set i ++ ; setloop 'i' ; end if ( eqstring [ %('i') simple ] ) set simple 1 ; quote SETTING SIMPLE PERMUTATION TEST &10 ; set i ++ ; setloop 'i' ; end if ( eqstring [ %('i') save ] ) if ( 'j' > argnumber ) errmsg Need to give number of plots to save &10 ; end set saveplots %('j') ; quote 'saveplots' DIAGRAMS WILL BE SAVED TO FILE &34plots.svg&34 &10 ; set j ++ ; setloop 'j' ; end if ( eqstring [ %('i') tree ] ) if ( 'j' > argnumber ) errmsg Need to give tree number &10 ; end set usertree %('j') ; quote SETTING TREE: 'usertree' &10 ; set j ++ ; setloop 'j' ; end if ( eqstring [ %('i') evol ] ) if ( 'j' > argnumber ) errmsg Need to give number of evolving character &10 ; end set evolv_var %('j') ; quote SETTING EVOLVING CHAR: 'evolv_var' &10 ; set j ++ ; setloop 'j' ; end if ( eqstring [ %('i') nevol ] ) if ( 'j' > argnumber ) errmsg Need to give number of non-evolving character &10 ; end set extern_var %('j') ; quote SETTING NON-EVOLVING CHAR: 'extern_var' &10 ; set j ++ ; setloop 'j' ; end if ( eqstring [ %('i') repls ] ) if ( 'j' > argnumber ) errmsg Give number of randomizations &10 ; end set numrandomz %('j') ; quote SETTING REPLS: 'numrandomz' &10 ; set j ++ ; setloop 'j' ; end errmsg &10 Unrecognized argument: %('i') &10&10; stop if ( !iscont[ 'evolv_var' ] ) errmsg Character X ('evolv_var' ) is NOT continuous., please recode &10 ; end if ( !iscont[ 'extern_var' ] ) errmsg Character Y ('extern_var' ) is NOT continuous., please recode &10 ; end if ( 'evolv_var' == 'extern_var' ) errmsg Why on earth do you want to test correlation of a character with itself?? &10 ; end proc/; label doplots ; var: i ; if ( !'numsavedplots' ) set i 'saveplots' / 5 + 0.49999 ; var \600 400 /50 x 5 x '/.0i' ; var ! plots.svg ; end set factor 0.95 + ( getrandom[ 0 10 ] / 100 ) ; loop 0 ('compsize'-1) set plotx[#1] 'states_evolv_var[#1]' * 'factor' ; stop loop 0 ('compsize'-1) set ploty[#1] 'states_extern_var[#1]' * 'factor' ; stop var & plotx ploty ; var ++ /minval[plotx] regalfa maxval[plotx] ( maxval[ plotx ] * regbeta + regalfa ) ( 0 0 0 2 ) 40 40 plotx ploty 10 (0 0 0) ; set * plotx obstates ; loop 0 ('compsize'-1) set ploty[#1] 'states_extern_var[#1]' ; stop var & plotx ploty ; var + /minval[plotx] regalfa maxval[plotx] ( maxval[ plotx ] * regbeta + regalfa ) ( 255 0 0 2 ) 40 40 plotx ploty 10 (255 0 0) ; if ( %1 == 1 ) var !! *OBSR 'obsr' - Randomized R 'myr'; else var !! OBSR 'obsr' - Randomized R 'myr'; end set numsavedplots ++ ; if ( 'plotcol' < 4 ) set plotcol ++ ; var != 'plotcol' , 'plotrow' ; else if ( 'numsavedplots' < 'saveplots' ) set plotcol 0 ; set plotrow ++ ; var != 0 ,'plotrow' ; end end proc/;