{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Markov Transition Probability Check and Transform\n\nIn this example, use several markov transition matrixes where each row does not\nsum up to 1 due to simulation errors. Check if the gap between 1 and the row\nvalues are too big, and then normalize.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Author: Fan Wang (fanwangecon.github.io)\nimport pyfan.stats.markov.transprobcheck as pyfan_stats_transprobcheck\nimport numpy as np\nimport matplotlib.pyplot as plt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Check Row Sum of a Five by Five Transition matrix\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# construct data inputs\nmt_ar1_trans = np.array([[0.4334, 0.5183, 0.0454, 0.0027, 0.0002],\n                         [0.2624, 0.5967, 0.1245, 0.0145, 0.0016],\n                         [0.1673, 0.5918, 0.2005, 0.0343, 0.0052],\n                         [0., 0.0312, 0.6497, 0.2774, 0.0371],\n                         [0., 0.0681, 0.6569, 0.2379, 0.0327],\n                         [0., 0.2201, 0.581, 0.168, 0.0264]])\nar_row_sums_ar1 = np.sum(mt_ar1_trans, axis=1)\nprint(f'{ar_row_sums_ar1=}')\n\n# Check with default conditions, does not pass\nbl_ar1_sum_pass, bl_per_row_pass, bl_avg_row_pass = \\\n    pyfan_stats_transprobcheck.markov_trans_prob_check(mt_ar1_trans)\nprint(f'{bl_ar1_sum_pass=}')\nprint(f'{bl_per_row_pass=}')\nprint(f'{bl_avg_row_pass=}')\n\n# Check with relaxed conditions, pass per row does not pass average\nfl_atol_per_row = 1e-02\nfl_atol_avg_row = 1e-03\nbl_ar1_sum_pass, bl_per_row_pass, bl_avg_row_pass = \\\n    pyfan_stats_transprobcheck.markov_trans_prob_check(mt_ar1_trans, fl_atol_per_row, fl_atol_avg_row)\nprint(f'{bl_ar1_sum_pass=}')\nprint(f'{bl_per_row_pass=}')\nprint(f'{bl_avg_row_pass=}')\n\n# Relax condition further, passes\nfl_atol_per_row = 1e-02\nfl_atol_avg_row = 5e-03\nbl_ar1_sum_pass, bl_per_row_pass, bl_avg_row_pass = \\\n    pyfan_stats_transprobcheck.markov_trans_prob_check(mt_ar1_trans, fl_atol_per_row, fl_atol_avg_row)\nprint(f'{bl_ar1_sum_pass=}')\nprint(f'{bl_per_row_pass=}')\nprint(f'{bl_avg_row_pass=}')\n\n# Start Plot\nfig, ax = plt.subplots()\n\n# Text Plot\nax.text(0.5, 0.5, f'{mt_ar1_trans} '\n                  f'\\n\\n {fl_atol_per_row=} and {fl_atol_avg_row=} '\n                  f'\\n\\n {bl_ar1_sum_pass=} \\n {bl_per_row_pass=} \\n {bl_avg_row_pass=}',\n        horizontalalignment='center',\n        verticalalignment='center',\n        fontsize=10, color='black',\n        transform=ax.transAxes)\n\n# Labeling\nax.set_axis_off()\nplt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Rescale a Three by Three Transition so Each Row Sums to One\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "mt_ar1_trans = np.array([[0.4334, 0.5183, 0.0454], [0.2624, 0.5967, 0.1245], [0.1673, 0.5918, 0.2005]])\nbl_ar1_sum_pass, bl_per_row_pass, bl_avg_row_pass = pyfan_stats_transprobcheck.markov_trans_prob_check(mt_ar1_trans)\nmt_ar1_trans_rescaled = pyfan_stats_transprobcheck.markov_condi_prob2one(mt_ar1_trans)\nbl_ar1_sum_pass_rescaled, bl_per_row_pass_rescaled, bl_avg_row_pass_rescaled = \\\n    pyfan_stats_transprobcheck.markov_trans_prob_check(mt_ar1_trans_rescaled)\n\n# Start Plot\nfig, ax = plt.subplots()\n\n# Text Plot\nax.text(0.5, 0.5, f'{mt_ar1_trans} '\n                  f'\\n\\n {bl_ar1_sum_pass=}'\n                  f'\\n\\n {mt_ar1_trans_rescaled}' \n                  f'\\n\\n {bl_ar1_sum_pass_rescaled=}',\n        horizontalalignment='center',\n        verticalalignment='center',\n        fontsize=10, color='black',\n        transform=ax.transAxes)\n\n# Labeling\nax.set_axis_off()\nplt.show()"
      ]
    }
  ],
  "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.8.5"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}