bio-phylo-bayesian-inference — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited bio-phylo-bayesian-inference (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Reference examples tested with: MrBayes 3.2.7+, BEAST2 2.7+, Tracer 1.7+, RevBayes 1.2+, PhyloBayes MPI 1.9+, RWTY (R package)
Before using code patterns, verify installed versions match. If versions differ:
mb --version, beast -version, rb --version, pb --versionpip show biopython then help(module.function) to check signaturespackageVersion('rwty') then ?function_name to verify parametersIf code throws ImportError, AttributeError, or TypeError, introspect the installed package and adapt the example to match the actual API rather than retrying.
"Run a Bayesian phylogenetic analysis" -> Infer posterior distribution of trees and parameters via MCMC sampling, producing posterior probability support and enabling formal model comparison.
mb (MrBayes), beast (BEAST2), rb (RevBayes), pb/bpcomp (PhyloBayes)Bio.Phylo for parsing output trees; arviz/pandas for trace diagnostics| Factor | ML (IQ-TREE/RAxML-NG) | MrBayes | BEAST2 | RevBayes | PhyloBayes |
|---|---|---|---|---|---|
| Primary use | Topology, hypothesis testing | Posterior probabilities on topology | Divergence times, demographics, tip-dating | Non-standard models, full graphical model control | Deep phylogenies with compositional heterogeneity |
| Speed | Fast | Moderate | Slow | Moderate | Very slow |
| Ease of use | Easy | Easy | Moderate (BEAUti GUI) | Steep learning curve | Moderate |
| Model flexibility | Good | Good | Extensive (packages) | Maximum (scripted) | CAT/CAT-GTR |
| Default choice | Yes, for topology | When posterior probabilities needed | When time calibration needed (see divergence-dating) | When no existing model fits | When LBA from model misspecification suspected |
| Multi-run | Automatic | 2 runs x 4 chains default | Must run independently | Manual | Must run independently |
Default recommendation: Start with ML (modern-tree-inference). Move to Bayesian when posterior probabilities, divergence times, or site-heterogeneous models are specifically needed.
Goal: Obtain a Bayesian phylogeny with posterior probability support values.
Approach: Load a Nexus alignment into MrBayes, set the substitution model and priors, run two independent MCMC analyses with Metropolis-coupled chains (MC3), then summarize parameters and trees after discarding burn-in.
execute alignment.nex
lset nst=6 rates=invgamma
prset brlenspr=unconstrained:exp(10.0)
mcmc ngen=1000000 samplefreq=100 nchains=4 nruns=2
sump
sumtKey settings:
nst=6 rates=invgamma: GTR+I+G model. Use nst=2 for HKY, nst=1 for JC/F81nchains=4 nruns=2: Two independent runs each with 4 Metropolis-coupled chains (1 cold + 3 heated). This is the default and should not be reducedsamplefreq=100: Sample every 100 generations. Adjust so total samples = ngen/samplefreq is at least 10,000sump: Summarizes parameter traces, reports ESS and PSRFsumt: Summarizes trees, builds majority-rule consensus with posterior probabilitiesMrBayes runs Metropolis coupling by default: one cold chain explores the posterior while heated chains explore broader landscape and swap states with the cold chain. This improves mixing for multimodal posteriors. The acceptance rate for swaps between adjacent chains should be 20-70%; adjust temp=0.2 (default) if swaps are too rare or too frequent.
charset gene1 = 1-300
charset gene2 = 301-600
partition by_gene = 2: gene1, gene2
set partition = by_gene
lset applyto=(1) nst=6 rates=invgamma
lset applyto=(2) nst=2 rates=gamma
unlink statefreq=(all) revmat=(all) shape=(all) pinvar=(all)
prset applyto=(all) ratepr=variableMrBayes can average over all 203 time-reversible substitution models during MCMC:
lset nst=mixed rates=invgammaThis integrates over model uncertainty rather than fixing a single model. Preferred when model choice is uncertain.
beast -threads 4 -seed 12345 analysis.xml
treeannotator -burnin 10 -heights median analysis.trees consensus.treeThe bModelTest package averages over all 203 time-reversible nucleotide substitution models during MCMC, eliminating the need for separate model selection:
This is analogous to MrBayes nst=mixed but implemented as a BEAST2 package.
BEAST2 does NOT run multiple chains by default (unlike MrBayes). Always run at least two independent analyses with different seeds:
beast -threads 4 -seed 12345 analysis.xml
beast -threads 4 -seed 67890 analysis.xmlThen compare traces in Tracer to confirm both runs converge to the same posterior.
This is the most critical aspect of any Bayesian phylogenetic analysis. An unconverged analysis produces meaningless results regardless of the model or data.
ESS measures the number of effectively independent samples after accounting for autocorrelation.
| ESS | Interpretation |
|---|---|
| < 100 | Insufficient; results unreliable |
| 100-199 | Marginal; increase run length |
| >= 200 | Adequate (Tracer default threshold) |
| >= 625 | Conservative target for precise credible intervals |
Critical rule: If ESS < 200 for any parameter, run the chain longer. Do NOT simply increase thinning (samplefreq). Thinning discards information and does not improve ESS; it is only justified to reduce file size.
A well-converged trace plot resembles a "hairy caterpillar," with rapid oscillation around a stable mean and no visible trend. Warning signs:
MrBayes reports PSRF (Gelman-Rubin diagnostic) comparing variance within and between runs:
| PSRF | Interpretation |
|---|---|
| < 1.01 | Good convergence |
| 1.01-1.05 | Acceptable but monitor |
| > 1.05 | Not converged; run longer or check model |
Convergence of continuous parameters (likelihood, branch lengths) does NOT guarantee topological convergence. The tree topology may still be poorly sampled even when ESS for likelihood is high.
Goal: Assess whether MCMC chains have adequately sampled tree space.
Approach: Use the RWTY R package to compute topological ESS and visualize treespace using multidimensional scaling of Robinson-Foulds distances between sampled trees.
library(rwty)
trees_run1 <- load.trees('run1.t', type='nexus')
trees_run2 <- load.trees('run2.t', type='nexus')
rwty_output <- analyze.rwty(list(run1=trees_run1, run2=trees_run2), burnin=25)
makeplot.topology(rwty_output)
makeplot.treespace(rwty_output)What to look for:
sumt): average < 0.01 is excellent, < 0.05 acceptableBurn-in removes initial samples collected before the chain reaches stationarity. Typical range: 10-25% of total samples.
Examine trace plots to determine appropriate burn-in rather than using a fixed percentage. The burn-in period ends where the trace stabilizes at its stationary distribution.
MrBayes default burn-in for sump/sumt is 25%. BEAST2 TreeAnnotator requires specifying burn-in explicitly.
Goal: Determine whether the data are informative for each parameter or whether the posterior is dominated by the prior.
Approach: Run MCMC sampling from the prior only (no likelihood calculation), then compare prior and posterior distributions.
In MrBayes:
mcmc ngen=1000000 data=noIn BEAST2: check "Sample from prior" in BEAUti MCMC tab.
| Method | Reliability | Cost | Available In |
|---|---|---|---|
| Harmonic mean estimator | NEVER use | Low | MrBayes (legacy) |
| Path sampling (PS) | Good | High | MrBayes, BEAST2 |
| Stepping-stone sampling (SS) | Good | High | MrBayes, BEAST2 |
| Generalized stepping-stone (GSS) | Better than SS | High | BEAST2 (MODEL_SELECTION package) |
| Nested sampling (NS) | Good | Moderate | BEAST2 (NS package) |
The harmonic mean estimator is the default in older MrBayes versions. It is unreliable, typically overestimates marginal likelihoods, and can favor overly complex models. Never use it for model comparison.
ss ngen=1000000 diagnfreq=1000 nsteps=50 alpha=0.4This estimates the marginal likelihood via a series of power posteriors between the prior and the posterior. The alpha parameter controls the spacing of stepping stones (0.4 is the recommended default).
Bayes factor (BF) = ratio of marginal likelihoods. Compute as 2 * ln(BF) for comparison:
| 2 * ln(BF) | Evidence |
|---|---|
| < 2 | Not worth mentioning |
| 2-6 | Positive |
| 6-10 | Strong |
| > 10 | Decisive |
Equivalently using natural log: ln(BF) > 1.0 = positive, > 3.2 = strong, > 4.6 = decisive.
Install the MODEL_SELECTION package via BEAUti Package Manager. Then modify the XML to use path sampling:
beast -threads 4 model_selection.xmlThe output reports log marginal likelihood estimates for each model.
PhyloBayes implements the CAT and CAT-GTR models, which are site-heterogeneous mixture models that assign each site to a profile category. These models are the gold standard for mitigating long branch attraction (LBA) caused by model misspecification in deep phylogenies (e.g., animal phyla, eukaryote root, bacterial deep branches).
CAT-GTR is preferred over fixed-matrix models (LG, WAG) or even empirical mixture models (C60) when:
# Run two independent chains (mandatory for convergence assessment)
mpirun -np 8 pb_mpi -d alignment.phy -cat -gtr -x 10 5000 chain1 &
mpirun -np 8 pb_mpi -d alignment.phy -cat -gtr -x 10 5000 chain2 &
# After chains complete, check convergence
bpcomp -x 1000 chain1 chain2
tracecomp -x 1000 chain1 chain2| Diagnostic | Tool | Good | Acceptable | Poor |
|---|---|---|---|---|
| maxdiff (bipartition) | bpcomp | < 0.1 | 0.1-0.3 | > 0.3 |
| rel_diff (continuous params) | tracecomp | < 0.1 | 0.1-0.3 | > 0.3 |
| effsize | tracecomp | > 300 | 100-300 | < 100 |
PhyloBayes chains are typically very slow to converge for large datasets. Running for weeks on a cluster is not unusual. If maxdiff remains high, consider:
-dgam 4 to add discrete gamma rate variationAmino acid recoding (Dayhoff-6 or SR4) reduces the state space and can improve convergence and reduce compositional bias:
# Dayhoff-6 recoding in PhyloBayes
pb_mpi -d alignment.phy -cat -gtr -recode dayhoff6 -x 10 5000 chain_d6Recoding loses information but can reveal whether results are driven by compositional signal versus phylogenetic signal.
RevBayes implements a probabilistic programming language for phylogenetics. It provides maximum flexibility for specifying custom models but requires writing Rev scripts.
# Basic GTR+G analysis in Rev language
data <- readDiscreteCharacterData("alignment.nex")
taxa <- data.taxa()
n_taxa <- taxa.size()
# Substitution model: GTR
er ~ dnDirichlet(v(1,1,1,1,1,1))
pi ~ dnDirichlet(v(1,1,1,1))
Q := fnGTR(er, pi)
# Among-site rate variation: Gamma
alpha ~ dnExponential(1.0)
site_rates := fnDiscretizeGamma(alpha, alpha, 4)
# Tree and branch lengths
topology ~ dnUniformTopology(taxa)
for (i in 1:2*n_taxa-3) {
br_lens[i] ~ dnExponential(10.0)
}
psi := treeAssembly(topology, br_lens)
# Phylogenetic CTMC
seq ~ dnPhyloCTMC(tree=psi, Q=Q, siteRates=site_rates, type="DNA")
seq.clamp(data)
# MCMC
moves = VectorMoves()
moves.append(mvSimplexElementScale(er, weight=3))
moves.append(mvSimplexElementScale(pi, weight=2))
moves.append(mvScale(alpha, weight=1))
moves.append(mvNNI(topology, weight=n_taxa))
moves.append(mvSPR(topology, weight=n_taxa/5))
for (i in 1:2*n_taxa-3) {
moves.append(mvScale(br_lens[i]))
}
monitors = VectorMonitors()
monitors.append(mnModel(filename="output.log", printgen=100))
monitors.append(mnFile(psi, filename="output.trees", printgen=100))
monitors.append(mnScreen(printgen=1000))
mymcmc = mcmc(mymodel, monitors, moves, nruns=2)
mymcmc.run(generations=1000000)RevBayes is ideal when existing software does not support the desired model (e.g., non-standard clock models, state-dependent diversification, custom priors).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.