context("Unit-testing Biogeographic Stochastic Mapping (BSM) on a simple 3-taxon tree, and time-stratified state space")
# Load the package (after installation, see above).
library(GenSA) # GenSA is better than optimx (although somewhat slower)
library(optimx) # GenSA is better than optimx (although somewhat slower)
library(FD) # for FD::maxent() (make sure this is up-to-date)
library(snow) # (if you want to use multicore functionality; some systems/R versions prefer library(parallel), try either)
library(parallel)
#######################################################
# 2018-10-10 update: I have been putting the
# updates on CRAN/GitHub
# You should use:
# rexpokit version 0.26.6 from CRAN
# cladoRcpp version 0.15 from CRAN
# BioGeoBEARS version 1.1 from GitHub, install with:
# library(devtools)
# devtools::install_github(repo="nmatzke/BioGeoBEARS")
#######################################################
library(rexpokit)
library(cladoRcpp)
library(BioGeoBEARS)
#
# Following example testthat usages at e.g.
# http://kbroman.org/pkg_primer/pages/tests.html
#
test_that(desc="Check that cladoRcpp version number is >= 0.15", code={
version_number = packageVersion("cladoRcpp")
TF = version_number >= 0.15
if (TF == FALSE)
{
txt = 'STOP ERROR inside test_that(desc="Check that cladoRcpp version number is >= 0.15"): the BioGeoBEARS "testthat" tests, located in BioGeoBEARS/tests, require that cladoRcpp have version 0.15 or higher to work. To get the new version, try "devtools::install_github(repo="nmatzke/cladoRcpp", quick=TRUE, dependencies=FALSE, build_vignettes=FALSE, keep_source=TRUE, local=FALSE, force=TRUE)".'
cat("\n\n")
cat(txt)
cat("\n\n")
}
expect_equal(object=TF, expected=TRUE)
}) # END test_that
test_that(desc="Check that GenSA is installed", code={
TF = is.element("GenSA", installed.packages()[,1])
if (TF == FALSE)
{
txt = 'STOP ERROR inside test_that(desc="Check that GenSA is installed"): the BioGeoBEARS "testthat" tests of trait-based models, located in BioGeoBEARS/tests, require that GenSA be installed. To get it, try \n\ninstall.packages("GenSA")\n.\n'
cat("\n\n")
cat(txt)
cat("\n\n")
}
expect_equal(object=TF, expected=TRUE)
}) # END test_that
test_that(desc="Check Biogeographic Stochastic Mapping on a 3-taxon tree, with changing areas allowed", code={
# Skip the slow tests in online checks
testthat::skip_on_cran()
testthat::skip_on_travis()
#######################################################
# SETUP: YOUR WORKING DIRECTORY
#######################################################
# You will need to set your working directory to match your local system
# Note these very handy functions!
# Command "setwd(x)" sets your working directory
# Command "getwd()" gets your working directory and tells you what it is.
# Command "list.files()" lists the files in your working directory
# To get help on any command, use "?". E.g., "?list.files"
# Set your working directory for output files
# default here is your home directory ("~")
# Change this as you like
# wd = "/drives/GDrive/z_help/Furnariidae_Bio_Geo/BSM_small/M3areas_allowed/"
# setwd(wd)
# Double-check your working directory with getwd()
getwd()
#######################################################
# SETUP: Extension data directory
#######################################################
# When R packages contain extra files, they are stored in the "extdata" directory
# inside the installed package.
#
# BioGeoBEARS contains various example files and scripts in its extdata directory.
#
# Each computer operating system might install BioGeoBEARS in a different place,
# depending on your OS and settings.
#
# However, you can find the extdata directory like this:
extdata_dir = np(system.file("extdata", package="BioGeoBEARS"))
extdata_dir
list.files(extdata_dir)
wd = slashslash(paste0(addslash(extdata_dir), "/examples/BSM_3taxa/M3areas_allowed/"))
setwd(wd)
# "system.file" looks in the directory of a specified package (in this case BioGeoBEARS)
# The function "np" is just a shortcut for normalizePath(), which converts the
# path to the format appropriate for your system (e.g., Mac/Linux use "/", but
# Windows uses "\\", if memory serves).
# Even when using your own data files, you should KEEP these commands in your
# script, since the plot_BioGeoBEARS_results function needs a script from the
# extdata directory to calculate the positions of "corners" on the plot. This cannot
# be made into a straight up BioGeoBEARS function because it uses C routines
# from the package APE which do not pass R CMD check for some reason.
#######################################################
# SETUP: YOUR TREE FILE AND GEOGRAPHY FILE
#######################################################
# Example files are given below. To run your own data,
# make the below lines point to your own files, e.g.
# trfn = "/mydata/frogs/frogBGB/tree.newick"
# geogfn = "/mydata/frogs/frogBGB/geog.data"
#######################################################
# Phylogeny file
# Notes:
# 1. Must be binary/bifurcating: no polytomies
# 2. No negative branchlengths (e.g. BEAST MCC consensus trees sometimes have negative branchlengths)
# 3. Be careful of very short branches, as BioGeoBEARS will interpret ultrashort branches as direct ancestors
# 4. You can use non-ultrametric trees, but BioGeoBEARS will interpret any tips significantly below the
# top of the tree as fossils! This is only a good idea if you actually do have fossils in your tree,
# as in e.g. Wood, Matzke et al. (2013), Systematic Biology.
# 5. The default settings of BioGeoBEARS make sense for trees where the branchlengths are in units of
# millions of years, and the tree is 1-1000 units tall. If you have a tree with a total height of
# e.g. 0.00001, you will need to adjust e.g. the max values of d and e, or (simpler) multiply all
# your branchlengths to get them into reasonable units.
# 6. DON'T USE SPACES IN SPECIES NAMES, USE E.G. "_"
#######################################################
# This is the example Newick file for Hawaiian 3taxa
# (from Ree & Smith 2008)
# "trfn" = "tree file name"
trfn = "tree.newick"
# Look at the raw Newick file:
moref(trfn)
# Look at your phylogeny:
pdffn = "tree.pdf"
pdf(file=pdffn, width=6, height=6)
tr = read.tree(trfn)
tr
plot(tr)
title("Example 3-taxon tree")
axisPhylo() # plots timescale
dev.off()
#######################################################
# Geography file
# Notes:
# 1. This is a PHYLIP-formatted file. This means that in the
# first line,
# - the 1st number equals the number of rows (species)
# - the 2nd number equals the number of columns (number of areas)
# - after a tab, put the areas in parentheses, with spaces: (A B C D)
#
# 1.5. Example first line:
# 10 4 (A B C D)
#
# 2. The second line, and subsequent lines:
# speciesA 0110
# speciesB 0111
# speciesC 0001
# ...
#
# 2.5a. This means a TAB between the species name and the area 0/1s
# 2.5b. This also means NO SPACE AND NO TAB between the area 0/1s.
#
# 3. See example files at:
# http://phylo.wikidot.com/biogeobears#files
#
# 4. Make you understand what a PLAIN-TEXT EDITOR is:
# http://phylo.wikidot.com/biogeobears#texteditors
#
# 3. The PHYLIP format is the same format used for C++ LAGRANGE geography files.
#
# 4. All names in the geography file must match names in the phylogeny file.
#
# 5. DON'T USE SPACES IN SPECIES NAMES, USE E.G. "_"
#
# 6. Operational taxonomic units (OTUs) should ideally be phylogenetic lineages,
# i.e. genetically isolated populations. These may or may not be identical
# with species. You would NOT want to just use specimens, as each specimen
# automatically can only live in 1 area, which will typically favor DEC+J
# models. This is fine if the species/lineages really do live in single areas,
# but you wouldn't want to assume this without thinking about it at least.
# In summary, you should collapse multiple specimens into species/lineages if
# data indicates they are the same genetic population.
######################################################
# This is the example geography file for Hawaiian 3taxa
# (from Ree & Smith 2008)
geogfn = "geog.data"
# Look at the raw geography text file:
moref(geogfn)
# Look at your geographic range data:
tipranges = getranges_from_LagrangePHYLIP(lgdata_fn=geogfn)
tipranges
# Maximum range size observed:
max(rowSums(dfnums_to_numeric(tipranges@df)))
# Set the maximum number of areas any species may occupy; this cannot be larger
# than the number of areas you set up, but it can be smaller.
max_range_size = 3
####################################################
####################################################
# KEY HINT: The number of states (= number of different possible geographic ranges)
# depends on (a) the number of areas and (b) max_range_size.
# If you have more than about 500-600 states, the calculations will get REALLY slow,
# since the program has to exponentiate a matrix of e.g. 600x600. Often the computer
# will just sit there and crunch, and never get through the calculation of the first
# likelihood.
#
# (this is also what is usually happening when LAGRANGE hangs: you have too many states!)
#
# To check the number of states for a given number of ranges, try:
numstates_from_numareas(numareas=4, maxareas=4, include_null_range=TRUE)
numstates_from_numareas(numareas=4, maxareas=4, include_null_range=FALSE)
numstates_from_numareas(numareas=4, maxareas=3, include_null_range=TRUE)
numstates_from_numareas(numareas=4, maxareas=2, include_null_range=TRUE)
# Large numbers of areas have problems:
numstates_from_numareas(numareas=10, maxareas=10, include_null_range=TRUE)
# ...unless you limit the max_range_size:
numstates_from_numareas(numareas=10, maxareas=2, include_null_range=TRUE)
####################################################
####################################################
#######################################################
#######################################################
# DEC AND DEC+J ANALYSIS
#######################################################
#######################################################
# NOTE: The BioGeoBEARS "DEC" model is identical with
# the Lagrange DEC model, and should return identical
# ML estimates of parameters, and the same
# log-likelihoods, for the same datasets.
#
# Ancestral state probabilities at nodes will be slightly
# different, since BioGeoBEARS is reporting the
# ancestral state probabilities under the global ML
# model, and Lagrange is reporting ancestral state
# probabilities after re-optimizing the likelihood
# after fixing the state at each node. These will
# be similar, but not identical. See Matzke (2014),
# Systematic Biology, for discussion.
#
# Also see Matzke (2014) for presentation of the
# DEC+J model.
#######################################################
#######################################################
#######################################################
#######################################################
#######################################################
# Run DEC
#######################################################
# Intitialize a default model (DEC model)
BioGeoBEARS_run_object = define_BioGeoBEARS_run()
# Give BioGeoBEARS the location of the phylogeny Newick file
BioGeoBEARS_run_object$trfn = trfn
# Give BioGeoBEARS the location of the geography text file
BioGeoBEARS_run_object$geogfn = geogfn
# Input the maximum range size
BioGeoBEARS_run_object$max_range_size = max_range_size
BioGeoBEARS_run_object$min_branchlength = 0.000001 # Min to treat tip as a direct ancestor (no speciation event)
BioGeoBEARS_run_object$include_null_range = TRUE # set to FALSE for e.g. DEC* model, DEC*+J, etc.
# (For DEC* and other "*" models, please cite: Massana, Kathryn A.; Beaulieu,
# Jeremy M.; Matzke, Nicholas J.; O’Meara, Brian C. (2015). Non-null Effects of
# the Null Range in Biogeographic Models: Exploring Parameter Estimation in the
# DEC Model. bioRxiv, http://biorxiv.org/content/early/2015/09/16/026914 )
# Also: search script on "include_null_range" for other places to change
# Set up a time-stratified analysis:
# 1. Here, un-comment ONLY the files you want to use.
# 2. Also un-comment "BioGeoBEARS_run_object = section_the_tree(...", below.
# 3. For example files see (a) extdata_dir,
# or (b) http://phylo.wikidot.com/biogeobears#files
# and BioGeoBEARS Google Group posts for further hints)
#
# Uncomment files you wish to use in time-stratified analyses:
BioGeoBEARS_run_object$timesfn = "timeperiods.txt"
#BioGeoBEARS_run_object$dispersal_multipliers_fn = "manual_dispersal_multipliers.txt"
BioGeoBEARS_run_object$areas_allowed_fn = "areas_allowed_noC2.txt"
#BioGeoBEARS_run_object$areas_adjacency_fn = "areas_adjacency.txt"
#BioGeoBEARS_run_object$distsfn = "distances_matrix.txt"
# See notes on the distances model on PhyloWiki's BioGeoBEARS updates page.
# Speed options and multicore processing if desired
BioGeoBEARS_run_object$on_NaN_error = -1e50 # returns very low lnL if parameters produce NaN error (underflow check)
BioGeoBEARS_run_object$speedup = TRUE # shorcuts to speed ML search; use FALSE if worried (e.g. >3 params)
BioGeoBEARS_run_object$use_optimx = "GenSA" # if FALSE, use optim() instead of optimx()
BioGeoBEARS_run_object$num_cores_to_use = 1
# (use more cores to speed it up; this requires
# library(parallel) and/or library(snow). The package "parallel"
# is now default on Macs in R 3.0+, but apparently still
# has to be typed on some Windows machines. Note: apparently
# parallel works on Mac command-line R, but not R.app.
# BioGeoBEARS checks for this and resets to 1
# core with R.app)
# Sparse matrix exponentiation is an option for huge numbers of ranges/states (600+)
# I have experimented with sparse matrix exponentiation in EXPOKIT/rexpokit,
# but the results are imprecise and so I haven't explored it further.
# In a Bayesian analysis, it might work OK, but the ML point estimates are
# not identical.
# Also, I have not implemented all functions to work with force_sparse=TRUE.
# Volunteers are welcome to work on it!!
BioGeoBEARS_run_object$force_sparse = FALSE # force_sparse=TRUE causes pathology & isn't much faster at this scale
# This function loads the dispersal multiplier matrix etc. from the text files into the model object. Required for these to work!
# (It also runs some checks on these inputs for certain errors.)
BioGeoBEARS_run_object = readfiles_BioGeoBEARS_run(BioGeoBEARS_run_object)
# Divide the tree up by timeperiods/strata (uncomment this for stratified analysis)
BioGeoBEARS_run_object = section_the_tree(inputs=BioGeoBEARS_run_object, make_master_table=TRUE, plot_pieces=FALSE)
# The stratified tree is described in this table:
#BioGeoBEARS_run_object$master_table
# Good default settings to get ancestral states
BioGeoBEARS_run_object$return_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_TTL_loglike_from_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_ancprobs = TRUE # get ancestral states from optim run
# Set up DEC model
# (nothing to do; defaults)
# Look at the BioGeoBEARS_run_object; it's just a list of settings etc.
BioGeoBEARS_run_object
# This contains the model object
BioGeoBEARS_run_object$BioGeoBEARS_model_object
# This table contains the parameters of the model
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table
# Run this to check inputs. Read the error messages if you get them!
check_BioGeoBEARS_run(BioGeoBEARS_run_object)
# For a slow analysis, run once, then set runslow=FALSE to just
# load the saved result.
runslow = TRUE
resfn = "3taxa_DEC_M3_areasallowed_v1.Rdata"
if (runslow)
{
res = bears_optim_run(BioGeoBEARS_run_object)
res
save(res, file=resfn)
resDEC = res
} else {
# Loads to "res"
load(resfn)
resDEC = res
}
#######################################################
# Run DEC+J
#######################################################
BioGeoBEARS_run_object = define_BioGeoBEARS_run()
BioGeoBEARS_run_object$trfn = trfn
BioGeoBEARS_run_object$geogfn = geogfn
BioGeoBEARS_run_object$max_range_size = max_range_size
BioGeoBEARS_run_object$min_branchlength = 0.000001 # Min to treat tip as a direct ancestor (no speciation event)
BioGeoBEARS_run_object$include_null_range = TRUE # set to FALSE for e.g. DEC* model, DEC*+J, etc.
# (For DEC* and other "*" models, please cite: Massana, Kathryn A.; Beaulieu,
# Jeremy M.; Matzke, Nicholas J.; O’Meara, Brian C. (2015). Non-null Effects of
# the Null Range in Biogeographic Models: Exploring Parameter Estimation in the
# DEC Model. bioRxiv, http://biorxiv.org/content/early/2015/09/16/026914 )
# Also: search script on "include_null_range" for other places to change
# Set up a time-stratified analysis:
BioGeoBEARS_run_object$timesfn = "timeperiods.txt"
#BioGeoBEARS_run_object$dispersal_multipliers_fn = "manual_dispersal_multipliers.txt"
BioGeoBEARS_run_object$areas_allowed_fn = "areas_allowed_noC2.txt"
#BioGeoBEARS_run_object$areas_adjacency_fn = "areas_adjacency.txt"
#BioGeoBEARS_run_object$distsfn = "distances_matrix.txt"
# See notes on the distances model on PhyloWiki's BioGeoBEARS updates page.
# Speed options and multicore processing if desired
BioGeoBEARS_run_object$on_NaN_error = -1e50 # returns very low lnL if parameters produce NaN error (underflow check)
BioGeoBEARS_run_object$speedup = TRUE # shorcuts to speed ML search; use FALSE if worried (e.g. >3 params)
BioGeoBEARS_run_object$use_optimx = "GenSA" # if FALSE, use optim() instead of optimx()
BioGeoBEARS_run_object$num_cores_to_use = 1
BioGeoBEARS_run_object$force_sparse = FALSE # force_sparse=TRUE causes pathology & isn't much faster at this scale
# This function loads the dispersal multiplier matrix etc. from the text files into the model object. Required for these to work!
# (It also runs some checks on these inputs for certain errors.)
BioGeoBEARS_run_object = readfiles_BioGeoBEARS_run(BioGeoBEARS_run_object)
# Divide the tree up by timeperiods/strata (uncomment this for stratified analysis)
BioGeoBEARS_run_object = section_the_tree(inputs=BioGeoBEARS_run_object, make_master_table=TRUE, plot_pieces=FALSE)
# The stratified tree is described in this table:
#BioGeoBEARS_run_object$master_table
# Good default settings to get ancestral states
BioGeoBEARS_run_object$return_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_TTL_loglike_from_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_ancprobs = TRUE # get ancestral states from optim run
# Set up DEC+J model
# Get the ML parameter values from the 2-parameter nested model
# (this will ensure that the 3-parameter model always does at least as good)
dstart = resDEC$outputs@params_table["d","est"]
estart = resDEC$outputs@params_table["e","est"]
jstart = 0.0001
# Input starting values for d, e
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["d","init"] = dstart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["d","est"] = dstart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["e","init"] = estart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["e","est"] = estart
# Add j as a free parameter
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","type"] = "free"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","init"] = jstart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","est"] = jstart
check_BioGeoBEARS_run(BioGeoBEARS_run_object)
resfn = "3taxa_DEC+J_M3_areasallowed_v1.Rdata"
runslow = TRUE
if (runslow)
{
#sourceall("/Dropbox/_njm/__packages/BioGeoBEARS_setup/")
res = bears_optim_run(BioGeoBEARS_run_object)
res
save(res, file=resfn)
resDECj = res
} else {
# Loads to "res"
load(resfn)
resDECj = res
}
#######################################################
# PDF plots
#######################################################
pdffn = "3taxa_DEC_vs_DEC+J_M3_areasallowed_v1.pdf"
pdf(pdffn, width=6, height=6)
#######################################################
# Plot ancestral states - DEC
#######################################################
analysis_titletxt ="BioGeoBEARS DEC on 3taxa M3_areasallowed"
# Setup
results_object = resDEC
scriptdir = np(system.file("extdata/a_scripts", package="BioGeoBEARS"))
# States
res2 = plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="text", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
# Pie chart
plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="pie", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
#######################################################
# Plot ancestral states - DECJ
#######################################################
analysis_titletxt ="BioGeoBEARS DEC+J on 3taxa M3_areasallowed"
# Setup
results_object = resDECj
scriptdir = np(system.file("extdata/a_scripts", package="BioGeoBEARS"))
# States
res1 = plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="text", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
# Pie chart
plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="pie", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
dev.off() # Turn off PDF
cmdstr = paste("open ", pdffn, sep="")
system(cmdstr) # Plot it
#######################################################
#######################################################
# DIVALIKE AND DIVALIKE+J ANALYSIS
#######################################################
#######################################################
# NOTE: The BioGeoBEARS "DIVALIKE" model is not identical with
# Ronquist (1997)'s parsimony DIVA. It is a likelihood
# interpretation of DIVA, constructed by modelling DIVA's
# processes the way DEC does, but only allowing the
# processes DIVA allows (widespread vicariance: yes; subset
# sympatry: no; see Ronquist & Sanmartin 2011, Figure 4).
#
# DIVALIKE is a likelihood interpretation of parsimony
# DIVA, and it is "like DIVA" -- similar to, but not
# identical to, parsimony DIVA.
#
# I thus now call the model "DIVALIKE", and you should also. ;-)
#######################################################
#######################################################
#######################################################
# Run DIVALIKE
#######################################################
BioGeoBEARS_run_object = define_BioGeoBEARS_run()
BioGeoBEARS_run_object$trfn = trfn
BioGeoBEARS_run_object$geogfn = geogfn
BioGeoBEARS_run_object$max_range_size = max_range_size
BioGeoBEARS_run_object$min_branchlength = 0.000001 # Min to treat tip as a direct ancestor (no speciation event)
BioGeoBEARS_run_object$include_null_range = TRUE # set to FALSE for e.g. DEC* model, DEC*+J, etc.
# (For DEC* and other "*" models, please cite: Massana, Kathryn A.; Beaulieu,
# Jeremy M.; Matzke, Nicholas J.; O’Meara, Brian C. (2015). Non-null Effects of
# the Null Range in Biogeographic Models: Exploring Parameter Estimation in the
# DEC Model. bioRxiv, http://biorxiv.org/content/early/2015/09/16/026914 )
# Also: search script on "include_null_range" for other places to change
# Set up a time-stratified analysis:
BioGeoBEARS_run_object$timesfn = "timeperiods.txt"
#BioGeoBEARS_run_object$dispersal_multipliers_fn = "manual_dispersal_multipliers.txt"
BioGeoBEARS_run_object$areas_allowed_fn = "areas_allowed_noC2.txt"
#BioGeoBEARS_run_object$areas_adjacency_fn = "areas_adjacency.txt"
#BioGeoBEARS_run_object$distsfn = "distances_matrix.txt"
# See notes on the distances model on PhyloWiki's BioGeoBEARS updates page.
# Speed options and multicore processing if desired
BioGeoBEARS_run_object$on_NaN_error = -1e50 # returns very low lnL if parameters produce NaN error (underflow check)
BioGeoBEARS_run_object$speedup = TRUE # shorcuts to speed ML search; use FALSE if worried (e.g. >3 params)
BioGeoBEARS_run_object$use_optimx = "GenSA" # if FALSE, use optim() instead of optimx()
BioGeoBEARS_run_object$num_cores_to_use = 1
BioGeoBEARS_run_object$force_sparse = FALSE # force_sparse=TRUE causes pathology & isn't much faster at this scale
# This function loads the dispersal multiplier matrix etc. from the text files into the model object. Required for these to work!
# (It also runs some checks on these inputs for certain errors.)
BioGeoBEARS_run_object = readfiles_BioGeoBEARS_run(BioGeoBEARS_run_object)
# Divide the tree up by timeperiods/strata (uncomment this for stratified analysis)
BioGeoBEARS_run_object = section_the_tree(inputs=BioGeoBEARS_run_object, make_master_table=TRUE, plot_pieces=FALSE)
# The stratified tree is described in this table:
#BioGeoBEARS_run_object$master_table
# Good default settings to get ancestral states
BioGeoBEARS_run_object$return_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_TTL_loglike_from_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_ancprobs = TRUE # get ancestral states from optim run
# Set up DIVALIKE model
# Remove subset-sympatry
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","type"] = "fixed"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","init"] = 0.0
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","est"] = 0.0
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["ysv","type"] = "2-j"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["ys","type"] = "ysv*1/2"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["y","type"] = "ysv*1/2"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["v","type"] = "ysv*1/2"
# Allow classic, widespread vicariance; all events equiprobable
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01v","type"] = "fixed"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01v","init"] = 0.5
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01v","est"] = 0.5
# No jump dispersal/founder-event speciation
# BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","type"] = "free"
# BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","init"] = 0.01
# BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","est"] = 0.01
check_BioGeoBEARS_run(BioGeoBEARS_run_object)
runslow = TRUE
resfn = "3taxa_DIVALIKE_M3_areasallowed_v1.Rdata"
if (runslow)
{
res = bears_optim_run(BioGeoBEARS_run_object)
res
save(res, file=resfn)
resDIVALIKE = res
} else {
# Loads to "res"
load(resfn)
resDIVALIKE = res
}
#######################################################
# Run DIVALIKE+J
#######################################################
BioGeoBEARS_run_object = define_BioGeoBEARS_run()
BioGeoBEARS_run_object$trfn = trfn
BioGeoBEARS_run_object$geogfn = geogfn
BioGeoBEARS_run_object$max_range_size = max_range_size
BioGeoBEARS_run_object$min_branchlength = 0.000001 # Min to treat tip as a direct ancestor (no speciation event)
BioGeoBEARS_run_object$include_null_range = TRUE # set to FALSE for e.g. DEC* model, DEC*+J, etc.
# (For DEC* and other "*" models, please cite: Massana, Kathryn A.; Beaulieu,
# Jeremy M.; Matzke, Nicholas J.; O’Meara, Brian C. (2015). Non-null Effects of
# the Null Range in Biogeographic Models: Exploring Parameter Estimation in the
# DEC Model. bioRxiv, http://biorxiv.org/content/early/2015/09/16/026914 )
# Also: search script on "include_null_range" for other places to change
# Set up a time-stratified analysis:
BioGeoBEARS_run_object$timesfn = "timeperiods.txt"
#BioGeoBEARS_run_object$dispersal_multipliers_fn = "manual_dispersal_multipliers.txt"
BioGeoBEARS_run_object$areas_allowed_fn = "areas_allowed_noC2.txt"
#BioGeoBEARS_run_object$areas_adjacency_fn = "areas_adjacency.txt"
#BioGeoBEARS_run_object$distsfn = "distances_matrix.txt"
# See notes on the distances model on PhyloWiki's BioGeoBEARS updates page.
# Speed options and multicore processing if desired
BioGeoBEARS_run_object$on_NaN_error = -1e50 # returns very low lnL if parameters produce NaN error (underflow check)
BioGeoBEARS_run_object$speedup = TRUE # shorcuts to speed ML search; use FALSE if worried (e.g. >3 params)
BioGeoBEARS_run_object$use_optimx = "GenSA" # if FALSE, use optim() instead of optimx()
BioGeoBEARS_run_object$num_cores_to_use = 1
BioGeoBEARS_run_object$force_sparse = FALSE # force_sparse=TRUE causes pathology & isn't much faster at this scale
# This function loads the dispersal multiplier matrix etc. from the text files into the model object. Required for these to work!
# (It also runs some checks on these inputs for certain errors.)
BioGeoBEARS_run_object = readfiles_BioGeoBEARS_run(BioGeoBEARS_run_object)
# Divide the tree up by timeperiods/strata (uncomment this for stratified analysis)
BioGeoBEARS_run_object = section_the_tree(inputs=BioGeoBEARS_run_object, make_master_table=TRUE, plot_pieces=FALSE)
# The stratified tree is described in this table:
#BioGeoBEARS_run_object$master_table
# Good default settings to get ancestral states
BioGeoBEARS_run_object$return_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_TTL_loglike_from_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_ancprobs = TRUE # get ancestral states from optim run
# Set up DIVALIKE+J model
# Get the ML parameter values from the 2-parameter nested model
# (this will ensure that the 3-parameter model always does at least as good)
dstart = resDIVALIKE$outputs@params_table["d","est"]
estart = resDIVALIKE$outputs@params_table["e","est"]
jstart = 0.0001
# Input starting values for d, e
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["d","init"] = dstart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["d","est"] = dstart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["e","init"] = estart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["e","est"] = estart
# Remove subset-sympatry
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","type"] = "fixed"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","init"] = 0.0
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","est"] = 0.0
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["ysv","type"] = "2-j"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["ys","type"] = "ysv*1/2"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["y","type"] = "ysv*1/2"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["v","type"] = "ysv*1/2"
# Allow classic, widespread vicariance; all events equiprobable
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01v","type"] = "fixed"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01v","init"] = 0.5
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01v","est"] = 0.5
# Add jump dispersal/founder-event speciation
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","type"] = "free"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","init"] = jstart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","est"] = jstart
# Under DIVALIKE+J, the max of "j" should be 2, not 3 (as is default in DEC+J)
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","min"] = 0.00001
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","max"] = 1.99999
check_BioGeoBEARS_run(BioGeoBEARS_run_object)
resfn = "3taxa_DIVALIKE+J_M3_areasallowed_v1.Rdata"
runslow = TRUE
if (runslow)
{
#sourceall("/Dropbox/_njm/__packages/BioGeoBEARS_setup/")
res = bears_optim_run(BioGeoBEARS_run_object)
res
save(res, file=resfn)
resDIVALIKEj = res
} else {
# Loads to "res"
load(resfn)
resDIVALIKEj = res
}
pdffn = "3taxa_DIVALIKE_vs_DIVALIKE+J_M3_areasallowed_v1.pdf"
pdf(pdffn, width=6, height=6)
#######################################################
# Plot ancestral states - DIVALIKE
#######################################################
analysis_titletxt ="BioGeoBEARS DIVALIKE on 3taxa M3_areasallowed"
# Setup
results_object = resDIVALIKE
scriptdir = np(system.file("extdata/a_scripts", package="BioGeoBEARS"))
# States
res2 = plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="text", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
# Pie chart
plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="pie", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
#######################################################
# Plot ancestral states - DIVALIKE+J
#######################################################
analysis_titletxt ="BioGeoBEARS DIVALIKE+J on 3taxa M3_areasallowed"
# Setup
results_object = resDIVALIKEj
scriptdir = np(system.file("extdata/a_scripts", package="BioGeoBEARS"))
# States
res1 = plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="text", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
# Pie chart
plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="pie", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
dev.off()
cmdstr = paste("open ", pdffn, sep="")
system(cmdstr)
#######################################################
#######################################################
# BAYAREALIKE AND BAYAREALIKE+J ANALYSIS
#######################################################
#######################################################
# NOTE: As with DIVA, the BioGeoBEARS BayArea-like model is
# not identical with the full Bayesian model implemented
# in the "BayArea" program of Landis et al. (2013).
#
# Instead, this is a simplified likelihood interpretation
# of the model. Basically, in BayArea and BioGeoBEARS-BAYAREALIKE,
# "d" and "e" work like they do in the DEC model of Lagrange
# (and BioGeoBEARS), and then BayArea's cladogenesis assumption
# (which is that nothing in particular happens at cladogenesis) is
# replicated by BioGeoBEARS.
#
# This leaves out 3 important things that are in BayArea:
# 1. Distance dependence (you can add this with a distances
# matrix + the "x" parameter in BioGeoBEARS, however)
# 2. A correction for disallowing "e" events that drive
# a species extinct (a null geographic range)
# 3. The neat Bayesian sampling of histories, which allows
# analyses on large numbers of areas.
#
# The main purpose of having a "BAYAREALIKE" model is
# to test the importance of the cladogenesis model on
# particular datasets. Does it help or hurt the data
# likelihood if there is no special cladogenesis process?
#
# BAYAREALIKE is a likelihood interpretation of BayArea,
# and it is "like BayArea" -- similar to, but not
# identical to, Bayesian BayArea.
# I thus now call the model "BAYAREALIKE", and you should also. ;-)
#######################################################
#######################################################
#######################################################
# Run BAYAREALIKE
#######################################################
BioGeoBEARS_run_object = define_BioGeoBEARS_run()
BioGeoBEARS_run_object$trfn = trfn
BioGeoBEARS_run_object$geogfn = geogfn
BioGeoBEARS_run_object$max_range_size = max_range_size
BioGeoBEARS_run_object$min_branchlength = 0.000001 # Min to treat tip as a direct ancestor (no speciation event)
BioGeoBEARS_run_object$include_null_range = TRUE # set to FALSE for e.g. DEC* model, DEC*+J, etc.
# (For DEC* and other "*" models, please cite: Massana, Kathryn A.; Beaulieu,
# Jeremy M.; Matzke, Nicholas J.; O’Meara, Brian C. (2015). Non-null Effects of
# the Null Range in Biogeographic Models: Exploring Parameter Estimation in the
# DEC Model. bioRxiv, http://biorxiv.org/content/early/2015/09/16/026914 )
# Also: search script on "include_null_range" for other places to change
# Set up a time-stratified analysis:
BioGeoBEARS_run_object$timesfn = "timeperiods.txt"
#BioGeoBEARS_run_object$dispersal_multipliers_fn = "manual_dispersal_multipliers.txt"
BioGeoBEARS_run_object$areas_allowed_fn = "areas_allowed_noC2.txt"
#BioGeoBEARS_run_object$areas_adjacency_fn = "areas_adjacency.txt"
#BioGeoBEARS_run_object$distsfn = "distances_matrix.txt"
# See notes on the distances model on PhyloWiki's BioGeoBEARS updates page.
# Speed options and multicore processing if desired
BioGeoBEARS_run_object$on_NaN_error = -1e50 # returns very low lnL if parameters produce NaN error (underflow check)
BioGeoBEARS_run_object$speedup = TRUE # shorcuts to speed ML search; use FALSE if worried (e.g. >3 params)
BioGeoBEARS_run_object$use_optimx = "GenSA" # if FALSE, use optim() instead of optimx()
BioGeoBEARS_run_object$num_cores_to_use = 1
BioGeoBEARS_run_object$force_sparse = FALSE # force_sparse=TRUE causes pathology & isn't much faster at this scale
# This function loads the dispersal multiplier matrix etc. from the text files into the model object. Required for these to work!
# (It also runs some checks on these inputs for certain errors.)
BioGeoBEARS_run_object = readfiles_BioGeoBEARS_run(BioGeoBEARS_run_object)
# Divide the tree up by timeperiods/strata (uncomment this for stratified analysis)
BioGeoBEARS_run_object = section_the_tree(inputs=BioGeoBEARS_run_object, make_master_table=TRUE, plot_pieces=FALSE)
# The stratified tree is described in this table:
#BioGeoBEARS_run_object$master_table
# Good default settings to get ancestral states
BioGeoBEARS_run_object$return_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_TTL_loglike_from_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_ancprobs = TRUE # get ancestral states from optim run
# Set up BAYAREALIKE model
# No subset sympatry
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","type"] = "fixed"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","init"] = 0.0
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","est"] = 0.0
# No vicariance
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["v","type"] = "fixed"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["v","init"] = 0.0
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["v","est"] = 0.0
# No jump dispersal/founder-event speciation
# BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","type"] = "free"
# BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","init"] = 0.01
# BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","est"] = 0.01
# Adjust linkage between parameters
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["ysv","type"] = "1-j"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["ys","type"] = "ysv*1/1"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["y","type"] = "1-j"
# Only sympatric/range-copying (y) events allowed, and with
# exact copying (both descendants always the same size as the ancestor)
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01y","type"] = "fixed"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01y","init"] = 0.9999
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01y","est"] = 0.9999
# Check the inputs
check_BioGeoBEARS_run(BioGeoBEARS_run_object)
runslow = TRUE
resfn = "3taxa_BAYAREALIKE_M3_areasallowed_v1.Rdata"
if (runslow)
{
res = bears_optim_run(BioGeoBEARS_run_object)
res
save(res, file=resfn)
resBAYAREALIKE = res
} else {
# Loads to "res"
load(resfn)
resBAYAREALIKE = res
}
#######################################################
# Run BAYAREALIKE+J
#######################################################
BioGeoBEARS_run_object = define_BioGeoBEARS_run()
BioGeoBEARS_run_object$trfn = trfn
BioGeoBEARS_run_object$geogfn = geogfn
BioGeoBEARS_run_object$max_range_size = max_range_size
BioGeoBEARS_run_object$min_branchlength = 0.000001 # Min to treat tip as a direct ancestor (no speciation event)
BioGeoBEARS_run_object$include_null_range = TRUE # set to FALSE for e.g. DEC* model, DEC*+J, etc.
# (For DEC* and other "*" models, please cite: Massana, Kathryn A.; Beaulieu,
# Jeremy M.; Matzke, Nicholas J.; O’Meara, Brian C. (2015). Non-null Effects of
# the Null Range in Biogeographic Models: Exploring Parameter Estimation in the
# DEC Model. bioRxiv, http://biorxiv.org/content/early/2015/09/16/026914 )
# Also: search script on "include_null_range" for other places to change
# Set up a time-stratified analysis:
BioGeoBEARS_run_object$timesfn = "timeperiods.txt"
#BioGeoBEARS_run_object$dispersal_multipliers_fn = "manual_dispersal_multipliers.txt"
BioGeoBEARS_run_object$areas_allowed_fn = "areas_allowed_noC2.txt"
#BioGeoBEARS_run_object$areas_adjacency_fn = "areas_adjacency.txt"
#BioGeoBEARS_run_object$distsfn = "distances_matrix.txt"
# See notes on the distances model on PhyloWiki's BioGeoBEARS updates page.
# Speed options and multicore processing if desired
BioGeoBEARS_run_object$on_NaN_error = -1e50 # returns very low lnL if parameters produce NaN error (underflow check)
BioGeoBEARS_run_object$speedup = TRUE # shorcuts to speed ML search; use FALSE if worried (e.g. >3 params)
BioGeoBEARS_run_object$use_optimx = "GenSA"
BioGeoBEARS_run_object$num_cores_to_use = 1
BioGeoBEARS_run_object$force_sparse = FALSE # force_sparse=TRUE causes pathology & isn't much faster at this scale
# This function loads the dispersal multiplier matrix etc. from the text files into the model object. Required for these to work!
# (It also runs some checks on these inputs for certain errors.)
BioGeoBEARS_run_object = readfiles_BioGeoBEARS_run(BioGeoBEARS_run_object)
# Divide the tree up by timeperiods/strata (uncomment this for stratified analysis)
BioGeoBEARS_run_object = section_the_tree(inputs=BioGeoBEARS_run_object, make_master_table=TRUE, plot_pieces=FALSE)
# The stratified tree is described in this table:
#BioGeoBEARS_run_object$master_table
# Good default settings to get ancestral states
BioGeoBEARS_run_object$return_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_TTL_loglike_from_condlikes_table = TRUE
BioGeoBEARS_run_object$calc_ancprobs = TRUE # get ancestral states from optim run
# Set up BAYAREALIKE+J model
# Get the ML parameter values from the 2-parameter nested model
# (this will ensure that the 3-parameter model always does at least as good)
dstart = resBAYAREALIKE$outputs@params_table["d","est"]
estart = resBAYAREALIKE$outputs@params_table["e","est"]
jstart = 0.0001
# Input starting values for d, e
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["d","init"] = dstart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["d","est"] = dstart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["e","init"] = estart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["e","est"] = estart
# No subset sympatry
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","type"] = "fixed"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","init"] = 0.0
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["s","est"] = 0.0
# No vicariance
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["v","type"] = "fixed"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["v","init"] = 0.0
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["v","est"] = 0.0
# *DO* allow jump dispersal/founder-event speciation (set the starting value close to 0)
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","type"] = "free"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","init"] = jstart
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","est"] = jstart
# Under BAYAREALIKE+J, the max of "j" should be 1, not 3 (as is default in DEC+J) or 2 (as in DIVALIKE+J)
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","max"] = 0.99999
# Adjust linkage between parameters
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["ysv","type"] = "1-j"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["ys","type"] = "ysv*1/1"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["y","type"] = "1-j"
# Only sympatric/range-copying (y) events allowed, and with
# exact copying (both descendants always the same size as the ancestor)
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01y","type"] = "fixed"
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01y","init"] = 0.9999
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["mx01y","est"] = 0.9999
# NOTE (NJM, 2014-04): BAYAREALIKE+J seems to crash on some computers, usually Windows
# machines. I can't replicate this on my Mac machines, but it is almost certainly
# just some precision under-run issue, when optim/optimx tries some parameter value
# just below zero. The "min" and "max" options on each parameter are supposed to
# prevent this, but apparently optim/optimx sometimes go slightly beyond
# these limits. Anyway, if you get a crash, try raising "min" and lowering "max"
# slightly for each parameter:
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["d","min"] = 0.0000001
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["d","max"] = 4.9999999
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["e","min"] = 0.0000001
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["e","max"] = 4.9999999
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","min"] = 0.00001
BioGeoBEARS_run_object$BioGeoBEARS_model_object@params_table["j","max"] = 0.99999
check_BioGeoBEARS_run(BioGeoBEARS_run_object)
resfn = "3taxa_BAYAREALIKE+J_M3_areasallowed_v1.Rdata"
runslow = TRUE
if (runslow)
{
res = bears_optim_run(BioGeoBEARS_run_object)
res
save(res, file=resfn)
resBAYAREALIKEj = res
} else {
# Loads to "res"
load(resfn)
resBAYAREALIKEj = res
}
pdffn = "3taxa_BAYAREALIKE_vs_BAYAREALIKE+J_M3_areasallowed_v1.pdf"
pdf(pdffn, width=6, height=6)
#######################################################
# Plot ancestral states - BAYAREALIKE
#######################################################
analysis_titletxt ="BioGeoBEARS BAYAREALIKE on 3taxa M3_areasallowed"
# Setup
results_object = resBAYAREALIKE
scriptdir = np(system.file("extdata/a_scripts", package="BioGeoBEARS"))
# States
res2 = plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="text", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
# Pie chart
plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="pie", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
#######################################################
# Plot ancestral states - BAYAREALIKE+J
#######################################################
analysis_titletxt ="BioGeoBEARS BAYAREALIKE+J on 3taxa M3_areasallowed"
# Setup
results_object = resBAYAREALIKEj
scriptdir = np(system.file("extdata/a_scripts", package="BioGeoBEARS"))
# States
res1 = plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="text", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
# Pie chart
plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="pie", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
dev.off()
cmdstr = paste("open ", pdffn, sep="")
system(cmdstr)
#########################################################################
#########################################################################
#########################################################################
#########################################################################
#
# CALCULATE SUMMARY STATISTICS TO COMPARE
# DEC, DEC+J, DIVALIKE, DIVALIKE+J, BAYAREALIKE, BAYAREALIKE+J
#
#########################################################################
#########################################################################
#########################################################################
#########################################################################
#########################################################################
#########################################################################
# REQUIRED READING:
#
# Practical advice / notes / basic principles on statistical model
# comparison in general, and in BioGeoBEARS:
# http://phylo.wikidot.com/advice-on-statistical-model-comparison-in-biogeobears
#########################################################################
#########################################################################
# Set up empty tables to hold the statistical results
restable = NULL
teststable = NULL
#######################################################
# Statistics -- DEC vs. DEC+J
#######################################################
# We have to extract the log-likelihood differently, depending on the
# version of optim/optimx
LnL_2 = get_LnL_from_BioGeoBEARS_results_object(resDEC)
LnL_1 = get_LnL_from_BioGeoBEARS_results_object(resDECj)
numparams1 = 3
numparams2 = 2
stats = AICstats_2models(LnL_1, LnL_2, numparams1, numparams2)
stats
# DEC, null model for Likelihood Ratio Test (LRT)
res2 = extract_params_from_BioGeoBEARS_results_object(results_object=resDEC, returnwhat="table", addl_params=c("j"), paramsstr_digits=4)
# DEC+J, alternative model for Likelihood Ratio Test (LRT)
res1 = extract_params_from_BioGeoBEARS_results_object(results_object=resDECj, returnwhat="table", addl_params=c("j"), paramsstr_digits=4)
# The null hypothesis for a Likelihood Ratio Test (LRT) is that two models
# confer the same likelihood on the data. See: Brian O'Meara's webpage:
# http://www.brianomeara.info/tutorials/aic
# ...for an intro to LRT, AIC, and AICc
rbind(res2, res1)
tmp_tests = conditional_format_table(stats)
restable = rbind(restable, res2, res1)
teststable = rbind(teststable, tmp_tests)
#######################################################
# Statistics -- DIVALIKE vs. DIVALIKE+J
#######################################################
# We have to extract the log-likelihood differently, depending on the
# version of optim/optimx
LnL_2 = get_LnL_from_BioGeoBEARS_results_object(resDIVALIKE)
LnL_1 = get_LnL_from_BioGeoBEARS_results_object(resDIVALIKEj)
numparams1 = 3
numparams2 = 2
stats = AICstats_2models(LnL_1, LnL_2, numparams1, numparams2)
stats
# DIVALIKE, null model for Likelihood Ratio Test (LRT)
res2 = extract_params_from_BioGeoBEARS_results_object(results_object=resDIVALIKE, returnwhat="table", addl_params=c("j"), paramsstr_digits=4)
# DIVALIKE+J, alternative model for Likelihood Ratio Test (LRT)
res1 = extract_params_from_BioGeoBEARS_results_object(results_object=resDIVALIKEj, returnwhat="table", addl_params=c("j"), paramsstr_digits=4)
rbind(res2, res1)
conditional_format_table(stats)
tmp_tests = conditional_format_table(stats)
restable = rbind(restable, res2, res1)
teststable = rbind(teststable, tmp_tests)
#######################################################
# Statistics -- BAYAREALIKE vs. BAYAREALIKE+J
#######################################################
# We have to extract the log-likelihood differently, depending on the
# version of optim/optimx
LnL_2 = get_LnL_from_BioGeoBEARS_results_object(resBAYAREALIKE)
LnL_1 = get_LnL_from_BioGeoBEARS_results_object(resBAYAREALIKEj)
numparams1 = 3
numparams2 = 2
stats = AICstats_2models(LnL_1, LnL_2, numparams1, numparams2)
stats
# BAYAREALIKE, null model for Likelihood Ratio Test (LRT)
res2 = extract_params_from_BioGeoBEARS_results_object(results_object=resBAYAREALIKE, returnwhat="table", addl_params=c("j"), paramsstr_digits=4)
# BAYAREALIKE+J, alternative model for Likelihood Ratio Test (LRT)
res1 = extract_params_from_BioGeoBEARS_results_object(results_object=resBAYAREALIKEj, returnwhat="table", addl_params=c("j"), paramsstr_digits=4)
rbind(res2, res1)
conditional_format_table(stats)
tmp_tests = conditional_format_table(stats)
restable = rbind(restable, res2, res1)
teststable = rbind(teststable, tmp_tests)
#########################################################################
# ASSEMBLE RESULTS TABLES: DEC, DEC+J, DIVALIKE, DIVALIKE+J, BAYAREALIKE, BAYAREALIKE+J
#########################################################################
teststable$alt = c("DEC+J", "DIVALIKE+J", "BAYAREALIKE+J")
teststable$null = c("DEC", "DIVALIKE", "BAYAREALIKE")
row.names(restable) = c("DEC", "DEC+J", "DIVALIKE", "DIVALIKE+J", "BAYAREALIKE", "BAYAREALIKE+J")
restable = put_jcol_after_ecol(restable)
restable
# Look at the results!!
restable
teststable
#######################################################
# Save the results tables for later -- check for e.g.
# convergence issues
#######################################################
# Loads to "restable"
save(restable, file="restable_v1.Rdata")
load(file="restable_v1.Rdata")
# Loads to "teststable"
save(teststable, file="teststable_v1.Rdata")
load(file="teststable_v1.Rdata")
# Also save to text files
write.table(restable, file="restable.txt", quote=FALSE, sep="\t")
write.table(unlist_df(teststable), file="teststable.txt", quote=FALSE, sep="\t")
#######################################################
# Model weights of all six models
#######################################################
restable2 = restable
# With AICs:
AICtable = calc_AIC_column(LnL_vals=restable$LnL, nparam_vals=restable$numparams)
restable = cbind(restable, AICtable)
restable_AIC_rellike = AkaikeWeights_on_summary_table(restable=restable, colname_to_use="AIC")
restable_AIC_rellike = put_jcol_after_ecol(restable_AIC_rellike)
restable_AIC_rellike
# With AICcs -- factors in sample size
# samplesize = length(tr$tip.label)
# AICtable = calc_AICc_column(LnL_vals=restable$LnL, nparam_vals=restable$numparams, samplesize=samplesize)
# restable2 = cbind(restable2, AICtable)
# restable_AICc_rellike = AkaikeWeights_on_summary_table(restable=restable2, colname_to_use="AICc")
# restable_AICc_rellike = put_jcol_after_ecol(restable_AICc_rellike)
# restable_AICc_rellike
# Also save to text files
write.table(restable_AIC_rellike, file="restable_AIC_rellike.txt", quote=FALSE, sep="\t")
#write.table(restable_AICc_rellike, file="restable_AICc_rellike.txt", quote=FALSE, sep="\t")
# Save with nice conditional formatting
write.table(conditional_format_table(restable_AIC_rellike), file="restable_AIC_rellike_formatted.txt", quote=FALSE, sep="\t")
#write.table(conditional_format_table(restable_AICc_rellike), file="restable_AICc_rellike_formatted.txt", quote=FALSE, sep="\t")
###########################################
# Pick your model name:
###########################################
model_name = "DEC+J_M3areas_allowed"
res = resDECj
#######################################################
# Plot ancestral states - DEC
#######################################################
pdffn = paste0("3taxa_", model_name, "_v1.pdf")
pdf(pdffn, width=6, height=6)
analysis_titletxt = paste0(model_name, " on 3taxa")
# Setup
results_object = res
scriptdir = np(system.file("extdata/a_scripts", package="BioGeoBEARS"))
# States
res2 = plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="text", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
# Pie chart
plot_BioGeoBEARS_results(results_object, analysis_titletxt, addl_params=list("j"), plotwhat="pie", label.offset=0.45, tipcex=0.7, statecex=0.7, splitcex=0.6, titlecex=0.8, plotsplits=TRUE, cornercoords_loc=scriptdir, include_null_range=TRUE, tr=tr, tipranges=tipranges)
dev.off() # Turn off PDF
cmdstr = paste("open ", pdffn, sep="")
system(cmdstr) # Plot it
#######################################################
# Stochastic mapping on DEC M3b stratified with islands coming up
#######################################################
clado_events_tables = NULL
ana_events_tables = NULL
lnum = 0
#######################################################
# Get the inputs for Biogeographical Stochastic Mapping
# Note: this can be slow for large state spaces and trees, since
# the independent likelihoods for each branch are being pre-calculated
# E.g., for 10 areas, this requires calculation of a 1024x1024 matrix
# for each branch. On a tree with ~800 tips and thus ~1600 branches, this was about 1.6 gigs
# for storage of "BSM_inputs_file.Rdata".
# Update: 2015-09-23 -- now, if you used multicore functionality for the ML analysis,
# the same settings will be used for get_inputs_for_stochastic_mapping().
#######################################################
BSM_inputs_fn = "BSM_inputs_file.Rdata"
BSMinputs_runslow = TRUE
if (BSMinputs_runslow == TRUE)
{
stochastic_mapping_inputs_list = get_inputs_for_stochastic_mapping(res=res)
save(stochastic_mapping_inputs_list, file=BSM_inputs_fn)
} else {
# Loads to "stochastic_mapping_inputs_list"
load(BSM_inputs_fn)
} # END if (runInputsSlow)
# Check inputs (doesn't work the same on unconstr)
names(stochastic_mapping_inputs_list)
stochastic_mapping_inputs_list$phy2
stochastic_mapping_inputs_list$COO_weights_columnar
stochastic_mapping_inputs_list$unconstr
set.seed(seed=as.numeric(Sys.time()))
BSM_runslow = TRUE
if (BSM_runslow == TRUE)
{
# Saves to: RES_clado_events_tables.Rdata
# Saves to: RES_ana_events_tables.Rdata
BSM_output = runBSM(res, stochastic_mapping_inputs_list=stochastic_mapping_inputs_list, maxnum_maps_to_try=100, nummaps_goal=50, maxtries_per_branch=40000, save_after_every_try=TRUE, savedir=getwd(), seedval=12345, wait_before_save=0.01, master_nodenum_toPrint=0)
RES_clado_events_tables = BSM_output$RES_clado_events_tables
RES_ana_events_tables = BSM_output$RES_ana_events_tables
} else {
# Load previously saved...
# Loads to: RES_clado_events_tables
load(file="RES_clado_events_tables.Rdata")
# Loads to: RES_ana_events_tables
load(file="RES_ana_events_tables.Rdata")
BSM_output = NULL
BSM_output$RES_clado_events_tables = RES_clado_events_tables
BSM_output$RES_ana_events_tables = RES_ana_events_tables
} # END if (runBSMslow == TRUE)
# Extract BSM output
clado_events_tables = BSM_output$RES_clado_events_tables
ana_events_tables = BSM_output$RES_ana_events_tables
head(clado_events_tables[[1]])
head(ana_events_tables[[1]])
length(clado_events_tables)
length(ana_events_tables)
#######################################################
# Plot one stochastic map, manual method
#######################################################
# (we have to convert the stochastic maps into event
# maps for plotting)
######################
# Get the color scheme
######################
include_null_range = TRUE
areanames = names(tipranges@df)
areas = areanames
max_range_size = 4
# Note: If you did something to change the states_list from the default given the number of areas, you would
# have to manually make that change here as well! (e.g., areas_allowed matrix, or manual reduction of the states_list)
states_list_0based = rcpp_areas_list_to_states_list(areas=areas, maxareas=max_range_size, include_null_range=include_null_range)
colors_list_for_states = get_colors_for_states_list_0based(areanames=areanames, states_list_0based=states_list_0based, max_range_size=max_range_size, plot_null_range=TRUE)
# For BSMs, replace white with seashell white
colors_list_for_states[colors_list_for_states == "#FFFFFF"] = "#FFF5EE"
############################################
# Setup for painting a single stochastic map
############################################
scriptdir = np(system.file("extdata/a_scripts", package="BioGeoBEARS"))
stratified=TRUE
clado_events_table = clado_events_tables[[1]]
ana_events_table = ana_events_tables[[1]]
# cols_to_get = names(clado_events_table[,-ncol(clado_events_table)])
# colnums = match(cols_to_get, names(ana_events_table))
# ana_events_table_cols_to_add = ana_events_table[,colnums]
# anagenetic_events_txt_below_node = rep("none", nrow(ana_events_table_cols_to_add))
# ana_events_table_cols_to_add = cbind(ana_events_table_cols_to_add, anagenetic_events_txt_below_node)
# rows_to_get_TF = ana_events_table_cols_to_add$node <= length(tr$tip.label)
# master_table_cladogenetic_events = rbind(ana_events_table_cols_to_add[rows_to_get_TF,], clado_events_table)
############################################
# Open a PDF
############################################
pdffn = paste0(model_name, "_single_stochastic_map_n1.pdf")
pdf(file=pdffn, width=6, height=6)
# Convert the BSM into a modified res object
master_table_cladogenetic_events = clado_events_tables[[1]]
resmod = stochastic_map_states_into_res(res=res, master_table_cladogenetic_events=master_table_cladogenetic_events, stratified=stratified)
plot_BioGeoBEARS_results(results_object=resmod, analysis_titletxt="Stochastic map", addl_params=list("j"), label.offset=0.5, plotwhat="text", cornercoords_loc=scriptdir, root.edge=TRUE, colors_list_for_states=colors_list_for_states, skiptree=FALSE, show.tip.label=TRUE)
# Paint on the branch states
paint_stochastic_map_branches(res=resmod, master_table_cladogenetic_events=master_table_cladogenetic_events, colors_list_for_states=colors_list_for_states, lwd=5, lty=par("lty"), root.edge=TRUE, stratified=stratified)
plot_BioGeoBEARS_results(results_object=resmod, analysis_titletxt="Stochastic map", addl_params=list("j"), plotwhat="text", cornercoords_loc=scriptdir, root.edge=TRUE, colors_list_for_states=colors_list_for_states, skiptree=TRUE, show.tip.label=TRUE)
############################################
# Close PDF
############################################
dev.off()
cmdstr = paste("open ", pdffn, sep="")
system(cmdstr)
#######################################################
# Plot all 50 stochastic maps to PDF
#######################################################
# Setup
include_null_range = include_null_range
areanames = areanames
areas = areanames
max_range_size = max_range_size
states_list_0based = rcpp_areas_list_to_states_list(areas=areas, maxareas=max_range_size, include_null_range=include_null_range)
colors_list_for_states = get_colors_for_states_list_0based(areanames=areanames, states_list_0based=states_list_0based, max_range_size=max_range_size, plot_null_range=TRUE)
# For BSMs, replace white with seashell white
colors_list_for_states[colors_list_for_states == "#FFFFFF"] = "#FFF5EE"
scriptdir = np(system.file("extdata/a_scripts", package="BioGeoBEARS"))
stratified = stratified
# Loop through the maps and plot to PDF
pdffn = paste0(model_name, "_", length(clado_events_tables), "BSMs_v1.pdf")
pdf(file=pdffn, width=6, height=6)
nummaps_goal = 50
for (i in 1:nummaps_goal)
{
clado_events_table = clado_events_tables[[i]]
analysis_titletxt = paste0(model_name, " - Stochastic Map #", i, "/", nummaps_goal)
plot_BSM(results_object=res, clado_events_table=clado_events_table, stratified=stratified, analysis_titletxt=analysis_titletxt, addl_params=list("j"), label.offset=0.5, plotwhat="text", cornercoords_loc=scriptdir, root.edge=TRUE, colors_list_for_states=colors_list_for_states, show.tip.label=TRUE, include_null_range=include_null_range)
} # END for (i in 1:nummaps_goal)
dev.off()
cmdstr = paste("open ", pdffn, sep="")
system(cmdstr)
#######################################################
# Summarize stochastic map tables
#######################################################
length(clado_events_tables)
length(ana_events_tables)
head(clado_events_tables[[1]][,-20])
tail(clado_events_tables[[1]][,-20])
head(ana_events_tables[[1]])
tail(ana_events_tables[[1]])
areanames = names(tipranges@df)
actual_names = areanames
actual_names
# Get the dmat and times (if any)
dmat_times = get_dmat_times_from_res(res=res, numstates=NULL)
dmat_times
# Extract BSM output
clado_events_tables = BSM_output$RES_clado_events_tables
ana_events_tables = BSM_output$RES_ana_events_tables
# Simulate the source areas
BSMs_w_sourceAreas = simulate_source_areas_ana_clado(res, clado_events_tables, ana_events_tables, areanames)
clado_events_tables = BSMs_w_sourceAreas$clado_events_tables
ana_events_tables = BSMs_w_sourceAreas$ana_events_tables
# Count all anagenetic and cladogenetic events
counts_list = count_ana_clado_events(clado_events_tables, ana_events_tables, areanames, actual_names)
summary_counts_BSMs = counts_list$summary_counts_BSMs
print(conditional_format_table(summary_counts_BSMs))
# Histogram of event counts
hist_event_counts(counts_list, pdffn=paste0(model_name, "_histograms_of_event_counts.pdf"))
#######################################################
# Print counts to files
#######################################################
tmpnames = names(counts_list)
cat("\n\nWriting tables* of counts to tab-delimited text files:\n(* = Tables have dimension=2 (rows and columns). Cubes (dimension 3) and lists (dimension 1) will not be printed to text files.) \n\n")
for (i in 1:length(tmpnames))
{
cmdtxt = paste0("item = counts_list$", tmpnames[i])
eval(parse(text=cmdtxt))
# Skip cubes
if (length(dim(item)) != 2)
{
next()
}
outfn = paste0(tmpnames[i], ".txt")
if (length(item) == 0)
{
cat(outfn, " -- NOT written, *NO* events recorded of this type", sep="")
cat("\n")
} else {
cat(outfn)
cat("\n")
write.table(conditional_format_table(item), file=outfn, quote=FALSE, sep="\t", col.names=TRUE, row.names=TRUE)
} # END if (length(item) == 0)
} # END for (i in 1:length(tmpnames))
cat("...done.\n")
#######################################################
# Check that ML ancestral state/range probabilities and
# the mean of the BSMs approximately line up
#######################################################
library(MultinomialCI) # For 95% CIs on BSM counts
check_ML_vs_BSM(res, clado_events_tables, model_name, tr=NULL, plot_each_node=FALSE, linreg_plot=TRUE, MultinomialCI=TRUE)
txt = "For 3-taxon tree, with time-stratification and area C excluded in middle time-bin...Check that the event counts match what is expected for seedval=12345."
cat("\n")
cat(txt)
A_to_B_dispersals = counts_list$all_dispersals_counts_fromto_means["A","B"]
expect_equal(object=A_to_B_dispersals, expected=2.8)
B_to_A_dispersals = counts_list$all_dispersals_counts_fromto_means["B","A"]
expect_equal(object=B_to_A_dispersals, expected=3.34)
A_to_C_dispersals = counts_list$all_dispersals_counts_fromto_means["A","C"]
expect_equal(object=A_to_C_dispersals, expected=1.44)
C_to_A_dispersals = counts_list$all_dispersals_counts_fromto_means["C","A"]
expect_equal(object=C_to_A_dispersals, expected=0.38)
B_to_C_dispersals = counts_list$all_dispersals_counts_fromto_means["B","C"]
expect_equal(object=B_to_C_dispersals, expected=1.24)
C_to_B_dispersals = counts_list$all_dispersals_counts_fromto_means["C","B"]
expect_equal(object=C_to_B_dispersals, expected=0.3)
summary_mean_ds = round(counts_list$summary_counts_BSMs["means","d"], digits=2)
expect_equal(object=summary_mean_ds, expected=9.5)
summary_stdevs_ds = round(counts_list$summary_counts_BSMs["stdevs","d"], digits=2)
expect_equal(object=summary_stdevs_ds, expected=1.99)
summary_sums_ds = round(counts_list$summary_counts_BSMs["sums","d"], digits=2)
expect_equal(object=summary_sums_ds, expected=475)
cat("\n...PASSED ")
# Check that, in all 50 Biogeographic Stochastic Maps (BSMs),
# the excluded area (C) in the middle time-period (0.1-1.5 Ma)
# is successfully excluded from the histories of the BSMs.
txt = "For 3-taxon tree, with time-stratification and area C excluded in middle time-bin...Check that, in all 50 Biogeographic Stochastic Maps (BSMs), the excluded area (C) in the middle time-period (0.1-1.5 Ma) is successfully excluded from the histories of the BSMs."
cat("\n")
cat(txt)
TF = ((ana_events_tables[[1]]$abs_event_time < 1.5) + (ana_events_tables[[1]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[1]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[1]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[2]]$abs_event_time < 1.5) + (ana_events_tables[[2]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[2]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[2]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[3]]$abs_event_time < 1.5) + (ana_events_tables[[3]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[3]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[3]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[4]]$abs_event_time < 1.5) + (ana_events_tables[[4]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[4]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[4]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[5]]$abs_event_time < 1.5) + (ana_events_tables[[5]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[5]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[5]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[6]]$abs_event_time < 1.5) + (ana_events_tables[[6]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[6]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[6]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[7]]$abs_event_time < 1.5) + (ana_events_tables[[7]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[7]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[7]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[8]]$abs_event_time < 1.5) + (ana_events_tables[[8]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[8]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[8]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[9]]$abs_event_time < 1.5) + (ana_events_tables[[9]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[9]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[9]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[10]]$abs_event_time < 1.5) + (ana_events_tables[[10]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[10]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[10]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[11]]$abs_event_time < 1.5) + (ana_events_tables[[11]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[11]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[11]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[12]]$abs_event_time < 1.5) + (ana_events_tables[[12]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[12]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[12]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[13]]$abs_event_time < 1.5) + (ana_events_tables[[13]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[13]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[13]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[14]]$abs_event_time < 1.5) + (ana_events_tables[[14]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[14]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[14]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[15]]$abs_event_time < 1.5) + (ana_events_tables[[15]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[15]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[15]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[16]]$abs_event_time < 1.5) + (ana_events_tables[[16]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[16]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[16]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[17]]$abs_event_time < 1.5) + (ana_events_tables[[17]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[17]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[17]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[18]]$abs_event_time < 1.5) + (ana_events_tables[[18]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[18]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[18]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[19]]$abs_event_time < 1.5) + (ana_events_tables[[19]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[19]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[19]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[20]]$abs_event_time < 1.5) + (ana_events_tables[[20]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[20]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[20]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[21]]$abs_event_time < 1.5) + (ana_events_tables[[21]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[21]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[21]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[22]]$abs_event_time < 1.5) + (ana_events_tables[[22]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[22]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[22]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[23]]$abs_event_time < 1.5) + (ana_events_tables[[23]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[23]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[23]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[24]]$abs_event_time < 1.5) + (ana_events_tables[[24]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[24]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[24]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[25]]$abs_event_time < 1.5) + (ana_events_tables[[25]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[25]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[25]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[26]]$abs_event_time < 1.5) + (ana_events_tables[[26]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[26]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[26]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[27]]$abs_event_time < 1.5) + (ana_events_tables[[27]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[27]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[27]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[28]]$abs_event_time < 1.5) + (ana_events_tables[[28]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[28]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[28]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[29]]$abs_event_time < 1.5) + (ana_events_tables[[29]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[29]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[29]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[30]]$abs_event_time < 1.5) + (ana_events_tables[[30]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[30]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[30]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[31]]$abs_event_time < 1.5) + (ana_events_tables[[31]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[31]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[31]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[32]]$abs_event_time < 1.5) + (ana_events_tables[[32]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[32]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[32]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[33]]$abs_event_time < 1.5) + (ana_events_tables[[33]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[33]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[33]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[34]]$abs_event_time < 1.5) + (ana_events_tables[[34]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[34]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[34]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[35]]$abs_event_time < 1.5) + (ana_events_tables[[35]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[35]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[35]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[36]]$abs_event_time < 1.5) + (ana_events_tables[[36]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[36]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[36]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[37]]$abs_event_time < 1.5) + (ana_events_tables[[37]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[37]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[37]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[38]]$abs_event_time < 1.5) + (ana_events_tables[[38]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[38]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[38]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[39]]$abs_event_time < 1.5) + (ana_events_tables[[39]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[39]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[39]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[40]]$abs_event_time < 1.5) + (ana_events_tables[[40]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[40]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[40]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[41]]$abs_event_time < 1.5) + (ana_events_tables[[41]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[41]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[41]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[42]]$abs_event_time < 1.5) + (ana_events_tables[[42]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[42]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[42]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[43]]$abs_event_time < 1.5) + (ana_events_tables[[43]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[43]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[43]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[44]]$abs_event_time < 1.5) + (ana_events_tables[[44]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[44]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[44]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[45]]$abs_event_time < 1.5) + (ana_events_tables[[45]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[45]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[45]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[46]]$abs_event_time < 1.5) + (ana_events_tables[[46]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[46]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[46]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[47]]$abs_event_time < 1.5) + (ana_events_tables[[47]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[47]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[47]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[48]]$abs_event_time < 1.5) + (ana_events_tables[[48]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[48]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[48]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[49]]$abs_event_time < 1.5) + (ana_events_tables[[49]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[49]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[49]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
TF = ((ana_events_tables[[50]]$abs_event_time < 1.5) + (ana_events_tables[[50]]$abs_event_time > 0.1)) == 2
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[50]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
expect_equal(all(grepl(pattern="C", x=ana_events_tables[[50]][TF,]$current_rangetxt)==FALSE), expected=TRUE)
cat("\n...PASSED ")
}) # END test_that
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.