├── demo_notebooks ├── psd_example.npz ├── matplotlibrc_notebook.mplstyle └── 3-sbi_demo.ipynb ├── LICENSE ├── README.md └── .gitignore /demo_notebooks/psd_example.npz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rdgao/specparam-sbi/HEAD/demo_notebooks/psd_example.npz -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Richard Gao 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /demo_notebooks/matplotlibrc_notebook.mplstyle: -------------------------------------------------------------------------------- 1 | # http://matplotlib.org/users/customizing.html 2 | 3 | # Note: Units are in pt not in px 4 | # 5 | # How to convert px to pt in Inkscape 6 | # > Inkscape pixel is 1/90 of an inch, other software usually uses 1/72. 7 | # > This means if you need 10pt - use 12.5 in Inkscape (multiply with 1.25). 8 | # > http://www.inkscapeforum.com/viewtopic.php?f=6&t=5964 9 | 10 | text.usetex : False 11 | mathtext.default : regular 12 | 13 | font.family : serif 14 | font.serif : Arial, sans-serif 15 | font.sans-serif : Arial, sans-serif 16 | font.cursive : Arial, sans-serif 17 | font.size : 14 18 | figure.titlesize : 14 19 | legend.fontsize : 14 20 | axes.titlesize : 14 21 | axes.labelsize : 14 22 | xtick.labelsize : 14 23 | ytick.labelsize : 14 24 | 25 | image.interpolation : nearest 26 | image.resample : False 27 | image.composite_image : True 28 | 29 | axes.spines.left : True 30 | axes.spines.bottom : True 31 | axes.spines.top : False 32 | axes.spines.right : False 33 | 34 | axes.linewidth : 1.5 35 | xtick.major.width : 1.5 36 | xtick.minor.width : 1.5 37 | ytick.major.width : 1.5 38 | ytick.minor.width : 1.5 39 | 40 | lines.linewidth : 1.5 41 | lines.markersize : 3 42 | 43 | savefig.dpi : 300 44 | savefig.format : svg 45 | savefig.bbox : tight 46 | savefig.pad_inches : 0.1 47 | 48 | svg.image_inline : True 49 | svg.fonttype : none 50 | 51 | legend.frameon : False 52 | 53 | figure.figsize : 4.0, 4.0 54 | axes.prop_cycle : cycler('color', ['k', '1f77b4', 'ff7f0e', '2ca02c', 'd62728', '9467bd', '8c564b', 'e377c2', '7f7f7f', 'bcbd22', '17becf']) 55 | 56 | figure.facecolor : 'white' -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # specparam-sbi 2 | Tutorials on chaining together LFP simulation (`neurodsp`), spectral parameterization (`fooof`), and simulation-based inference (`sbi`). 3 | 4 | | Colab Link | Tutorial | 5 | | - | --- | 6 | | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/rdgao/specparam-sbi/blob/main/demo_notebooks/1-fooof_ndsp_demo.ipynb) | **Demo 1**: minimal example of how to use `fooof` and simulating time series. | 7 | | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/rdgao/specparam-sbi/blob/main/demo_notebooks/2-EI.ipynb) | **Demo 2**: reproducing the Poisson EI-1/f exponent model using `neurodsp`. | 8 | | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/rdgao/specparam-sbi/blob/main/demo_notebooks/3-sbi_demo.ipynb) | **Demo 3**: minimal example of how to use `sbi`. | 9 | | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/rdgao/specparam-sbi/blob/main/demo_notebooks/4-EI_tau_inference.ipynb) | **Demo 4**: combining everything to do inference and probabilistic spectral parameter estimation. | 10 | 11 | Packages required (all installable via `pip install`): 12 | - `neurodsp` ([repo](https://github.com/neurodsp-tools/neurodsp)) 13 | - `fooof` ([repo](https://github.com/fooof-tools/fooof)) 14 | - `sbi` ([repo](https://github.com/mackelab/sbi)) 15 | 16 | To set up and run in a new conda environment: 17 | ``` 18 | conda create -n sbsp python=3.8 19 | conda activate sbsp 20 | pip install uv 21 | uv pip install jupyter fooof neurodsp sbi==0.22 22 | ``` 23 | 24 | For more complex mechanistic model simulations with spiking neural networks, go to [AutoMIND](https://github.com/mackelab/automind). 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | sbi-logs/ 2 | 3 | # Byte-compiled / optimized / DLL files 4 | __pycache__/ 5 | *.py[cod] 6 | *$py.class 7 | 8 | # C extensions 9 | *.so 10 | 11 | # Distribution / packaging 12 | .Python 13 | build/ 14 | develop-eggs/ 15 | dist/ 16 | downloads/ 17 | eggs/ 18 | .eggs/ 19 | lib/ 20 | lib64/ 21 | parts/ 22 | sdist/ 23 | var/ 24 | wheels/ 25 | share/python-wheels/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | MANIFEST 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .nox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | *.py,cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | cover/ 55 | 56 | # Translations 57 | *.mo 58 | *.pot 59 | 60 | # Django stuff: 61 | *.log 62 | local_settings.py 63 | db.sqlite3 64 | db.sqlite3-journal 65 | 66 | # Flask stuff: 67 | instance/ 68 | .webassets-cache 69 | 70 | # Scrapy stuff: 71 | .scrapy 72 | 73 | # Sphinx documentation 74 | docs/_build/ 75 | 76 | # PyBuilder 77 | .pybuilder/ 78 | target/ 79 | 80 | # Jupyter Notebook 81 | .ipynb_checkpoints 82 | 83 | # IPython 84 | profile_default/ 85 | ipython_config.py 86 | 87 | # pyenv 88 | # For a library or package, you might want to ignore these files since the code is 89 | # intended to run in multiple environments; otherwise, check them in: 90 | # .python-version 91 | 92 | # pipenv 93 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 94 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 95 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 96 | # install all needed dependencies. 97 | #Pipfile.lock 98 | 99 | # poetry 100 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 101 | # This is especially recommended for binary packages to ensure reproducibility, and is more 102 | # commonly ignored for libraries. 103 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 104 | #poetry.lock 105 | 106 | # pdm 107 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 108 | #pdm.lock 109 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 110 | # in version control. 111 | # https://pdm.fming.dev/#use-with-ide 112 | .pdm.toml 113 | 114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 115 | __pypackages__/ 116 | 117 | # Celery stuff 118 | celerybeat-schedule 119 | celerybeat.pid 120 | 121 | # SageMath parsed files 122 | *.sage.py 123 | 124 | # Environments 125 | .env 126 | .venv 127 | env/ 128 | venv/ 129 | ENV/ 130 | env.bak/ 131 | venv.bak/ 132 | 133 | # Spyder project settings 134 | .spyderproject 135 | .spyproject 136 | 137 | # Rope project settings 138 | .ropeproject 139 | 140 | # mkdocs documentation 141 | /site 142 | 143 | # mypy 144 | .mypy_cache/ 145 | .dmypy.json 146 | dmypy.json 147 | 148 | # Pyre type checker 149 | .pyre/ 150 | 151 | # pytype static type analyzer 152 | .pytype/ 153 | 154 | # Cython debug symbols 155 | cython_debug/ 156 | 157 | # PyCharm 158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 160 | # and can be added to the global gitignore or merged into this file. For a more nuclear 161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 162 | #.idea/ 163 | -------------------------------------------------------------------------------- /demo_notebooks/3-sbi_demo.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "572d9de8-6d6c-4d73-8729-7d2c373697dc", 6 | "metadata": {}, 7 | "source": [ 8 | "# Demo 3: simulation-based inference (sbi) for parameter posterior inference\n", 9 | "\n", 10 | "In this demo, we will implement a toy simulator and do inference on it given an observation.\n", 11 | "\n", 12 | "See https://www.mackelab.org/sbi/ for full tutorials." 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 1, 18 | "id": "48579551-9878-49fe-b66c-093527353904", 19 | "metadata": {}, 20 | "outputs": [], 21 | "source": [ 22 | "# !pip install sbi==0.22" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 2, 28 | "id": "ae179ae6-1f3b-4a0c-b187-20789970cef4", 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [ 32 | "ON_COLAB = False\n", 33 | "%matplotlib inline\n", 34 | "import matplotlib.pyplot as plt\n", 35 | "import numpy as np\n", 36 | "\n", 37 | "cur_dir = 'https://raw.githubusercontent.com/rdgao/specparam-sbi/main/demo_notebooks/' if ON_COLAB else './'\n", 38 | "plt.style.use(cur_dir + 'matplotlibrc_notebook.mplstyle')" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 3, 44 | "id": "88f6cfcc-b34b-46ed-9928-5674a373f98f", 45 | "metadata": {}, 46 | "outputs": [], 47 | "source": [ 48 | "import torch\n", 49 | "from sbi.inference import SNPE, prepare_for_sbi, simulate_for_sbi\n", 50 | "from sbi.utils.get_nn_models import posterior_nn\n", 51 | "from sbi import utils as utils\n", 52 | "from sbi import analysis as analysis" 53 | ] 54 | }, 55 | { 56 | "cell_type": "markdown", 57 | "id": "176a691f-0e2b-465b-a52a-6d3f05807eb7", 58 | "metadata": {}, 59 | "source": [ 60 | "# Define the toy simulator.\n", 61 | "We make a stochastic simulator that is just adding gaussian noise with mean `mu` and variance `sigma` to the parameters, i.e.\n", 62 | "\n", 63 | "$x \\sim p(x|\\theta) = \\theta + \\epsilon$, where $\\epsilon \\sim \\mathcal{N}(\\mu, \\sigma^2)$" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 4, 69 | "id": "15b5de35-afce-4f9e-8070-913a271cb112", 70 | "metadata": {}, 71 | "outputs": [], 72 | "source": [ 73 | "def linear_gaussian(theta):\n", 74 | " mu = 3.0\n", 75 | " sigma = 0.5\n", 76 | " return theta + mu + torch.randn_like(theta) * sigma" 77 | ] 78 | }, 79 | { 80 | "cell_type": "markdown", 81 | "id": "ca2502b6-ae2e-4347-b75e-ebd6d1f9afb9", 82 | "metadata": {}, 83 | "source": [ 84 | "### Define prior (proposal) distribution for the simulator." 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 5, 90 | "id": "17e79267-4e63-4550-9f13-8a1008908042", 91 | "metadata": {}, 92 | "outputs": [], 93 | "source": [ 94 | "num_dim = 2\n", 95 | "prior = utils.BoxUniform(low=-2 * torch.ones(num_dim), high=2 * torch.ones(num_dim))" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "id": "c30fe4ad-1efe-4584-b16b-a0c223ecb669", 101 | "metadata": {}, 102 | "source": [ 103 | "As an example, simulate from two random draws of parameter `theta` and look at their respective simulated \"data\", `x`. \n", 104 | "\n", 105 | "The question is, given an observation `x_o`, infer the most likely parameter `theta_o` that produced that observation." 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 6, 111 | "id": "7dea0ecc-d462-49dd-9525-fdfbab102580", 112 | "metadata": {}, 113 | "outputs": [ 114 | { 115 | "data": { 116 | "text/plain": [ 117 | "" 118 | ] 119 | }, 120 | "execution_count": 6, 121 | "metadata": {}, 122 | "output_type": "execute_result" 123 | }, 124 | { 125 | "data": { 126 | "image/png": "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", 127 | "text/plain": [ 128 | "
" 129 | ] 130 | }, 131 | "metadata": {}, 132 | "output_type": "display_data" 133 | } 134 | ], 135 | "source": [ 136 | "torch.manual_seed(42)\n", 137 | "theta_o = prior.sample((1,))\n", 138 | "x_o = linear_gaussian(theta_o)\n", 139 | "\n", 140 | "num_sims = 20\n", 141 | "for i_ in range(2):\n", 142 | " theta = prior.sample((1,))\n", 143 | " x = linear_gaussian(theta.repeat(num_sims,1))\n", 144 | " plt.plot(theta[:,0], theta[:,1], f'oC{i_}', label=f'theta_{i_}', ms=8)\n", 145 | " plt.plot(x[:,0], x[:,1], f'sC{i_}', label=f'x_{i_}', alpha=0.5)\n", 146 | "\n", 147 | "plt.plot(x_o[:,0], x_o[:,1], f'sC4', label=f'x_obs', alpha=1, ms=5)\n", 148 | "plt.legend(frameon=True, bbox_to_anchor=[1.5,0,0,1])" 149 | ] 150 | }, 151 | { 152 | "cell_type": "markdown", 153 | "id": "0db5a7c6-209a-4f5f-ae2a-4ac31ae7a01e", 154 | "metadata": {}, 155 | "source": [ 156 | "### Make the training data by simulating many times with random `theta`." 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": 7, 162 | "id": "e830c1ba-5823-4238-ac40-d4c21e40769b", 163 | "metadata": {}, 164 | "outputs": [], 165 | "source": [ 166 | "num_training = 2000\n", 167 | "theta = prior.sample((num_training,))\n", 168 | "x = linear_gaussian(theta)" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": 8, 174 | "id": "54944d28-b53a-42e5-8995-efdc0f976d74", 175 | "metadata": {}, 176 | "outputs": [ 177 | { 178 | "data": { 179 | "text/plain": [ 180 | "" 181 | ] 182 | }, 183 | "execution_count": 8, 184 | "metadata": {}, 185 | "output_type": "execute_result" 186 | }, 187 | { 188 | "data": { 189 | "image/png": "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", 190 | "text/plain": [ 191 | "
" 192 | ] 193 | }, 194 | "metadata": {}, 195 | "output_type": "display_data" 196 | } 197 | ], 198 | "source": [ 199 | "plt.plot(theta[:100,0], theta[:100,1], f'ok', label=f'theta (prior samples)', alpha=0.5)\n", 200 | "plt.plot(x[:100,0], x[:100,1], f'sg', label=f'x (simulated)', alpha=0.5)\n", 201 | "plt.legend(frameon=True)" 202 | ] 203 | }, 204 | { 205 | "cell_type": "markdown", 206 | "id": "ed8dfbe1-4abd-4fd5-a65d-d3448d6b8e8e", 207 | "metadata": {}, 208 | "source": [ 209 | "### Train density estimatior." 210 | ] 211 | }, 212 | { 213 | "cell_type": "code", 214 | "execution_count": 9, 215 | "id": "e902e756-ab3f-42ba-8cc9-fa77072d655b", 216 | "metadata": {}, 217 | "outputs": [ 218 | { 219 | "name": "stdout", 220 | "output_type": "stream", 221 | "text": [ 222 | " Neural network successfully converged after 149 epochs." 223 | ] 224 | } 225 | ], 226 | "source": [ 227 | "inference = SNPE(prior=prior)\n", 228 | "inference = inference.append_simulations(theta, x)\n", 229 | "density_estimator = inference.train()" 230 | ] 231 | }, 232 | { 233 | "cell_type": "markdown", 234 | "id": "1acf46ce-5ae5-4d6f-b133-ffc01c504f4a", 235 | "metadata": {}, 236 | "source": [ 237 | "### Get posterior distribution conditioned on `x_o` and sample." 238 | ] 239 | }, 240 | { 241 | "cell_type": "code", 242 | "execution_count": 10, 243 | "id": "8f8cf5b6-4a31-443a-9993-fcec768db042", 244 | "metadata": {}, 245 | "outputs": [ 246 | { 247 | "data": { 248 | "application/vnd.jupyter.widget-view+json": { 249 | "model_id": "9f88cfce34f64790b6fc72ebb95b198e", 250 | "version_major": 2, 251 | "version_minor": 0 252 | }, 253 | "text/plain": [ 254 | "Drawing 10000 posterior samples: 0%| | 0/10000 [00:00" 265 | ] 266 | }, 267 | "metadata": {}, 268 | "output_type": "display_data" 269 | } 270 | ], 271 | "source": [ 272 | "posterior = inference.build_posterior(density_estimator)\n", 273 | "posterior_samples = posterior.sample((10000,), x=x_o)\n", 274 | "\n", 275 | "# plot posterior samples\n", 276 | "_ = analysis.pairplot(\n", 277 | " posterior_samples, limits=[[-2, 2], [-2, 2]], figsize=(5, 5),\n", 278 | " points=[theta_o], points_colors=['C0'],\n", 279 | " labels=['theta_0', 'theta_1']\n", 280 | ")" 281 | ] 282 | }, 283 | { 284 | "cell_type": "markdown", 285 | "id": "50e12ec1-e8b7-49d1-abd0-b83ba3cf9144", 286 | "metadata": {}, 287 | "source": [ 288 | "### We can also check 'predictive simulations' by simulating the posterior samples again." 289 | ] 290 | }, 291 | { 292 | "cell_type": "code", 293 | "execution_count": 11, 294 | "id": "8252b39c-5bea-428e-ab9b-238541ca5f7e", 295 | "metadata": {}, 296 | "outputs": [], 297 | "source": [ 298 | "predictive_samples = linear_gaussian(posterior_samples)" 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": 12, 304 | "id": "023810e8-10ef-4c13-ab3e-5158e7f31d8c", 305 | "metadata": {}, 306 | "outputs": [ 307 | { 308 | "data": { 309 | "image/png": "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", 310 | "text/plain": [ 311 | "
" 312 | ] 313 | }, 314 | "metadata": {}, 315 | "output_type": "display_data" 316 | } 317 | ], 318 | "source": [ 319 | "# plot posterior samples\n", 320 | "_ = analysis.pairplot(\n", 321 | " predictive_samples, limits=[[-2, 6], [-2, 6]], figsize=(5, 5),\n", 322 | " points=[x_o], points_colors=['C4'], # observation\n", 323 | " labels=['x_0', 'x_1']\n", 324 | ")" 325 | ] 326 | } 327 | ], 328 | "metadata": { 329 | "kernelspec": { 330 | "display_name": "Python 3 (ipykernel)", 331 | "language": "python", 332 | "name": "python3" 333 | }, 334 | "language_info": { 335 | "codemirror_mode": { 336 | "name": "ipython", 337 | "version": 3 338 | }, 339 | "file_extension": ".py", 340 | "mimetype": "text/x-python", 341 | "name": "python", 342 | "nbconvert_exporter": "python", 343 | "pygments_lexer": "ipython3", 344 | "version": "3.8.20" 345 | } 346 | }, 347 | "nbformat": 4, 348 | "nbformat_minor": 5 349 | } 350 | --------------------------------------------------------------------------------