{ "cells": [ { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "# Tutorial" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "This is a tutorial for the `momi` package. You can run the ipython\n", "notebook that created this tutorial at `docs/tutorial.ipynb`.\n", "\n", "To get started, import the `momi` package: " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "import momi" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Some `momi` operations can take awhile complete, so it is useful to turn\n", "on status monitoring messages to check that everything is running\n", "normally. Here, we output logging messages to the file `tutorial.log`." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "import logging\n", "logging.basicConfig(level=logging.INFO, \n", " filename=\"tutorial.log\")" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "## Constructing a demographic history " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Use [DemographicModel](api.rst#momi.DemographicModel) to construct a demographic history.\n", "Below, we set the diploid effective size `N_e=1.2e4`, the generation time\n", "`gen_time=29` years per generation, and mutation rate `muts_per_gen=1.25e-8`\n", "per base per generation. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "model = momi.DemographicModel(N_e=1.2e4, gen_time=29,\n", " muts_per_gen=1.25e-8)" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Use [DemographicModel.add_leaf](api.rst#momi.DemographicModel.add_leaf)\n", "to add sampled populations.\n", "Below we add 3 populations: YRI, CHB, and NEA.\n", "The archaic NEA population is sampled `t=5e4` years ago.\n", "The YRI population has size `N=1e5`, while\n", "the CHB population is initialized to have size `N=1e5`\n", "and growth rate `g=5e-4` per year (NEA starts at the default size `1.2e4`). " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "# add YRI leaf at t=0 with size N=1e5\n", "model.add_leaf(\"YRI\", N=1e5)\n", "# add CHB leaf at t=0, N=1e5, growing at rate 5e-4 per unit time (year)\n", "model.add_leaf(\"CHB\", N=1e5, g=5e-4)\n", "# add NEA leaf at 50kya and default N\n", "model.add_leaf(\"NEA\", t=5e4)" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Demographic events are added to the model by the methods [DemographicModel.set_size](api.rst#momi.DemographicModel.set_size)\n", "and [DemographicModel.move_lineages](api.rst#momi.DemographicModel.move_lineages). `DemographicModel.set_size` is used to change population size\n", "and growth rate, while `DemographicModel.move_lineages` is used for population split\n", "and admixture events." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "# stop CHB growth at 10kya\n", "model.set_size(\"CHB\", g=0, t=1e4)\n", "\n", "# at 45kya CHB receive a 3% pulse from GhostNea\n", "model.move_lineages(\"CHB\", \"GhostNea\", t=4.5e4, p=.03)\n", "# at 55kya GhostNea joins onto NEA\n", "model.move_lineages(\"GhostNea\", \"NEA\", t=5.5e4)\n", "\n", "# at 80 kya CHB goes thru bottleneck\n", "model.set_size(\"CHB\", N=100, t=8e4)\n", "# at 85 kya CHB joins onto YRI; YRI is set to size N=1.2e4\n", "model.move_lineages(\"CHB\", \"YRI\", t=8.5e4, N=1.2e4)\n", "\n", "# at 500 kya YRI joins onto NEA\n", "model.move_lineages(\"YRI\", \"NEA\", t=5e5)" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Note that events can involve other populations aside from the 3 sampled\n", "populations YRI, CHB, and NEA. Unsampled populations are also known as\n", "\"ghost populations\". In this example, CHB receives a small amount of\n", "admixture from a population \"GhostNea\", which splits off from NEA at an\n", "earlier date. " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "## Plotting a demography " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "`momi` relies on [matplotlib](https://matplotlib.org/) for plotting.\n", "In a notebook, first call `%matplotlib inline`\n", "to enable matplotlib, then you can\n", "use [DemographyPlot](api.rst#momi.DemographyPlot) to create a plot of the demographic model." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "image/png": "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n/+Je8yKpgtbsWIFnTp1Iicnh88//5wlS5bQpUuX1F+kKDBFROIZPHgws2bNYv369eTm5nLzzTeza9cuAC655BIOPvhg+vXrx6GHHkpWVhbDhw+ne/fuANx2222cdNJJlJSU0KBBAx588MFAgTls2DB+9atf0bVrV1q1asWkSZMAePvttxk7diwNGjQgKyuLhx56iDZtkn09UhKh6b0SoOm96gdN75VeNL1X8qpzei9RL1kREZFAFJgiIiIBKDBFREQCUGDWkMqeXwbZLiIitSujA9PMmpnZfDM7tbbrItUjVic2dWwTkeqQVq+VmNl44FRgrbt3j1jfD7gPyAYec/ex4U2jCA2pJGmiaHfJHq317UW7KdpdQqOclMwnKzWgxJ2N24pq5Fz7NGlAVlZajM0qKZBWgQlMAP4CPFG6ImIm7z6ERrWfGx6sd19CYw/W7/GkJK7B495j6mU/qe1qSJK27CzhlFtfrZFzfTCmD62aNYy57dtvv2X48OF88sknmBnjx4/nmGOOKVdu7ty5HH300UyePJkzzzyzSvXZuHEj55xzDitXrqRLly4888wztGzZkhdffJExY8aQlZVFTk4Of/7zn/npT+vuwA7pIq1uybr7m4Sme4lU0UzexwNHExoR/yIzi/mzMLMRZjbPzOatW7cuhbWXVPm6lma4kPRy5ZVX0q9fPz799FM++uijmO+G7t69m1GjRtG3b9+Ejj1r1iyGDh1abv3YsWPp3bs3S5cupXfv3owdG7o51rt3bz766CMWLFjA+PHjGT58eFLXJIlJq8CsQKyZvDu6+/XuPhJ4CnjU3Uti7ezu49w9z93z2rZtWwPVlarYtrN856mi3SVs3VlcC7WRdLF582befPNNhg0bBkDDhg3ZZ599ypV74IEHOOOMM/aY3gvgj3/8I0ceeSSHHnooN954Y+DzvvjiiwwZMgSAIUOG8MILLwDQvHnzsoHYt23bli5TfNV5mRCYlc7G7e4T3P2lGqyPpNB/12wpt2791iKWfF1+vUhQy5cvp23btlxwwQX07NmT4cOHs23btj3KrF69mueff55LLrlkj/UzZ85k6dKlvP/++yxYsID58+fz5ptvBjrvmjVr6NChAwAdOnTYY2Lq559/nh/96EeccsopjB8/vopXKEFkQmDW2GzcUrtKSpydFbyeo56yUhXFxcV88MEHXHrp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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "yticks = [1e4, 2.5e4, 5e4, 7.5e4, 1e5, 2.5e5, 5e5, 7.5e5]\n", "\n", "fig = momi.DemographyPlot(\n", " model, [\"YRI\", \"CHB\", \"GhostNea\", \"NEA\"],\n", " figsize=(6,8),\n", " major_yticks=yticks,\n", " linthreshy=1e5, pulse_color_bounds=(0,.25))" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Note the user needs to specify the order of all populations (including\n", "ghost populations) along the x-axis.\n", "\n", "The argument `linthreshy` is useful for visualizing demographic events\n", "at different scales. In our example, the split time of NEA is far above\n", "the other events. Times below `linthreshy` are plotted on a linear\n", "scale, while times above it are plotted on a log scale.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "## Reading and simulating data " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "In this section we demonstrate how to read in data from a VCF file.\n", "We start by simulating a dataset so that we can read it in later. " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "### Simulating data " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Use [DemographicModel.simulate_vcf](api.rst#momi.DemographicModel.simulate_vcf)\n", "to simulate data (using [msprime](https://msprime.readthedocs.io/)) and save the resulting dataset\n", "to a VCF file.\n", "\n", "Below we simulate a dataset of diploid individuals,\n", "with 20 \"chromosomes\" of length 50Kb, with a recombination\n", "rate of 1.25e-8. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "recoms_per_gen = 1.25e-8\n", "bases_per_locus = int(5e5)\n", "n_loci = 20\n", "ploidy = 2\n", "\n", "# n_alleles per population (n_individuals = n_alleles / ploidy)\n", "sampled_n_dict = {\"NEA\":2, \"YRI\":4, \"CHB\":4}\n", "\n", "# create data directory if it doesn't exist\n", "!mkdir -p tutorial_datasets/\n", "\n", "# simulate 20 \"chromosomes\", saving each in a separate vcf file\n", "for chrom in range(1, n_loci+1):\n", " model.simulate_vcf(\n", " f\"tutorial_datasets/{chrom}\",\n", " recoms_per_gen=recoms_per_gen,\n", " length=bases_per_locus,\n", " chrom_name=f\"chr{chrom}\",\n", " ploidy=ploidy,\n", " random_seed=1234+chrom,\n", " sampled_n_dict=sampled_n_dict,\n", " force=True)" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "We saved the datasets in `tutorial_datasets/$chrom.vcf.gz`. Accompanying tabix and bed files are also created." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10.bed\t 14.bed\t 18.bed\t 2.bed\t 6.bed\r\n", "10.vcf.gz 14.vcf.gz 18.vcf.gz 2.vcf.gz\t 6.vcf.gz\r\n", "10.vcf.gz.tbi 14.vcf.gz.tbi 18.vcf.gz.tbi 2.vcf.gz.tbi 6.vcf.gz.tbi\r\n", "11.bed\t 15.bed\t 19.bed\t 3.bed\t 7.bed\r\n", "11.vcf.gz 15.vcf.gz 19.vcf.gz 3.vcf.gz\t 7.vcf.gz\r\n", "11.vcf.gz.tbi 15.vcf.gz.tbi 19.vcf.gz.tbi 3.vcf.gz.tbi 7.vcf.gz.tbi\r\n", "12.bed\t 16.bed\t 1.bed\t 4.bed\t 8.bed\r\n", "12.vcf.gz 16.vcf.gz 1.vcf.gz\t 4.vcf.gz\t 8.vcf.gz\r\n", "12.vcf.gz.tbi 16.vcf.gz.tbi 1.vcf.gz.tbi 4.vcf.gz.tbi 8.vcf.gz.tbi\r\n", "13.bed\t 17.bed\t 20.bed\t 5.bed\t 9.bed\r\n", "13.vcf.gz 17.vcf.gz 20.vcf.gz 5.vcf.gz\t 9.vcf.gz\r\n", "13.vcf.gz.tbi 17.vcf.gz.tbi 20.vcf.gz.tbi 5.vcf.gz.tbi 9.vcf.gz.tbi\r\n" ] } ], "source": [ "!ls tutorial_datasets/" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "### Read in data from vcf " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Now we read in the datasets we just simulated.\n", "\n", "The first step is to create a mapping from individuals to populations.\n", "We save this mapping to a text file whose first column\n", "is for individuals and second column is for populations." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "NEA_0\tNEA\r\n", "YRI_0\tYRI\r\n", "YRI_1\tYRI\r\n", "CHB_0\tCHB\r\n", "CHB_1\tCHB\r\n" ] } ], "source": [ "# a dict mapping samples to populations\n", "ind2pop = {}\n", "for pop, n in sampled_n_dict.items():\n", " for i in range(int(n / ploidy)):\n", " # in the vcf, samples are named like YRI_0, YRI_1, CHB_0, etc\n", " ind2pop[\"{}_{}\".format(pop, i)] = pop\n", "\n", "with open(\"tutorial_datasets/ind2pop.txt\", \"w\") as f:\n", " for i, p in ind2pop.items():\n", " print(i, p, sep=\"\\t\", file=f)\n", "\n", "!cat tutorial_datasets/ind2pop.txt" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "#### Compute allele counts" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "The next step is to compute the allele counts for each VCF separately.\n", "To do this, use the shell command `python -m momi.read_vcf $VCF $IND2POP $OUTFILE --bed $BED`: " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "%%sh\n", "for chrom in `seq 1 20`;\n", "do\n", " python -m momi.read_vcf \\\n", " tutorial_datasets/$chrom.vcf.gz tutorial_datasets/ind2pop.txt \\\n", " tutorial_datasets/$chrom.snpAlleleCounts.gz \\\n", " --bed tutorial_datasets/$chrom.bed\n", "done" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "The `--bed` flag specifies a BED accessible regions file; only regions present in the BED\n", "file are read from the VCF. The BED file also determines the length of the data in bases.\n", "If no BED file is specified, then all SNPs are read, and the length of the data is set to unknown.\n", "\n", "You should NOT use the same BED file across multiple VCF files, and should ensure your\n", "BED files do not contain overlapping regions. Otherwise, regions will be double-counted when computing\n", "the length of the data. You can use tabix to split a single BED file into multiple non-overlapping files.\n", "\n", "By default ancestral alleles are read from the INFO AA field\n", "(SNPs missing this field are skipped) but this behavior can be\n", "changed by setting the flags `--no_aa` or `--outgroup`.\n", "\n", "Use the `--help` flag to see more command line options,\n", "and see also the documentation for [SnpAlleleCounts.read_vcf](api.rst#momi.SnpAlleleCounts.read_vcf),\n", "which provides the same functionality within Python." ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "#### Extract combined SFS" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Use `python -m momi.extract_sfs $OUTFILE $NBLOCKS $COUNTS...` from the command line to combine the SFS across multiple files, and split the SFS into a number of equally sized blocks for jackknifing and bootstrapping. " ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "%%sh\n", "python -m momi.extract_sfs tutorial_datasets/sfs.gz 100 tutorial_datasets/*.snpAlleleCounts.gz" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Use the `--help` flag to see the command line options,\n", "and see also the documentation for [SnpAlleleCounts.concatenate](api.rst#momi.SnpAlleleCounts.concatenate)\n", "and [SnpAlleleCounts.extract_sfs](api.rst#momi.SnpAlleleCounts.extract_sfs)\n", "which provide the same functionality within Python. " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "#### Read SFS into Python" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Finally, read the SFS file into Python with [Sfs.load](api.rst#momi.Sfs.load): " ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "sfs = momi.Sfs.load(\"tutorial_datasets/sfs.gz\")" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "## Inference " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "In this section we will infer a demography for the data we simulated.\n", "We will start by fitting a sub-demography on CHB and YRI, and then\n", "iteratively build on this model, by adding the NEA population and also\n", "additional parameters and events. " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "### An initial model for YRI and CHB " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "We will start by fitting a simplifed model without admixture.\n", "Use `DemographicModel()` to initialize it as before:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "scrolled": true, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "no_pulse_model = momi.DemographicModel(\n", " N_e=1.2e4, gen_time=29, muts_per_gen=1.25e-8)" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Note that `muts_per_gen` is optional, and can be omitted if unknown, but specifying it provides extra power to the model.\n", "\n", "Use [DemographicModel.set_data](api.rst#momi.DemographicModel.set_data)\n", "to add data to the model for inference:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "no_pulse_model.set_data(sfs)" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "To add parameters to the model, use\n", "[DemographicModel.add_size_param](api.rst#momi.DemographicModel.add_size_param),\n", "[DemographicModel.add_time_param](api.rst#momi.DemographicModel.add_time_param),\n", "[DemographicModel.add_growth_param](api.rst#momi.DemographicModel.add_growth_param),\n", "and\n", "[DemographicModel.add_pulse_param](api.rst#momi.DemographicModel.add_pulse_param).\n", "\n", "Below we define parameters for the CHB size, the CHB growth rate,\n", "and the CHB-YRI split time: " ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "# random initial value\n", "no_pulse_model.add_size_param(\"n_chb\") \n", "# initial value 0; user-specified lower,upper bounds\n", "no_pulse_model.add_growth_param(\"g_chb\", 0, lower=-1e-3, upper=1e-3)\n", "# random initial value; user-specified lower bound\n", "no_pulse_model.add_time_param(\"t_chb_yri\", lower=1e4) " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Demographic events can be added similarly as before. \n", "Parameters are specified by name (string), \n", "while constants are specified as numbers (float)." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "no_pulse_model.add_leaf(\"CHB\", N=\"n_chb\", g=\"g_chb\")\n", "no_pulse_model.add_leaf(\"YRI\", N=1e5)\n", "no_pulse_model.set_size(\"CHB\", t=1e4, g=0)\n", "no_pulse_model.move_lineages(\"CHB\", \"YRI\", t=\"t_chb_yri\", N=1.2e4)" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Use [DemographicModel.optimize](api.rst#momi.DemographicModel.optimize) to search for the MLE.\n", "It is a thin wrapper around [scipy.optimize.minimize](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html) and accepts similar arguments. " ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/jack/miniconda3/envs/momi2-conda-nomkl/lib/python3.6/site-packages/autograd/numpy/numpy_vjps.py:444: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.\n", " return lambda g: g[idxs]\n" ] }, { "data": { "text/plain": [ " fun: 0.003629860012261981\n", " jac: array([-6.52603508e-06, -3.58838649e-02, -8.63552150e-10])\n", " kl_divergence: 0.003629860012261981\n", " log_likelihood: -30444.557113445273\n", " message: 'Converged (|f_n-f_(n-1)| ~= 0)'\n", " nfev: 56\n", " nit: 24\n", " parameters: ParamsDict({'n_chb': 14368074.379920935, 'g_chb': 0.000997783661801449, 't_chb_yri': 114562.32318043888})\n", " status: 1\n", " success: True\n", " x: array([1.64805192e+01, 9.97783662e-04, 1.04562323e+05])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "no_pulse_model.optimize(method=\"TNC\") " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "The default optimization method is `method=\"TNC\"` (truncated Newton conjugate).\n", "This is very accurate but can be slow for large models; for large models,\n", "`method=\"L-BFGS-B\"` is a good choice.\n", "\n", "We can print the inferred parameter values with [DemographicModel.get_params](api.rst#momi.DemographicModel.get_params): " ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "ParamsDict({'n_chb': 14368074.379920935, 'g_chb': 0.000997783661801449, 't_chb_yri': 114562.32318043888})" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "no_pulse_model.get_params()" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "and we can plot the inferred demography as before:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# plot the model\n", "fig = momi.DemographyPlot(no_pulse_model, [\"YRI\", \"CHB\"],\n", " figsize=(6,8), linthreshy=1e5,\n", " major_yticks=yticks,\n", " pulse_color_bounds=(0,.25))" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "### Adding NEA to the existing model " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Now we add in the NEA population, along with a parameter for its split time\n", "`t_anc`. We use the keyword `lower_constraints` to require that `t_anc > t_chb_yri`. " ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "no_pulse_model.add_leaf(\"NEA\", t=5e4)\n", "no_pulse_model.add_time_param(\"t_anc\", lower=5e4, lower_constraints=[\"t_chb_yri\"])\n", "no_pulse_model.move_lineages(\"YRI\", \"NEA\", t=\"t_anc\")" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "We search for the new MLE and plot the inferred demography: " ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "no_pulse_model.optimize()\n", "\n", "fig = momi.DemographyPlot(\n", " no_pulse_model, [\"YRI\", \"CHB\", \"NEA\"],\n", " figsize=(6,8), linthreshy=1e5,\n", " major_yticks=yticks) " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "### Build a new model adding NEA->CHB " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Now we create a new `DemographicModel`,\n", "by copying the previous model and adding a NEA->CHB\n", "migration arrow. " ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "add_pulse_model = no_pulse_model.copy()\n", "add_pulse_model.add_pulse_param(\"p_pulse\", upper=.25)\n", "add_pulse_model.add_time_param(\n", " \"t_pulse\", upper_constraints=[\"t_chb_yri\"])\n", "\n", "add_pulse_model.move_lineages(\n", " \"CHB\", \"GhostNea\", t=\"t_pulse\", p=\"p_pulse\")\n", "\n", "add_pulse_model.add_time_param(\n", " \"t_ghost\", lower=5e4,\n", " lower_constraints=[\"t_pulse\"], upper_constraints=[\"t_anc\"])\n", "add_pulse_model.move_lineages(\n", " \"GhostNea\", \"NEA\", t=\"t_ghost\")" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "It turns out this model has local optima, so we demonstrate how to\n", "fit a few independent runs with different starting parameters.\n", "\n", "Use [DemographicModel.set_params](api.rst#momi.DemographicModel.set_params)\n", "to set new parameter values\n", "to start the search from. If a parameter is not specified and\n", "`randomize=True`, a new value will be randomly sampled for it." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Starting run 1 out of 3...\n", "Starting run 2 out of 3...\n", "Starting run 3 out of 3...\n" ] }, { "data": { "text/plain": [ " fun: 0.006390407169686503\n", " jac: array([ 3.86428996e-08, -8.26898179e-02, 4.63629649e-13, -7.35845677e-14,\n", " -2.69540750e-07, -2.98321219e-07, 1.46475502e-08])\n", " kl_divergence: 0.006390407169686503\n", " log_likelihood: -60986.74341175791\n", " message: 'Converged (|f_n-f_(n-1)| ~= 0)'\n", " nfev: 78\n", " nit: 21\n", " parameters: ParamsDict({'n_chb': 11824540.526927987, 'g_chb': 0.001, 't_chb_yri': 100366.89310119499, 't_anc': 524505.2984953767, 'p_pulse': 0.017396498328507242, 't_pulse': 39601.33887335411, 't_ghost': 50387.43446019594})\n", " status: 1\n", " success: True\n", " x: array([ 1.62856876e+01, 1.00000000e-03, 9.03668931e+04, 4.24138405e+05,\n", " -4.03393674e+00, -4.28160158e-01, -7.10966453e+00])" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = []\n", "n_runs = 3\n", "for i in range(n_runs):\n", " print(f\"Starting run {i+1} out of {n_runs}...\")\n", " add_pulse_model.set_params(\n", " # parameters inherited from no_pulse_model are set to their previous values\n", " no_pulse_model.get_params(),\n", " # other parmaeters are set to random initial values\n", " randomize=True)\n", "\n", " results.append(add_pulse_model.optimize(options={\"maxiter\":200}))\n", "\n", "# sort results according to log likelihood, pick the best (largest) one\n", "best_result = sorted(results, key=lambda r: r.log_likelihood)[-1]\n", "\n", "add_pulse_model.set_params(best_result.parameters)\n", "best_result" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# plot the model\n", "fig = momi.DemographyPlot(\n", " add_pulse_model, [\"YRI\", \"CHB\", \"GhostNea\", \"NEA\"],\n", " linthreshy=1e5, figsize=(6,8),\n", " major_yticks=yticks)\n", "# put legend in upper left corner\n", "fig.draw_N_legend(loc=\"upper left\") " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "## Statistics of the SFS" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Here we discuss how to compute statistics of the SFS,\n", "for evaluating the goodness-of-fit of our models,\n", "and for estimating the mutation rate." ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "### Goodness-of-fit" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Use [SfsModelFitStats](api.rst#momi.SfsModelFitStats)\n", "to see how well various\n", "statistics of the SFS fit a model, via the block-jackknife.\n", "\n", "Below we create an `SfsModelFitStats` to evaluate\n", "the goodness-of-fit of the `no_pulse_model`." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "no_pulse_fit_stats = momi.SfsModelFitStats(no_pulse_model)" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "One important statistic is the f4 or\n", "\"ABBA-BABA\" statistic for detecting introgression\n", "([Patterson et al 2012](api.rst#http://www.genetics.org/content/192/3/1065)).\n", "\n", "In the absence of admixture f4(YRI, CHB, NEA, AncestralAllele)\n", "should be 0, but for our dataset it will be negative due to the\n", "NEA->CHB admixture.\n", "\n", "Use [SfsModelFitStats.f4](api.rst#momi.SfsModelFitStats.f4)\n", "to compute f4 stats. For the no-pulse model, we see that\n", "`f4(YRI, CHB, NEA, AncestralAllele)` is indeed negative." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Computing f4(YRI, CHB, NEA, AncestralAllele)\n", "Expected = 6.938893903907228e-18\n", "Observed = -0.003537103263299063\n", "SD = 0.0017511821832936283\n", "Z(Expected-Observed) = -2.0198373972983648\n" ] } ], "source": [ "print(\"Computing f4(YRI, CHB, NEA, AncestralAllele)\")\n", "f4 = no_pulse_fit_stats.f4(\"YRI\", \"CHB\", \"NEA\", None)\n", "\n", "print(\"Expected = {}\".format(f4.expected))\n", "print(\"Observed = {}\".format(f4.observed))\n", "print(\"SD = {}\".format(f4.sd))\n", "print(\"Z(Expected-Observed) = {}\".format(f4.z_score))" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "The related `f2` and `f3` statistics are also available via\n", "[SfsModelFitStats.f2](api.rst#momi.SfsModelFitStats.f2) and\n", "[SfsModelFitStats.f3](api.rst#momi.SfsModelFitStats.f3).\n", "\n", "Another method for evaluating model fit is\n", "[SfsModelFitStats.all_pairs_ibs](api.rst#momi.SfsModelFitStats.all_pairs_ibs),\n", "which computes the probability that \n", "two random alleles are the same, for every pair of populations: " ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Pop1Pop2ExpectedObservedZ
0YRIYRI0.6996370.7069361.924912
1NEANEA0.7327530.720787-1.388584
2CHBNEA0.5451760.5482340.668636
3CHBYRI0.6948000.6977310.651155
4NEAYRI0.5451760.543831-0.334112
5CHBCHB0.9656340.964595-0.231728
\n", "
" ], "text/plain": [ " Pop1 Pop2 Expected Observed Z\n", "0 YRI YRI 0.699637 0.706936 1.924912\n", "1 NEA NEA 0.732753 0.720787 -1.388584\n", "2 CHB NEA 0.545176 0.548234 0.668636\n", "3 CHB YRI 0.694800 0.697731 0.651155\n", "4 NEA YRI 0.545176 0.543831 -0.334112\n", "5 CHB CHB 0.965634 0.964595 -0.231728" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "no_pulse_fit_stats.all_pairs_ibs()" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Finally, the method\n", "[SfsModelFitStats.tensor_prod](api.rst#momi.SfsModelFitStats)\n", "can be used to\n", "compute very general statistics of the\n", "SFS (specifically, linear combinations of tensor-products of the SFS).\n", "See the documentation for more details." ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "#### Limitations of `SfsModelFitStats`" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Note the `SfsModelFitStats` class above has some limitations.\n", "First, it computes goodness-of-fit for the SFS without any missing data;\n", "all entries with missing samples are removed. For datasets\n", "with many individuals and pervasive missingness, this can result\n", "in most or all of the data being removed.\n", "\n", "In such cases you can specify to use the SFS restricted\n", "to a smaller number of samples; then all SNPs with at least\n", "that many of non-missing individuals will be used.\n", "For example, " ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "no_pulse_fit_stats = momi.SfsModelFitStats(\n", " no_pulse_model, {\"YRI\": 2, \"CHB\": 2, \"NEA\": 2})" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "will compute statistics for the SFS \n", "restricted to 2 samples per population.\n", "\n", "The second limitation of `SfsModelFitStats` is that it\n", "ignores the mutation rate -- it only fits the SFS normalized\n", "to be a probability distribution.\n", "However, see the next subsection on how to evaluate\n", "the total number of mutations in the data. " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "### Estimating mutation rate" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "To evaluate the total number of mutations in the data,\n", "e.g. to fit the mutation rate, use the method\n", "[DemographicModel.fit_within_pop_diversity](api.rst#momi.DemographicModel.fit_within_pop_diversity),\n", "which computes the within-population nucleotide\n", "diversity, i.e. the heterozygosity of a random\n", "individual in that population assuming Hardy-Weinberg Equilibrium: " ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PopEstMutRateJackknifeSDJackknifeZscore
0CHB1.283114e-081.624236e-090.203875
1YRI1.215218e-081.571356e-10-2.213517
2NEA1.301250e-084.018888e-101.275228
\n", "
" ], "text/plain": [ " Pop EstMutRate JackknifeSD JackknifeZscore\n", "0 CHB 1.283114e-08 1.624236e-09 0.203875\n", "1 YRI 1.215218e-08 1.571356e-10 -2.213517\n", "2 NEA 1.301250e-08 4.018888e-10 1.275228" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "no_pulse_model.fit_within_pop_diversity()" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "This method returns a dataframe giving estimates for the mutation rate.\n", "Note that there is an estimate for each population -- these estimates\n", "are non-independent estimates for the same value, just computed\n", "in different ways (by computing the expected to observed heterozygosity\n", "for each population separately). These estimates\n", "account for missingness in the data; it is fine to use it\n", "on datasets with large amounts of missingness.\n", "\n", "Since we initialized our model with `muts_per_gen=1.25e-8`,\n", "the method also returns a Z-value for the residuals of the estimated\n", "mutation rates." ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "## Bootstrap confidence intervals " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "Use [Sfs.resample](api.rst#momi.Sfs.resample) to create bootstrap\n", "datasets by resampling blocks of the SFS.\n", "\n", "To generate confidence intervals, we can refit the model\n", "on the bootstrap datasets and examine the quantiles of the re-inferred\n", "parameters.\n", "Below we do this for a very small number of bootstraps and a simplified\n", "fitting procedure. In practice you would want to generate hundreds of bootstraps on a cluster computer. " ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 1-th bootstrap out of 5\n", "Fitting 2-th bootstrap out of 5\n", "Fitting 3-th bootstrap out of 5\n", "Fitting 4-th bootstrap out of 5\n", "Fitting 5-th bootstrap out of 5\n" ] } ], "source": [ "n_bootstraps = 5\n", "# make copies of the original models to avoid changing them\n", "no_pulse_copy = no_pulse_model.copy()\n", "add_pulse_copy = add_pulse_model.copy()\n", "\n", "bootstrap_results = []\n", "for i in range(n_bootstraps):\n", " print(f\"Fitting {i+1}-th bootstrap out of {n_bootstraps}\")\n", "\n", " # resample the data\n", " resampled_sfs = sfs.resample()\n", " # tell models to use the new dataset\n", " no_pulse_copy.set_data(resampled_sfs)\n", " add_pulse_copy.set_data(resampled_sfs)\n", "\n", " # choose new random parameters for submodel, optimize\n", " no_pulse_copy.set_params(randomize=True)\n", " no_pulse_copy.optimize()\n", " # initialize parameters from submodel, randomizing the new parameters\n", " add_pulse_copy.set_params(no_pulse_copy.get_params(),\n", " randomize=True)\n", " add_pulse_copy.optimize()\n", "\n", " bootstrap_results.append(add_pulse_copy.get_params())" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "We can visualize the bootstrap results by overlaying them onto a single plot." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# make canvas, but delay plotting the demography (draw=False)\n", "fig = momi.DemographyPlot(\n", " add_pulse_model, [\"YRI\", \"CHB\", \"GhostNea\", \"NEA\"],\n", " linthreshy=1e5, figsize=(6,8),\n", " major_yticks=yticks,\n", " draw=False)\n", "\n", "# plot bootstraps onto the canvas in transparency\n", "for params in bootstrap_results:\n", " fig.add_bootstrap(\n", " params,\n", " # alpha=0: totally transparent. alpha=1: totally opaque\n", " alpha=1/n_bootstraps)\n", "\n", "# now draw the inferred demography on top of the bootstraps\n", "fig.draw()\n", "fig.draw_N_legend(loc=\"upper left\") " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "## Other features" ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "### Stochastic gradient descent " ] }, { "cell_type": "markdown", "metadata": { "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "For large models, it can be useful to perform stochastic optimization:\n", "instead of computing the full likelihood at every step,\n", "we use a random subset of SNPs at each step to estimate\n", "the likelihood gradient. This is especially useful for\n", "rapidly searching for a reasonable starting point, from which\n", "full optimization can be performed.\n", "\n", "[DemographicModel.stochastic_optimize](api.rst#momi.DemographicModel.stochastic_optimize)\n", "implements stochastic optimization with the [ADAM](https://arxiv.org/pdf/1412.6980.pdf) algorithm.\n", "Setting `svrg=n` makes the optimizer use the full likelihood\n", "every n steps which can lead to better convergence (see\n", "[SVRG](https://papers.nips.cc/paper/4937-accelerating-stochastic-gradient-descent-using-predictive-variance-reduction.pdf)).\n", "\n", "The cell below performs 10 steps of stochastic optimization,\n", "using 1000 random SNPs per step, and computing the full likelihood\n", "every 3 iterations. " ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ " fun: 3.5684750877096234\n", " jac: array([ 2.16057690e-06, -2.30524330e-03, 2.41528617e-07, -1.54878487e-07,\n", " 1.07274014e-03, -3.48843607e-10, -2.21603171e-09])\n", " log_likelihood: 3.5684750877096234\n", " message: 'Maximum number of iterations reached'\n", " nit: 9\n", " parameters: ParamsDict({'n_chb': 17322702.843983896, 'g_chb': -0.001, 't_chb_yri': 94934.93099677152, 't_anc': 515875.5851996526, 'p_pulse': 0.0008410052687267091, 't_pulse': 1081.016605046677, 't_ghost': 50008.16334495788})\n", " success: False\n", " x: array([ 1.66675285e+01, -1.00000000e-03, 8.49349310e+04, 4.20940654e+05,\n", " -7.08007127e+00, -4.46383757e+00, -1.09520024e+01])" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "add_pulse_copy.stochastic_optimize(\n", " snps_per_minibatch=1000, num_iters=10, svrg_epoch=3)" ] }, { "cell_type": "markdown", "metadata": { "autoscroll": false, "ein.tags": "worksheet-0", "slideshow": { "slide_type": "-" } }, "source": [ "### Using functions of model parameters as demographic parameters\n", "\n", "momi allows you to set a demographic parameter as a function of other model parameters.\n", "\n", "For example, suppose we have a parameter `t_div` for the divergence time between 2 populations, and we would like to add a pulse event at time `t_div / 2`.\n", "\n", "This can be achieved by passing a lambda function to move_lineages as follows:\n", "\n", "```\n", "model.move_lineages(pop1, pop2, t=lambda params: params.t_div / 2, p=\"p_mig\")\n", "```\n", "\n", "The lambda function should take a single argument, `params`, which has all the defined parameters as attributes, e.g. `params.t_div` if you have defined a `t_div` parameter.\n", "\n", "As another example, for a population that is exponentially growing since time `t`, we may parametrize the growth rate in terms of the population sizes at the beginning and end of the epoch:\n", "\n", "```\n", "model.add_leaf(pop, N=\"N_end\", g=lambda params: np.log(params.N_end/params.N_start)/params.t_start)\n", "model.set_size(pop, t=\"t_start\", g=0)\n", "```\n", "\n", "This can be more numerically stable than parametrizing the growth rate directly (since small changes in the growth rate can cause very large changes in population sizes).\n", "\n", "Some care is needed -- momi internally uses [autograd](https://github.com/HIPS/autograd) to compute gradients, so the function must be differentiable by autograd. Lambda functions to do simple arithmetic (as above) are fine, however more complex functions with variable assignments, or that call external methods, need some care, otherwise gradients will be wrong. It is highly recommended to read the autograd [tutorial](https://github.com/HIPS/autograd/blob/master/docs/tutorial.md) before using this feature." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" }, "name": "tutorial.ipynb", "org": null }, "nbformat": 4, "nbformat_minor": 1 }