{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Isotopically Non-Stationary 13C-MFA\n", "INCA is capable of analyzing isotopically non-stationary (INST) data. I such data sets the fluxes are still assumed to be constant, however the isotopologue distribution vector are allow to vary dynamically (See plot further down).\n", "\n", "The INCAWrapper can setup INCA models to fit INST datasets. In this example we will show how by estimating the flux distribution from a simulated INST dataset.\n", "\n", "The simulated dataset is produced using the simple model [1,2], which we have also used in earlier tutorials. This time however, we simulated the isotopically non-stationary data. To inspect how the data was simulated see https://github.com/biosustain/incawrapper/tree/main/docs/examples/Literature%20data/simple%20model/simple_model_inst_simulation.py." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import pathlib\n", "import incawrapper\n", "import ast\n", "PROJECT_DIR = pathlib.Path().cwd().parents[1].resolve()\n", "data_folder = PROJECT_DIR / pathlib.Path(\"docs/examples/Literature data/simple model\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "To fit fluxes to a INST dataset INCA as minimum requires:\n", "\n", "- Reaction data\n", "- Tracer data\n", "- MS measurements\n", "\n", "Furthermore, it is possible to use \n", "- Flux measurements\n", "- Pool size measurement, i.e. concentrations of metabolites\n", "\n", "For completeness, we will here consider the data where we have ms, pool size, and flux measurements. We will load both the measurements and the tracer and reaction information here." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "tracers_data = pd.read_csv(data_folder / \"tracers.csv\", \n", " converters={'atom_mdv':ast.literal_eval, 'atom_ids':ast.literal_eval} # a trick to read lists from csv\n", ").query(\"experiment_id == 'exp1'\") # we only simulated experiment 1\n", "\n", "reactions_data = pd.read_csv(data_folder / \"reactions.csv\")\n", "ms_data = pd.read_csv(data_folder / 'simulated_data' / \"mdv_no_noise.csv\", \n", " converters={'labelled_atom_ids': ast.literal_eval} # a trick to read lists from csv\n", ")\n", "pool_sizes = pd.read_csv(data_folder / 'simulated_data' / \"pool_sizes_measurement_no_noise.csv\")\n", "flux_measurements = pd.read_csv(data_folder / 'simulated_data' / \"flux_measurements_no_noise.csv\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The toy model has 5 reactions that we will show here." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "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", "
modelrxn_idrxn_eqn
0simple_modelR1A (abc) -> B (abc)
1simple_modelR2B (abc) <-> D (abc)
2simple_modelR3B (abc) -> C (bc) + E (a)
3simple_modelR4B (abc) + C (de) -> D (bcd) + E (a) + E (e)
4simple_modelR5D (abc) -> F (abc)
\n", "
" ], "text/plain": [ " model rxn_id rxn_eqn\n", "0 simple_model R1 A (abc) -> B (abc)\n", "1 simple_model R2 B (abc) <-> D (abc)\n", "2 simple_model R3 B (abc) -> C (bc) + E (a)\n", "3 simple_model R4 B (abc) + C (de) -> D (bcd) + E (a) + E (e)\n", "4 simple_model R5 D (abc) -> F (abc)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reactions_data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We consider one experiment with a single labelled substrate, A, which is labelled at carbon position 2." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "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", "
experiment_idmet_idtracer_idatom_idsratioatom_mdvenrichment
0exp1A[2-13C]A[2]1.0[0, 1]1
\n", "
" ], "text/plain": [ " experiment_id met_id tracer_id atom_ids ratio atom_mdv enrichment\n", "0 exp1 A [2-13C]A [2] 1.0 [0, 1] 1" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tracers_data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When analysing INST data, we have mass distribution vectors of the same metabolite at multiple time points. These are specified by adding the timepoint in the `time` column." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
experiment_idmet_idms_idmeasurement_replicatelabelled_atom_idsunlabelled_atomsmass_isotopeintensity_std_errortimeintensity
0exp1BB11[1, 2, 3]NaN00.00301.0
1exp1BB11[1, 2, 3]NaN10.00300.0
2exp1BB11[1, 2, 3]NaN20.00300.0
3exp1BB11[1, 2, 3]NaN30.00300.0
4exp1FF11[1, 2, 3]NaN00.00301.0
\n", "
" ], "text/plain": [ " experiment_id met_id ms_id measurement_replicate labelled_atom_ids \\\n", "0 exp1 B B1 1 [1, 2, 3] \n", "1 exp1 B B1 1 [1, 2, 3] \n", "2 exp1 B B1 1 [1, 2, 3] \n", "3 exp1 B B1 1 [1, 2, 3] \n", "4 exp1 F F1 1 [1, 2, 3] \n", "\n", " unlabelled_atoms mass_isotope intensity_std_error time intensity \n", "0 NaN 0 0.003 0 1.0 \n", "1 NaN 1 0.003 0 0.0 \n", "2 NaN 2 0.003 0 0.0 \n", "3 NaN 3 0.003 0 0.0 \n", "4 NaN 0 0.003 0 1.0 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ms_data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get a better idea of what the data looks like we can visualise the time series." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/s143838/.virtualenvs/incawrapper-dev/lib/python3.10/site-packages/seaborn/axisgrid.py:123: UserWarning: The figure layout has changed to tight\n", " self._figure.tight_layout(*args, **kwargs)\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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rVq1HFar1dG+fXvHypUrjQ7J5RYtWuQACr0GDhxodGguVdQ9Ao4ZM2YYHZrLPfzww47atWs7rFaro0qVKo7rrrvOsWDBAqPDKjPlfZqQipBXHA7lFuUWz1Le84rDUTFyi/LKDKNDc7mKnFccDvfILVJ6TA6Hw1HqFb+IiIiIiIiI5NEz4yIiIiIiIiJlTMW4iIiIiIiISBlTMS4iIiIiIiJSxlSMi4iIiIiIiJQxFeMiIiIiIiIiZUzFuIiIiIiIiEgZUzEuIiIiIiIiUsZUjIuIiIiIiIiUMRXj4lEWL16MyWQiISHB6FBExIMot4iIqymviIjJ4XA4jA5CpKS6detGy5YtGT9+PABZWVmcPn2aiIgITCaTscGJiNtSbhERV1NeEZHzeRkdgIgrWa1WqlWrZnQYIuJhlFtExNWUV0RE3dTFbT300EMsWbKECRMmYDKZMJlMfPLJJwW6fH3yySeEhoby008/0ahRI/z9/bnrrrtIS0vj008/JTo6mkqVKjFy5EhsNlveuTMzM3nmmWeIjIwkICCAmJgYFi9ebMyNikiZUm4REVdTXhGRoqhlXNzWhAkT2LVrF02bNuXVV18FYOvWrYX2S0tLY+LEicyaNYvk5GTuuOMObr/9dkJDQ5k3bx579+7lzjvvpHPnzvTr1w+A4cOHs23bNmbNmkWNGjWYO3cuN954I5s3b6ZBgwZlep8iUraUW0TE1ZRXRKQoKsbFbYWEhGC1WvH398/r5rVjx45C+2VnZzN16lTq1asHwF133cX//vc/jh07RmBgIE2aNKF79+4sWrSIfv36ceDAAWbMmMGBAweoUaMGAM888wzz589nxowZvPHGG2V3kyJS5pRbRMTVlFdEpCgqxsXj+fv75/1RA4iIiCA6OprAwMAC244fPw7A5s2bsdlsNGzYsMB5MjMzqVy5ctkELSLlnnKLiLia8opIxaJiXDyet7d3gXWTyVTkNrvdDkBKSgoWi4XY2FgsFkuB/fL/MRSRik25RURcTXlFpGJRMS5uzWq1FhjExBVatWqFzWbj+PHjXHvttS49t4i4B+UWEXE15RUROZ9GUxe3Fh0dzapVq9i3bx8nT57M+6X4SjRs2JD777+fAQMG8O233xIXF8fq1asZO3YsP//8swuiFpHyTrlFRFxNeUVEzqdiXNzaM888g8VioUmTJlSpUoUDBw645LwzZsxgwIABPP300zRq1Ii+ffuyZs0aatWq5ZLzi0j5ptwiIq6mvCIi5zM5HA6H0UGIiIiIiIiIVCRqGRcREREREREpYyrGRURERERERMqYinERERERERGRMqZiXERERERERKSMqRgXERERERERKWMqxkVERERERETKmIpxERERERERkTKmYlxERERERESkjKkYFxERERERESljKsZFREREREREypiKcREREREREZEypmJcREREREREpIz9P9rMeYxFB5jdAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "g = sns.FacetGrid(ms_data, col=\"ms_id\", hue=\"mass_isotope\")\n", "g.map_dataframe(sns.lineplot, data=ms_data, x=\"time\", y=\"intensity\")\n", "\n", "# add overall legend\n", "g.add_legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that the measured mass isotopologue distribution changes over time especially for the B and F metabolites. While it only changes a little for the E metabolite.\n", "\n", "We also have measurements of one uptake rate and one secretion rate. A core assumption for INST 13C-MFA is that the fluxes are constant, thus there is only one measurement for each flux." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "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", "
rxn_idfluxexperiment_idflux_std_error
0R1100.000000exp10.300000
1R580.566147exp10.241698
\n", "
" ], "text/plain": [ " rxn_id flux experiment_id flux_std_error\n", "0 R1 100.000000 exp1 0.300000\n", "1 R5 80.566147 exp1 0.241698" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "flux_measurements.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we are ready to create the inca script. This is done very similar to the other examples. The main difference is that `sim_ss=False` this tells inca that don't wish to assume steady state in the isotopologue distributions." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "output_file = PROJECT_DIR / pathlib.Path(\"docs/examples/Literature data/simple model/simple_model_inst_fitting.mat\")\n", "script = incawrapper.create_inca_script_from_data(\n", " reactions_data=reactions_data, \n", " tracer_data=tracers_data, \n", " flux_measurements=flux_measurements,\n", " pool_measurements=pool_sizes,\n", " ms_measurements=ms_data, \n", " experiment_ids=[\"exp1\"]\n", ")\n", "script.add_to_block(\"options\", \n", " incawrapper.define_options(\n", " fit_starts=10, # Number of flux estimation restarts\n", " sim_na=False, # Do not simulate natural abundance\n", " sim_ss=False # Do INST 13C MFA\n", " )\n", ")\n", "script.add_to_block(\"runner\", incawrapper.define_runner(output_file, run_estimate=True, run_continuation=True))" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Now the script is ready to run in matlab." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " \n", "ms_exp1 = 1x3 msdata object\n", " \n", "fields: atoms id [idvs] more on state \n", " \n", "B1 E1 F1\n", " \n", " \n", "ms_exp1 = 1x3 msdata object\n", " \n", "fields: atoms id [idvs] more on state \n", " \n", "B1 E1 F1\n", " \n", " \n", "ms_exp1 = 1x3 msdata object\n", " \n", "fields: atoms id [idvs] more on state \n", " \n", "B1 E1 F1\n", " \n", " \n", "m = 1x1 model object\n", " \n", "fields: [expts] [mets] notes [options] [rates] [states] \n", " \n", "\t5 reactions (6 fluxes) \n", "\t6 states (3 balanced, 1 source, 2 sink and 0 unbalanced)\n", "\t6 metabolites \n", "\t1 experiments \n", " \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 8.80347e+07\n", " 1 4.64462e+07 0.277 -6.3e+07 0.111111\n", " 2 4.56521e+07 0.00865 -4.57e+07 0.111111\n", " 3 4.53763e+07 0.00304 -4.52e+07 0.111111\n", " 4 1.51334e+07 0.43 -2.54e+07 0.111111\n", " 5 7.19864e+06 0.319 -1e+07 0.111111\n", " 6 182600 1 -7.37e+04 0.111111\n", " 7 32453.9 1 -7.59e+03 0.037037\n", " 8 16919.7 1 -508 0.0123457\n", " 9 15454.6 1 -22.7 0.00411523\n", " 10 15076.6 1 -62.9 0.00361073\n", " 11 9817.3 0.231 8.36e+03 0.00293036\n", " 12 326.457 0.838 -1.54e+03 0.00293036\n", " 13 7.07087 1 -1.21 0.00293036\n", " \n", " Optimization terminated: Constrained optimum found.\n", " Parameters converged to within tolerance. \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 8.39765e+07\n", " 1 8.29154e+07 0.00637 -8.29e+07 0.150157\n", " 2 1.64973e+07 0.564 -3.58e+07 0.150157\n", " 3 1.63743e+07 0.00379 -1.62e+07 0.150157\n", " 4 1.62851e+07 0.00277 -1.61e+07 0.150157\n", " 5 9.97697e+06 0.224 -1.23e+07 0.150157\n", " 6 289203 1 -8.72e+04 0.150157\n", " 7 51116.1 1 -2.65e+04 0.0500524\n", " 8 31359.8 1 3.73e+03 0.0166841\n", " 9 29942.9 0.162 -3.85e+03 0.013746\n", " 10 29186.1 1 2e+03 0.013746\n", " 11 23393.2 0.207 -1.22e+04 0.0172162\n", " 12 15050.3 1 -231 0.0172162\n", " 13 15029.5 1 0.194 0.00573872\n", " 14 15028.2 1 -0.0383 0.0025289\n", " 15 6665.92 0.634 2.23e+04 0.000842965\n", " 16 1784.18 1 35.8 0.000842965\n", " 17 162.149 1 -140 0.000280988\n", " 18 10.0179 1 -17.1 0.000120214\n", " 19 7.08585 0.941 -0.316 4.00712e-05\n", " 20 7.0415 1 -0.0016 4.00712e-05\n", " 21 7.04135 1 -2.78e-06 1.33571e-05\n", " \n", " Optimization terminated: Unconstrained optimum found.\n", " Norm of gradient less than tolerance. \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 8.6554e+07\n", " 1 8.4608e+07 0.0114 -8.48e+07 0.111111\n", " 2 5.56033e+07 0.192 -6.76e+07 0.111111\n", " 3 5.52764e+07 0.00296 -5.51e+07 0.111111\n", " 4 1.46314e+07 0.494 -2.75e+07 0.111111\n", " 5 7.60619e+06 0.287 -1.01e+07 0.111111\n", " 6 204376 1 -7.78e+04 0.111111\n", " 7 34893.8 1 -1.1e+04 0.037037\n", " 8 31657.4 1 4.66e+03 0.0123457\n", " 9 28833.9 1 1.86e+03 0.0125963\n", " 10 15177.7 1 -551 0.0126071\n", " 11 10023.6 0.385 3.54e+04 0.00420237\n", " 12 1676.12 1 14.8 0.00420237\n", " 13 159.443 1 -111 0.00140079\n", " 14 45.1375 0.523 -63.7 0.000631376\n", " 15 2.74157 1 -3.82 0.000631376\n", " 16 2.32142 1 -0.024 0.000210459\n", " \n", " Optimization terminated: Constrained optimum found.\n", " Parameters converged to within tolerance. \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 8.82926e+07\n", " 1 8.6347e+07 0.0112 -8.65e+07 0.111111\n", " 2 1.73613e+07 0.561 -3.75e+07 0.111111\n", " 3 1.7096e+07 0.00781 -1.69e+07 0.111111\n", " 4 1.70153e+07 0.0024 -1.68e+07 0.111111\n", " 5 1.08075e+07 0.209 -1.31e+07 0.111111\n", " 6 315592 1 -8.82e+04 0.111111\n", " 7 59173.2 1 -3.39e+04 0.037037\n", " 8 31776.2 1 4.14e+03 0.0123457\n", " 9 31119.9 0.0615 -5.28e+03 0.0093034\n", " 10 28729.8 1 1.87e+03 0.0093034\n", " 11 15078.2 1 -482 0.00931513\n", " 12 9217.01 0.436 3.28e+04 0.00310504\n", " 13 1783.34 1 -21.2 0.00310504\n", " 14 174.025 1 -141 0.00103501\n", " 15 9.42444 1 -16.6 0.000469196\n", " 16 6.81875 1 -0.165 0.000156399\n", " 17 6.80275 1 -0.00032 5.21329e-05\n", " 18 6.80278 1 -3.23e-07 1.73776e-05\n", " 19 6.80271 1 -3.05e-07 3.47553e-05\n", " \n", " Optimization terminated: Unconstrained optimum found.\n", " Norm of gradient less than tolerance. \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 8.46555e+07\n", " 1 8.41799e+07 0.00283 -8.39e+07 0.118315\n", " 2 1.66314e+07 0.565 -3.62e+07 0.118315\n", " 3 1.64206e+07 0.00648 -1.62e+07 0.118315\n", " 4 1.62829e+07 0.00427 -1.61e+07 0.118315\n", " 5 1.01792e+07 0.215 -1.24e+07 0.118315\n", " 6 288455 1 -8.8e+04 0.118315\n", " 7 51316.3 1 -2.6e+04 0.0394383\n", " 8 31947.8 1 4.28e+03 0.0131461\n", " 9 31025 0.0861 -5.09e+03 0.0113623\n", " 10 29443.6 1 2.1e+03 0.0113623\n", " 11 24686.2 0.156 -1.45e+04 0.0120989\n", " 12 15059.2 1 -283 0.0120989\n", " 13 15029.3 1 -1.5 0.00403297\n", " 14 6509.86 0.648 2.15e+04 0.00134432\n", " 15 1784.12 1 34.1 0.00134432\n", " 16 164.004 1 -140 0.000448107\n", " 17 10.0513 1 -17.3 0.000192713\n", " 18 7.05527 1 -0.166 6.42377e-05\n", " \n", " Optimization terminated: Constrained optimum found.\n", " Parameters converged to within tolerance. \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 8.61807e+07\n", " 1 8.40101e+07 0.0128 -8.44e+07 0.111111\n", " 2 8.32141e+07 0.00477 -8.31e+07 0.111111\n", " 3 7.86841e+07 0.0278 -8.03e+07 0.111111\n", " 4 1.30696e+07 0.604 -3.08e+07 0.111111\n", " 5 8.36853e+06 0.206 -1e+07 0.111111\n", " 6 273024 1 -8.7e+04 0.111111\n", " 7 46586.2 1 -2.23e+04 0.037037\n", " 8 31571.9 1 4.32e+03 0.0123457\n", " 9 28264.4 0.699 -116 0.011244\n", " 10 28174.2 1 915 0.011244\n", " 11 26809.6 1 -157 0.0198663\n", " 12 27272.5 0.177 2.23e+05 0.0182072\n", " 13 28673.8 0.0434 8.77e+05 0.0364144\n", " 14 28580.9 0.0455 8.37e+05 0.145658\n", " 15 27752.9 0.0649 5.94e+05 1.16526\n", " 16 21769.4 0.219 1.95e+05 9.32208\n", " 17 2320.73 1 108 9.32208\n", " 18 341.687 1 -189 3.10736\n", " 19 19.1996 1 -45.9 1.97299\n", " 20 6.91169 1 -0.92 0.657663\n", " 21 6.80925 1 -0.00994 0.219221\n", " 22 6.80286 1 -0.0017 0.0730736\n", " 23 6.80258 1 -0.000107 0.0434197\n", " \n", " Optimization terminated: Unconstrained optimum found.\n", " Parameters converged to within tolerance. \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 8.84086e+07\n", " 1 8.54262e+07 0.0172 -8.6e+07 0.111111\n", " 2 7.87759e+07 0.04 -8.12e+07 0.111111\n", " 3 7.78237e+07 0.00609 -7.79e+07 0.111111\n", " 4 1.42459e+07 0.583 -3.21e+07 0.111111\n", " 5 8.96799e+06 0.213 -1.09e+07 0.111111\n", " 6 277905 1 -8.61e+04 0.111111\n", " 7 47679.4 1 -2.37e+04 0.037037\n", " 8 31235.7 1 4.22e+03 0.0123457\n", " 9 28586.6 1 1.79e+03 0.0107715\n", " 10 15080.6 1 -538 0.0107789\n", " 11 14308.9 0.0267 -1.37e+04 0.00359297\n", " 12 10830.2 0.359 5.13e+04 0.00359297\n", " 13 1664.99 1 72.8 0.00359297\n", " 14 167.287 1 -95.7 0.00119766\n", " 15 6.23418 1 -17.7 0.000562941\n", " 16 2.32666 1 -0.174 0.000187647\n", " 17 2.3195 1 0.000911 6.2549e-05\n", " 18 2.31572 1 5.95e-05 6.49149e-05\n", " 19 2.3207 1 -5.69e-06 2.16383e-05\n", " 20 2.32065 1 -6.27e-06 4.32766e-05\n", " \n", " Optimization terminated: Unconstrained optimum found.\n", " Parameters converged to within tolerance. \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 8.66582e+07\n", " 1 1.70442e+07 0.566 -3.72e+07 0.111111\n", " 2 1.68174e+07 0.0068 -1.66e+07 0.111111\n", " 3 1.66502e+07 0.00508 -1.64e+07 0.111111\n", " 4 1.05707e+07 0.209 -1.28e+07 0.111111\n", " 5 310368 1 -8.84e+04 0.111111\n", " 6 57589.1 1 -3.23e+04 0.037037\n", " 7 31814.2 1 4.18e+03 0.0123457\n", " 8 31021.5 0.0749 -5.16e+03 0.0095651\n", " 9 29295 1 2.24e+03 0.0095651\n", " 10 22163.2 0.277 -1.06e+04 0.00995642\n", " 11 15049.1 1 -197 0.00995642\n", " 12 15028.9 1 -0.981 0.00331881\n", " 13 15028.6 0.349 -0.281 0.00110627\n", " 14 15028.2 1 -0.00905 0.00110627\n", " 15 6667.07 0.634 2.24e+04 0.000368756\n", " 16 1784.09 1 35.7 0.000368756\n", " 17 164.009 1 -140 0.000122919\n", " 18 10.0516 1 -17.3 5.2864e-05\n", " 19 7.05545 1 -0.166 1.76213e-05\n", " 20 7.05123 1 -0.000427 5.87378e-06\n", " 21 7.04731 1 8.06e-07 5.91445e-06\n", " 22 7.04093 0.347 -1.42e-06 1.97148e-06\n", " 23 7.0411 1 6.87e-08 1.97148e-06\n", " 24 7.0411 1 8.11e-08 3.94297e-06\n", " 25 7.0411 1 9.03e-08 1.57719e-05\n", " \n", " Optimization terminated: Constrained optimum found.\n", " Parameters converged to within tolerance. \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 8.78969e+07\n", " 1 8.27101e+07 0.0303 -8.43e+07 0.111111\n", " 2 7.96693e+07 0.0187 -8.05e+07 0.111111\n", " 3 4.44252e+07 0.256 -5.86e+07 0.111111\n", " 4 3.01012e+07 0.179 -3.6e+07 0.111111\n", " 5 9.00943e+06 0.462 -1.59e+07 0.111111\n", " 6 368485 0.87 -1.19e+06 0.111111\n", " 7 38818.5 1 -1.88e+04 0.111111\n", " 8 28813.4 1 464 0.037037\n", " 9 27531.2 1 229 0.0123457\n", " 10 19415.2 0.888 1.88e+04 0.0123429\n", " 11 17095 1 13.7 0.0123429\n", " 12 15405.7 1 -102 0.0041143\n", " 13 15054.6 1 -59.9 0.00287209\n", " 14 5608.04 0.746 1.77e+04 0.000957364\n", " 15 1784.37 1 18.9 0.000957364\n", " 16 163.871 1 -141 0.000319121\n", " 17 9.28104 1 -15.8 0.000137885\n", " 18 6.81873 1 -0.145 4.59616e-05\n", " 19 6.80896 1 -0.000271 1.53205e-05\n", " 20 6.81233 1 -6.9e-07 5.10684e-06\n", " 21 6.80902 1 -2.53e-07 1.02137e-05\n", " \n", " Optimization terminated: Unconstrained optimum found.\n", " Parameters converged to within tolerance. \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 8.95343e+07\n", " 1 7.42695e+07 0.0903 -8.08e+07 0.111111\n", " 2 7.30822e+07 0.00804 -7.36e+07 0.111111\n", " 3 4.89482e+07 0.183 -5.91e+07 0.111111\n", " 4 1.33372e+06 0.869 -6.39e+06 0.111111\n", " 5 129221 1 -8.12e+04 0.111111\n", " 6 18347.2 1 -3.13e+03 0.037037\n", " 7 2089.56 1 442 0.0123457\n", " 8 305.929 1 -180 0.00411523\n", " 9 105.718 0.469 -147 0.00263209\n", " 10 4.34867 1 -11.7 0.00263209\n", " 11 2.3313 1 -0.126 0.000877365\n", " \n", " Optimization terminated: Constrained optimum found.\n", " Parameters converged to within tolerance. \n", "\n", " Directional \n", " Iteration Residual Step-size derivative Lambda\n", " 0 2.31572\n", " 1 2.19873 1 -5.43e-05 9.88143e-09\n", " 2 2.14707 0.279 -0.193 3.29381e-09\n", " 3 0.177144 1 0.248 3.29381e-09\n", " 4 0.0375023 1 0.0379 1.16041e-09\n", " 5 0.0278745 1 0.00169 3.89766e-10\n", " 6 0.02766 1 0.00025 1.29922e-10\n", " 7 0.0174713 1 0.000507 1.24112e-10\n", " 8 0.0166539 1 7.26e-05 7.36839e-11\n", " \n", " Optimization terminated: Unconstrained optimum found.\n", " Parameters converged to within tolerance. \n", "\n", "\tEstimation completed in 39.5600 seconds.\n", "\n", "\tPreprocessing time: 9.7600 s\n", "\n", "\tComputation time: 29.5700 s\n", "\n", "\tPostprocessing time: 0.2300 s\n", "\n", "\n", " ========== Varying R1 upward from 99.99 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.754745 0.215778 0.215778 0.005972 0.019519 3 0 1 9.88142e-09\n", " 2 1.517117 0.306032 0.0902535 -0.003133 0.002786 12 0 1 3.29381e-09\n", " 3 1.719718 0.325427 0.0193951 0.004318 0.000989 1 0 0.28 1.09794e-09\n", " 4 2.486981 0.391547 0.0661198 -0.000187 0.000842 1 0 1 1.09794e-09\n", " 5 3.253886 0.448067 0.05652 -0.001386 0.000000 3 0 1 3.65979e-10\n", " 6 4.021580 0.498288 0.050221 0.000971 0.001569 1 0 1 1.21993e-10\n", "\n", " ========== Varying R1 downward from 99.99 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.772019 0.215673 0.215673 0.017932 0.014205 11 0 1 9.88142e-09\n", " 2 1.542067 0.30482 0.0891473 0.004471 0.002715 11 0 1 3.29381e-09\n", " 3 2.312094 0.373107 0.0682867 0.002637 0.000903 10 0 1 1.09794e-09\n", " 4 3.080986 0.430594 0.0574866 0.001495 0.000895 11 0 1 3.65979e-10\n", " 5 3.776696 0.476568 0.045974 0.001914 0.000593 1 0 0.908 1.21993e-10\n", " 6 4.553611 0.522706 0.0461386 0.008624 0.000000 1 0 1 1.21993e-10\n", "\n", " ========== Varying R2 net upward from 61.15 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.719768 0.339624 0.339624 -0.014601 0.023062 13 0 0.993 9.88142e-09\n", " 2 0.798777 0.35994 0.0203157 -0.000351 0.000768 8 0 0.139 9.88142e-09\n", " 3 0.884681 0.379857 0.0199165 -0.000141 0.000607 6 0 0.145 9.88142e-09\n", " 4 0.980513 0.400214 0.0203571 -0.000536 0.000488 3 0 0.156 9.88142e-09\n", " 5 1.077754 0.419233 0.0190197 -0.000810 0.000000 1 0 0.155 9.88142e-09\n", " 6 1.829426 0.536339 0.117106 -0.016549 0.000070 1 0 1 9.88142e-09\n", " 7 2.579316 0.625327 0.0889879 -0.018402 0.000000 9 0 1 3.29381e-09\n", " 8 3.328514 0.700059 0.0747311 -0.018794 0.000300 11 0 1 1.09794e-09\n", " 9 4.076962 0.765748 0.0656895 -0.019844 0.000000 9 0 1 3.65979e-10\n", "\n", " ========== Varying R2 net downward from 61.15 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.400717 0.259767 0.259767 0.005865 0.047144 2 0 0.759 9.88142e-09\n", " 2 0.961683 0.403076 0.143309 -0.015632 0.013534 5 0 0.809 9.88142e-09\n", " 3 1.497588 0.503522 0.100446 -0.021859 0.005349 1 0 0.76 9.88142e-09\n", " 4 2.225975 0.614464 0.110943 -0.038871 0.001034 10 0 1 9.88142e-09\n", " 5 2.951371 0.707698 0.0932337 -0.033971 0.000000 11 0 0.989 3.29381e-09\n", " 6 3.688137 0.79167 0.0839715 -0.026450 0.005076 2 0 1 3.29381e-09\n", " 7 4.408092 0.86774 0.07607 -0.035817 0.012520 13 0 1 1.09794e-09\n", "\n", " ========== Varying R2 exch upward from 49.85 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.655792 1.75246 1.75246 -0.090681 0.021818 3 0 1 9.88142e-09\n", " 2 1.365163 2.54916 0.796708 -0.055353 0.003568 2 0 1 3.29381e-09\n", " 3 2.076718 3.16658 0.617412 -0.056240 0.000498 2 0 1 1.09794e-09\n", " 4 2.786908 3.69248 0.5259 -0.057975 0.000126 2 0 1 3.65979e-10\n", " 5 3.499706 4.16062 0.468143 -0.055460 0.000034 9 0 1 1.21993e-10\n", " 6 3.538924 4.18505 0.0244282 -0.001988 0.000686 5 0 0.0572 4.06643e-11\n", " 7 4.256895 4.60873 0.423679 -0.050321 0.000000 1 0 1 4.06643e-11\n", "\n", " ========== Varying R2 exch downward from 49.85 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.040027 0.425982 0.425982 -0.003053 0.002419 11 0 0.243 9.88142e-09\n", " 2 0.253571 1.00613 0.580152 -0.009291 0.000348 1 0 0.46 9.88142e-09\n", " 3 0.988168 1.89255 0.886413 -0.033090 0.000604 1 0 1 9.88142e-09\n", " 4 1.724774 2.45808 0.565537 -0.031652 0.000034 1 0 1 3.29381e-09\n", " 5 2.461663 2.90638 0.448299 -0.031403 0.000000 1 0 1 1.09794e-09\n", " 6 3.199023 3.2883 0.381922 -0.030865 0.000066 1 0 1 3.65979e-10\n", " 7 3.935789 3.62597 0.337663 -0.031526 0.000000 1 0 1 1.21993e-10\n", "\n", " ========== Varying R4 upward from 19.42 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.355862 0.16074 0.16074 0.002414 0.043132 8 0 0.719 9.88142e-09\n", " 2 1.077407 0.280094 0.119355 -0.031781 0.014966 11 0 1 9.88142e-09\n", " 3 1.809057 0.362946 0.0828514 -0.033713 0.002929 2 0 1 3.29381e-09\n", " 4 2.543757 0.430852 0.0679058 -0.032610 0.000981 10 0 1 1.09794e-09\n", " 5 3.275071 0.489761 0.0589089 -0.036697 0.000280 10 0 1 3.65979e-10\n", " 6 3.321450 0.493826 0.00406522 0.000546 0.010633 10 0 0.0773 1.21993e-10\n", " 7 3.376941 0.497548 0.00372172 0.006055 0.002324 11 0 0.0708 1.21993e-10\n", " 8 3.425789 0.501173 0.00362591 0.001900 0.004108 8 0 0.0698 1.21993e-10\n", " 9 3.477358 0.50468 0.00350684 0.001989 0.000134 1 0 0.0679 1.21993e-10\n", " 10 4.208963 0.556197 0.0515164 -0.036148 0.000538 11 0 1 1.21993e-10\n", "\n", " ========== Varying R4 downward from 19.42 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.694953 0.217096 0.217096 -0.007211 0.023116 5 0 0.972 9.88142e-09\n", " 2 1.451063 0.313258 0.0961621 -0.011916 0.000265 1 0 1 9.88142e-09\n", " 3 2.204853 0.377803 0.0645456 -0.014348 0.000154 10 0 1 3.29381e-09\n", " 4 2.957479 0.429872 0.0520682 -0.015583 0.000083 11 0 1 1.09794e-09\n", " 5 3.709188 0.474717 0.0448453 -0.016416 0.000167 9 0 1 3.65979e-10\n", " 6 4.461267 0.514699 0.0399826 -0.016025 0.000188 8 0 1 1.21993e-10\n", "\n", " ========== Varying R5 upward from 80.57 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.754751 0.178404 0.178404 0.012833 0.026374 11 0 1 9.88142e-09\n", " 2 1.510010 0.253403 0.0749992 -0.008718 0.004315 12 0 1 3.29381e-09\n", " 3 2.024710 0.29369 0.0402868 -0.004239 0.002605 4 0 0.701 1.09794e-09\n", " 4 2.792842 0.34471 0.0510205 -0.000043 0.000116 1 0 1 1.09794e-09\n", " 5 3.560295 0.388088 0.0433775 -0.000789 0.000050 1 0 1 3.65979e-10\n", " 6 4.327208 0.426484 0.0383967 -0.001359 0.000020 1 0 1 1.21993e-10\n", "\n", " ========== Varying R5 downward from 80.57 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.745374 0.178537 0.178537 0.001932 0.024850 2 0 1 9.88142e-09\n", " 2 1.500599 0.253168 0.0746316 -0.009236 0.003831 8 0 1 3.29381e-09\n", " 3 2.243867 0.310409 0.0572408 -0.015132 0.009892 11 0 1 1.09794e-09\n", " 4 2.779080 0.344793 0.0343838 0.005914 0.002910 5 0 0.708 3.65979e-10\n", " 5 2.963252 0.356035 0.0112424 -0.002741 0.000000 10 0 0.255 3.65979e-10\n", " 6 3.722591 0.398899 0.0428638 -0.007937 0.001015 5 0 1 3.65979e-10\n", " 7 4.480816 0.437568 0.0386684 -0.009390 0.000676 10 0 1 1.21993e-10\n", "\n", " ========== Varying B pool upward from 100 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.768378 0.0131457 0.0131457 0.000092 0.000007 1 0 1 9.88142e-09\n", " 2 1.536713 0.0185907 0.00544498 0.000045 0.000002 1 0 1 3.29381e-09\n", " 3 2.305045 0.0227688 0.00417809 0.000040 0.000000 1 0 1 1.09794e-09\n", " 4 3.073376 0.0262911 0.0035223 0.000039 0.000000 1 0 1 3.65979e-10\n", " 5 3.841705 0.0293943 0.00310321 0.000038 0.000000 1 0 1 1.21993e-10\n", "\n", " ========== Varying B pool downward from 100 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.768306 0.0131456 0.0131456 0.000019 0.000004 1 0 1 9.88142e-09\n", " 2 1.536660 0.0185906 0.00544498 0.003021 0.002959 12 0 1 3.29381e-09\n", " 3 2.304970 0.0227687 0.00417809 0.000018 0.000000 1 0 1 1.09794e-09\n", " 4 3.075278 0.026291 0.0035223 0.002615 0.000598 12 0 1 3.65979e-10\n", " 5 3.843587 0.0293942 0.0031032 0.000017 0.000000 11 0 1 1.21993e-10\n", "\n", " ========== Varying C pool upward from 1.088 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.062401 0.424544 0.424544 0.025503 0.006728 1 0 0.237 9.88142e-09\n", " 2 1.157927 1.63827 1.21373 0.475314 0.148081 5 0 1 9.88142e-09\n", " 3 2.067374 2.13973 0.501451 0.157436 0.016281 5 0 1 1.00135e-08\n", " 4 2.962081 2.526 0.386279 0.136967 0.010552 4 0 1 7.95522e-09\n", " 5 3.845004 2.85128 0.325278 0.120845 0.006214 2 0 1 5.8359e-09\n", "\n", " ========== Varying C pool downward from 1.088 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.366521 1.08825 1.08825 0.105858 0.021167 1 0 0.606 9.88142e-09\n", "\n", " ========== Varying D pool upward from 1.136 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.650722 0.707908 0.707908 0.191529 0.023452 1 0 0.793 9.88142e-09\n", " 2 1.529677 1.03607 0.328162 0.114525 0.003861 1 0 1 9.88142e-09\n", " 3 2.386104 1.24317 0.207096 0.090352 0.002217 1 0 1 6.46484e-09\n", " 4 3.237277 1.40838 0.165208 0.084799 0.001918 1 0 1 3.57286e-09\n", " 5 4.085773 1.55005 0.141676 0.081959 0.001755 1 0 1 1.88222e-09\n", "\n", " ========== Varying D pool downward from 1.136 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.114740 0.286824 0.286824 0.042387 0.008584 1 0 0.323 9.88142e-09\n", " 2 1.277177 0.870987 0.584162 0.455712 0.061566 1 0 1 9.88142e-09\n", " 3 2.260803 1.13548 0.264492 0.227337 0.012003 1 0 1 9.94531e-09\n", " 4 2.299622 1.13639 0.000909441 0.036193 0.000548 1 0 0.00446 9.26885e-09\n", "\n", " ========== Varying E pool upward from 0.7071 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.877125 6.10247 6.10247 0.155340 0.046507 12 0 1 9.88142e-09\n", " 2 1.209838 7.1837 1.08122 0.019435 0.000905 1 0 0.448 7.7934e-09\n", " 3 1.979379 9.24119 2.05749 0.004022 0.002772 1 0 1 7.7934e-09\n", " 4 2.742069 10.8507 1.60955 -0.004132 0.001470 1 0 1 2.5978e-09\n", " 5 3.500968 12.2294 1.37864 -0.008475 0.000918 1 0 1 8.65934e-10\n", " 6 4.257429 13.4615 1.23214 -0.011211 0.000620 1 0 1 2.88645e-10\n", "\n", " ========== Varying E pool downward from 0.7071 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.012546 0.707109 0.707109 0.003231 0.001103 1 0 0.116 9.88142e-09\n", "\n", " ========== Varying F pool upward from 100 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.768288 0.0131468 0.0131468 0.000017 0.000022 1 0 1 9.88142e-09\n", " 2 1.536581 0.0185923 0.00544553 0.000002 0.000000 0 0 1 3.29381e-09\n", " 3 2.304878 0.0227708 0.0041785 0.000005 0.000000 0 0 1 1.09794e-09\n", " 4 3.073178 0.0262935 0.00352264 0.000008 0.000000 0 0 1 3.65979e-10\n", " 5 3.841478 0.029397 0.00310351 0.000009 0.000000 0 0 1 1.21993e-10\n", "\n", " ========== Varying F pool downward from 100 ==========\n", "\n", " Delta Delta Predictor Corrector Corrector Failed\n", " Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n", " 1 0.768329 0.0131468 0.0131468 0.000037 0.000000 1 0 1 9.88142e-09\n", " 2 1.536693 0.0185923 0.00544553 0.003440 0.003367 12 0 1 3.29381e-09\n", " 3 2.304997 0.0227708 0.0041785 0.000012 0.000000 1 0 1 1.09794e-09\n", " 4 3.075355 0.0262934 0.00352264 0.003247 0.001181 12 0 1 3.65979e-10\n", " 5 3.843608 0.0293969 0.0031035 -0.000038 0.000000 11 0 1 1.21993e-10\n", "\n", "\tContinuation completed in 48.3100 seconds.\n", "\n", "\tPreprocessing time: 0.9300 s\n", "\n", "\tComputation time: 47.3800 s\n", "\n", "\tSimulation completed in 0.9100 seconds.\n", "\n", "\tPreprocessing time: 0.0700 s\n", "\n", "\tComputation time: 0.8100 s\n", "\n", "\tPostprocessing time: 0.0300 s\n", "\n" ] } ], "source": [ "%%capture\n", "import dotenv\n", "inca_directory = pathlib.Path(dotenv.get_key(dotenv.find_dotenv(), \"INCA_base_directory\"))\n", "incawrapper.run_inca(script, INCA_base_directory=inca_directory)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We can now read the results from INCA using the `INCAResults` object." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "res = incawrapper.INCAResults(output_file)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Typically, the first thing we want to inspect is the goodness of fit. This can be accessed as follows" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fit accepted: False\n", "Confidence level: 0.05\n", "Chi-square value (SSR): 0.016653922841033397\n", "Expected chi-square range: [17.53873858 48.23188959]\n" ] } ], "source": [ "res.fitdata.get_goodness_of_fit()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We see that the SSR value is below the expected range, thus this indicate that we are overfitting the data. However, in this scenario it is not surprising, because we used the exact simulated values with out measurement noise.\n", "\n", "We can inspect the flux estimates as follows" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
typeideqnvalstdlbubunitfreealfchi2scontcorcovvalsbase
0Net fluxR1A -> B99.9922770.19025199.51167100.479345[]00.05[4.570265356139303, 3.793349715129606, 3.09763...0[1.0, -0.15515765338290124, 0.0203688527219357...[0.036195387046629834, -0.008826206497164618, ...[99.46957072161385, 99.515709324456, 99.561683...{'id': []}
1Net fluxR2 netB <-> D61.1507080.29900260.34235561.896734[]10.05[4.424745896389132, 3.7047908218400725, 2.9680...0[-0.15515765338299395, 1.0000000000000002, -0....[-0.008826206497169892, 0.0894022682485085, -0...[60.282968518148586, 60.359038522070044, 60.44...{'id': []}
2Exch fluxR2 exchB <-> D49.8494561.73610546.26428854.217439[]10.05[3.952443057055, 3.2156770572216344, 2.4783166...0[0.020368852719712092, -0.05313916272317603, 1...[0.006727739232202212, -0.02758448914464573, 3...[46.22348883339175, 46.56115197844941, 46.9430...{'id': []}
3Net fluxR3B -> C + E19.4207840.18924218.93869819.950753[]10.05[4.477920913249516, 3.7258415870429094, 2.9741...0[0.6252401109640534, -0.8679919809953349, 0.05...[0.022510796771899863, -0.04911423737283656, 0...[18.906085016756712, 18.946067593473966, 18.99...{'id': []}
4Net fluxR4B + C -> D + E + E19.4207840.18924218.93869819.950753[]00.05[4.477920913249516, 3.7258415870429094, 2.9741...0[0.6252401109640534, -0.8679919809953349, 0.05...[0.022510796771899863, -0.04911423737283656, 0...[18.906085016756712, 18.946067593473966, 18.99...{'id': []}
5Net fluxR5D -> F80.5714930.16427580.1662780.97421[]00.05[4.497470340629002, 3.7392448695467877, 2.9799...0[0.43785814143479984, 0.8202193590233617, -0.0...[0.013684590274729971, 0.04028803087567194, -0...[80.13392503277558, 80.17259342556605, 80.2154...{'id': []}
\n", "
" ], "text/plain": [ " type id eqn val std lb \\\n", "0 Net flux R1 A -> B 99.992277 0.190251 99.51167 \n", "1 Net flux R2 net B <-> D 61.150708 0.299002 60.342355 \n", "2 Exch flux R2 exch B <-> D 49.849456 1.736105 46.264288 \n", "3 Net flux R3 B -> C + E 19.420784 0.189242 18.938698 \n", "4 Net flux R4 B + C -> D + E + E 19.420784 0.189242 18.938698 \n", "5 Net flux R5 D -> F 80.571493 0.164275 80.16627 \n", "\n", " ub unit free alf \\\n", "0 100.479345 [] 0 0.05 \n", "1 61.896734 [] 1 0.05 \n", "2 54.217439 [] 1 0.05 \n", "3 19.950753 [] 1 0.05 \n", "4 19.950753 [] 0 0.05 \n", "5 80.97421 [] 0 0.05 \n", "\n", " chi2s cont \\\n", "0 [4.570265356139303, 3.793349715129606, 3.09763... 0 \n", "1 [4.424745896389132, 3.7047908218400725, 2.9680... 0 \n", "2 [3.952443057055, 3.2156770572216344, 2.4783166... 0 \n", "3 [4.477920913249516, 3.7258415870429094, 2.9741... 0 \n", "4 [4.477920913249516, 3.7258415870429094, 2.9741... 0 \n", "5 [4.497470340629002, 3.7392448695467877, 2.9799... 0 \n", "\n", " cor \\\n", "0 [1.0, -0.15515765338290124, 0.0203688527219357... \n", "1 [-0.15515765338299395, 1.0000000000000002, -0.... \n", "2 [0.020368852719712092, -0.05313916272317603, 1... \n", "3 [0.6252401109640534, -0.8679919809953349, 0.05... \n", "4 [0.6252401109640534, -0.8679919809953349, 0.05... \n", "5 [0.43785814143479984, 0.8202193590233617, -0.0... \n", "\n", " cov \\\n", "0 [0.036195387046629834, -0.008826206497164618, ... \n", "1 [-0.008826206497169892, 0.0894022682485085, -0... \n", "2 [0.006727739232202212, -0.02758448914464573, 3... \n", "3 [0.022510796771899863, -0.04911423737283656, 0... \n", "4 [0.022510796771899863, -0.04911423737283656, 0... \n", "5 [0.013684590274729971, 0.04028803087567194, -0... \n", "\n", " vals base \n", "0 [99.46957072161385, 99.515709324456, 99.561683... {'id': []} \n", "1 [60.282968518148586, 60.359038522070044, 60.44... {'id': []} \n", "2 [46.22348883339175, 46.56115197844941, 46.9430... {'id': []} \n", "3 [18.906085016756712, 18.946067593473966, 18.99... {'id': []} \n", "4 [18.906085016756712, 18.946067593473966, 18.99... {'id': []} \n", "5 [80.13392503277558, 80.17259342556605, 80.2154... {'id': []} " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "estimated_fluxes = res.fitdata.fitted_parameters.query(\"type.str.contains('flux')\")\n", "estimated_fluxes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we will compare the estimated fluxes to the know simulated fluxes. This is off course only possible because we use simulated data." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# import true parameter values\n", "true_fluxes = pd.read_csv(data_folder / 'simulated_data' / \"true_fluxes.csv\")\n", "true_pool_sizes = pd.read_csv(data_folder / 'simulated_data' / \"true_pool_sizes.csv\")" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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WrNnz1aXLl1UVlamJk2aHNf4PPLII3r66aeVlJQkSYqLi9OGDRs0Z84cDR069Lj6xIlpEGfxjB8/XqWlpa6loKDAY31HRkZKkjYdZvumg9oBwImombU9HNNAZm2//fZbVVVVKT4+Xk2aNHEtGRkZ2rJliyRp48aN6tq1q9v9EhISjthvixYtdOWVV2rBggWS9s/MZ2VlKTk52dUmJydH1157rVq2bKmmTZvq0ksvlbQ/NB2P3bt3a8uWLRo2bJjbY5kyZYrrsaD+eXQGpSZdFxcXu72gFxcX6/zzz3e12blzp9v99u3bp99+++2wqd5ut8tut3uyVJcePXooOjpaa7dv17PG6MD3NKmS1tpsiomOdiV5ADgRdZ2NtfqsbVlZmfz9/ZWTk1Nrpud4ZzFqJCcn67777tOzzz6rhQsX6txzz9W5554raX+Y6N27t3r37q0FCxaoRYsWys/PV+/evVVZWXnI/vz8/GrNWO3du9ftsUjSvHnzagUqT85i4dh4dAYlLi5OERERWr58uWud0+lUdna2KzUnJCSopKREOTk5rjafffaZqqura/3HqA/+/v6aNWuWJOmfNpu6SrpJUldJD/05nThz5kz+kwLwiLrOxvpq1jYoKKjW2USHWtepUydVVVVp586datu2rdtS82azQ4cOtY4tXLNmzVFr6Nu3r8rLy7Vs2TItXLjQbfbkhx9+0K+//qrp06erR48eat++fa03vQdr0aKFioqK3ELKunXrXD+Hh4crKipKP/30U63HEhcXd9R64SXHenTurl27zNdff22+/vprI8k888wz5uuvvzY///yzMcaY6dOnm7CwMPPee++Zb775xvTt29fExcW5Hc3bp08f06lTJ5OdnW1WrVpl2rVrZwYPHlznGjx5Fk+NQx1RHxMT47Uj6gE0TCd6Fk/NmYM2m63W2THy8pmDhzpz5cCzeIwx5oorrjB///vfzbZt28wvv/xijDHmiy++MJLMp59+an755Reze/duY4wxycnJJjY21ixevNj89NNPJjs720ybNs0sXbrUGGNMVlaW8fPzM08++aTZtGmTefbZZ01YWNgRz+KpkZycbM477zxjs9lcry/G7D+jJygoyDzwwANmy5Yt5r333jPx8fFGkvn666+NMbXP4tmwYYOx2Wxm+vTp5scffzTPPfecOe2009zGYt68eSY4ONjM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lZWVudZ9/PHH2rNnj2vcd+/erdGjR+urr77S8uXL5efnp+uuu07V1dV1Gs9DyczM1M0336yRI0dqw4YNmjNnjl599VVNnTr1uPusk6NGmOOQkJBgLr30UrN9+3azb98+8/rrrxs/Pz8THx9vvvjiCyPJ7Nixw+0+AwcOrJUMa5SXl5vS0lLXUlBQwAwKAJ9oqDMoxhz5b3ONN99807z33nvmm2++MUuWLDEdOnQwXbp0Mfv27TPG7H/H/o9//MPExsaaCy+80GRmZppff/3VtG7d2uTn55uHHnrItGnTxlx55ZVm27Zth6yjuLjYSDLPPPPMUWs+2gxK9+7dzR133OG2buDAgebqq6923e7bt+8hZ04OdKhZg4Nnkw5Vy4oVK2rNepSXl5vGjRub1atXu7UdNmyYGTx4sDHGmPHjx5uzzz7bbfuDDz54xBmUvXv3mtNPP91thmjw4MHm+uuvP+zj+uWXX4wk8+233xpjjm8G5fLLLzfTpk1za/P666+byMjIQ+7TsjMokvT666/LGKMzzzxTdrtds2fP1uDBg+Xnd3y7S01NlcPhcC0xMTEerhgATn51+dt8ww036O9//7vOPfdc9evXT0uXLtXatWu1cuVKSVJgYKCef/555eXlae3atbrkkkt0//3367777tPXX3+td999V+vXr1e3bt103333HbIO8+cBsJ6wceNGXXzxxW7rLr74Ym3cuNFj+zhWP/74o/bs2aMrrrhCTZo0cS2vvfaa61iXjRs3qmvXrm73S0hIOGK/AQEBGjRokBYsWCBp/2zJe++9p+TkZFebzZs3a/DgwWrdurVCQ0MVGxsrScrPzz/ux7N+/Xo99thjbo+lZiZpz549x93v0XjlINk2bdooIyNDu3fvltPpVGRkpK6//nq1bt1aERERkqTi4mJFRka67lNcXKzzzz//kP2NHz9eo0ePdt12Op2EFAA4Rkf623w4rVu31umnn64ff/xRl19+ea3tK1as0Pfff69//etfeuCBB3T11VcrJCREgwYN0nPPPXfIPlu0aKGwsDD98MMPHntsVlLzEcwHH3zgdvCxdOIH3iYnJ+vSSy/Vzp079cknnyg4ONjtLKtrr71WrVq10rx58xQVFaXq6mqdc845qqysPGR/fn5+tQLj3r17az2eSZMmKSkpqdb9vXlii1evgxISEqLIyEj9/vvv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0+OPPy5Jqqys1MCBA5WQkKCXX37Zx9X63tHG64cfflB1dbXmzJmjtm3b6rvvvtMdd9yh3bt366mnnvJx9dbEmDY8R/ud9erVS//85z8VGRmp7du3a8yYMRowYIBWr17t48obnqONdY2xY8cqKipK69ev91GlDVtdxvmxxx7THXfc4brdtGnT+inOnIKGDh1q+vbt67YuKSnJdOrUqVbbtLQ043A46qcwizqW8TrQE088YeLi4o7YRpKZN2+e6devnwkODjZt27Y17733nlubb7/91vTp08eEhISYM844wwwZMsT88ssvrtokuS15eXnH/BjrmzfH9PfffzfDhg0zp59+umnatKnp1auXWbdunTHGmJ07d5rw8HAzdepUV/svvvjCBAYGmk8//dQYY0xVVZV5/PHHTZs2bUxQUJCJiYkxU6ZMMcYYk5eXZySZxYsXm549e5rg4GDTsWNHs3r16mMdggbneH5n7733nrHZbKaystLL1Z1c6jrWH374oWnfvr35/vvvjSTz9ddf11+RJ4G6jHOrVq3MjBkz6rewP52SH/Ec7LvvvtPq1asVFBTk61IahLqOV2lpqZo1a3bU/iZNmqRBgwbpm2++0dVXX63k5GT99ttvkqSSkhJddtll6tSpk7766istW7ZMxcXFGjRokCRp1qxZSkhI0B133KHCwkIVFhY2yG+59uSYDhw4UDt37tRHH32knJwcXXDBBbr88sv122+/qUWLFnrllVf06KOP6quvvtKuXbt000036Z577tHll18uSRo/frymT5+uCRMmaMOGDVq4cKHCw8Pd9vHQQw9pzJgxWrduneLj4zV48GDt27fvxAahgTna7+y3337TggUL1L17dwUGBtZzdSeXQ411cXGx7rjjDr3++utq3LixD6s7eRzu//T06dPVvHlzderUSU8++WT9Pdd9Eot8bOjQocbf39+EhIQYu91uJBk/Pz+zaNGiWm2ZQTm28aqxefNmExoaaubOnXvEviWZhx9+2HW7rKzMSDIfffSRMcaYyZMnmyuvvNLtPgUFBUaSyc3NNcYYc+mll5qRI0ce56PzDW+NaWZmpgkNDTXl5eVu69u0aWPmzJnjuv2Pf/zDxMfHmxtvvNGce+65rvZOp9PY7XYzb968Q/ZfM4Pyr3/9y7Wu5t3rxo0b6/TYG6q6/s7Gjh1rGjdubCSZbt26mf/7v//zUcUN19HGurq62vTp08dMnjzZGPO//5fMoBybuvyffvrpp82KFSvM+vXrzYsvvmjCwsLMqFGj6qW+U/YYlF69eunFF1/U7t27NWPGDAUEBKh///6+LsuyjmW8tm/frj59+mjgwIFun1seTseOHV0/h4SEKDQ0VDt37pQkrV+/XitWrFCTJk1q3W/Lli2Kj48/zkfke94Y0/Xr16usrEzNmzd3W//HH39oy5YtrttPPfWUzjnnHL3zzjvKyclxXc5648aNqqiocM2mHM6Bv7PIyEhJ0s6dO9W+ffsjP+gGri6/swceeEDDhg3Tzz//rEmTJunmm2/W0qVLZbPZfFR1w3SksX722We1a9cujR8/3sdVNnxH+z89evRo188dO3ZUUFCQ7rrrLqWmpnr9MvinbEAJCQlR27ZtJUmvvPKKzjvvPL388ssaNmyYjyuzprqO144dO9SrVy91795dc+fOrVPfB09/22w2VVdXS5LKysp07bXX1jowTvrfC2ND5Y0xLSsrU2RkpFauXFlr24Fno23ZskU7duxQdXW1tm7dqnPPPVeSFBwcXKfaD/yd1bzw1vzOTmZ1+Z2dfvrpOv300xUfH68OHTooJiZGa9asUUJCgq/KbpCONNafffaZsrKyar1AXnjhhUpOTtb8+fN9UXKDdKyvhV27dtW+ffu0detWnXXWWV6tjWNQJPn5+emf//ynHn74Yf3xxx++LsfyDjde27dvV8+ePdW5c2elpaXJz+/E/3tdcMEF+v777xUbG6u2bdu6LSEhIZKkoKAgVVVVnfC+fMlTY3rBBReoqKhIAQEBtcbr9NNPl7T/DLUhQ4bo+uuv1+TJk3X77be7ZqzatWun4OBgLV++3HsP9iRRl78bNaGtoqKiPks76Rw81rNnz9b69eu1bt06rVu3Th9++KEk6e2339bUqVN9XG3DVZf/0+vWrZOfn5/OOOMM79fj9T00EAMHDpS/v7+ef/55SVJ+fr7WrVun/Px8VVVVuZ4IZWVlPq7UGg4er5oX0pYtW+qpp57SL7/8oqKiIhUVFZ3QfkaMGKHffvtNgwcP1tq1a7VlyxZ9/PHHuvXWW12hJDY2VtnZ2dq6dav+7//+r8G+k/fEmCYmJiohIUH9+vXT//t//09bt27V6tWr9dBDD+mrr76StP8A19LSUs2ePVsPPvig4uPjddttt0mSGjVqpAcffFBjx47Va6+9pi1btmjNmjWcan8YB/7OsrOz9dxzz2ndunX6+eef9dlnn2nw4MFq06YNsycecOBYt2zZUuecc45rqfmot02bNoqOjvZxpQ3bgeOclZWlmTNnav369frpp5+0YMECjRo1SkOGDNFpp53m/WLq5UgXiznUqVXGGJOammpatGhhysrKDnn6qiSzYsWKeq/X1+oyXmlpaYccr6P9F5NklixZ4rbO4XCYtLQ01+1NmzaZ6667zoSFhZng4GDTvn17k5KSYqqrq40xxuTm5ppu3bqZ4ODgBn2asTGeGVOn02nuvfdeExUVZQIDA01MTIxJTk42+fn5ZsWKFSYgIMBkZma62ufl5ZnQ0FDzwgsvGGP2n2Y8ZcoU06pVKxMYGGhatmxppk2b5mqrgw5G/P3330+J58bRfmfr1q0zvXr1Ms2aNTN2u93Exsaau+++22zbtq3+i23g6vL8OBAHyR6fo43zqlWrTNeuXY3D4TCNGjUyHTp0MNOmTat1EL632IwxxvsxCAAAoO74iAcAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFgOAQUAAFjO/weqyebb60M59wAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "errbars = estimated_fluxes[['lb', 'ub']].subtract(estimated_fluxes['val'], axis=0).abs().T\n", "ax.errorbar(x=estimated_fluxes['id'], y=estimated_fluxes['val'], yerr=errbars, color='black', fmt='none', label='95% CI of fitted value')\n", "ax.scatter(x=estimated_fluxes['id'], y=estimated_fluxes['val'], color='black', label='fitted value')\n", "ax.scatter(x=true_fluxes['rxn_id'], y=true_fluxes['flux'], color='red', label='True flux', s=10)\n", "ax.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that INCAWrapper and INCA was able to obtain unbiased estimates of the true fluxes using INST 13C-MFA. The R2 exchange flux still has some uncertainty, but it is common for exchange fluxes not to be well determined [3]. Lets also inspect the numerical values of the fitted and true fluxes." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
typeideqntrue_fluxfitted_fluxstdlbub
0Net fluxR1A -> B100.00099.9920.19099.51167100.479345
1Net fluxR2 netB <-> D61.13261.1510.29960.34235561.896734
2Exch fluxR2 exchB <-> D49.80649.8491.73646.26428854.217439
3Net fluxR3B -> C + E19.43419.4210.18918.93869819.950753
4Net fluxR4B + C -> D + E + E19.43419.4210.18918.93869819.950753
5Net fluxR5D -> F80.56680.5710.16480.1662780.97421
\n", "
" ], "text/plain": [ " type id eqn true_flux fitted_flux std \\\n", "0 Net flux R1 A -> B 100.000 99.992 0.190 \n", "1 Net flux R2 net B <-> D 61.132 61.151 0.299 \n", "2 Exch flux R2 exch B <-> D 49.806 49.849 1.736 \n", "3 Net flux R3 B -> C + E 19.434 19.421 0.189 \n", "4 Net flux R4 B + C -> D + E + E 19.434 19.421 0.189 \n", "5 Net flux R5 D -> F 80.566 80.571 0.164 \n", "\n", " lb ub \n", "0 99.51167 100.479345 \n", "1 60.342355 61.896734 \n", "2 46.264288 54.217439 \n", "3 18.938698 19.950753 \n", "4 18.938698 19.950753 \n", "5 80.16627 80.97421 " ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fitted_and_true_fluxes = (\n", " estimated_fluxes\n", " .merge(true_fluxes, left_on=\"id\", right_on=\"rxn_id\")\n", " .rename(columns={\"val\": \"fitted_flux\", \"flux\": \"true_flux\"})\n", ")\n", "fitted_and_true_fluxes[['type', 'id', 'eqn', 'true_flux', 'fitted_flux', 'std', 'lb', 'ub']].round(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again here we see that the incawrapper (and INCA) finds a good estimate of the true flux distribution." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## References\n", "[1] M. R. Antoniewicz, J. K. Kelleher, and G. Stephanopoulos, “Determination of confidence intervals of metabolic fluxes estimated from stable isotope measurements,” Metabolic Engineering, vol. 8, no. 4, pp. 324–337, Jul. 2006, doi: 10.1016/j.ymben.2006.01.004.\n", "\n", "[2] M. R. Antoniewicz, J. K. Kelleher, and G. Stephanopoulos, “Elementary metabolite units (EMU): A novel framework for modeling isotopic distributions,” Metabolic Engineering, vol. 9, no. 1, pp. 68–86, Jan. 2007, doi: 10.1016/j.ymben.2006.09.001.\n", "\n", "[3] W. Wiechert and K. Nöh, “Quantitative Metabolic Flux Analysis Based on Isotope Labeling,” in Metabolic Engineering, 1st ed., J. Nielsen, G. Stephanopoulos, and S. Y. Lee, Eds., Wiley, 2021, pp. 73–136. doi: 10.1002/9783527823468.ch3.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "bfair-testing", "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.10.8" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "820c70ec08a0eb018d8ec3c5d089748cbb2d1e243fbedf0a7cbeb7c8948c3b84" } } }, "nbformat": 4, "nbformat_minor": 2 }