{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Prediction (out of sample)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import statsmodels.api as sm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Artificial data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "nsample = 50\n",
    "sig = 0.25\n",
    "x1 = np.linspace(0, 20, nsample)\n",
    "X = np.column_stack((x1, np.sin(x1), (x1-5)**2))\n",
    "X = sm.add_constant(X)\n",
    "beta = [5., 0.5, 0.5, -0.02]\n",
    "y_true = np.dot(X, beta)\n",
    "y = y_true + sig * np.random.normal(size=nsample)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Estimation "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                            OLS Regression Results                            \n",
      "==============================================================================\n",
      "Dep. Variable:                      y   R-squared:                       0.983\n",
      "Model:                            OLS   Adj. R-squared:                  0.982\n",
      "Method:                 Least Squares   F-statistic:                     888.8\n",
      "Date:                Mon, 24 Feb 2020   Prob (F-statistic):           1.03e-40\n",
      "Time:                        22:49:06   Log-Likelihood:                -1.5789\n",
      "No. Observations:                  50   AIC:                             11.16\n",
      "Df Residuals:                      46   BIC:                             18.81\n",
      "Df Model:                           3                                         \n",
      "Covariance Type:            nonrobust                                         \n",
      "==============================================================================\n",
      "                 coef    std err          t      P>|t|      [0.025      0.975]\n",
      "------------------------------------------------------------------------------\n",
      "const          4.8491      0.089     54.642      0.000       4.671       5.028\n",
      "x1             0.5219      0.014     38.134      0.000       0.494       0.549\n",
      "x2             0.4503      0.054      8.369      0.000       0.342       0.559\n",
      "x3            -0.0214      0.001    -17.806      0.000      -0.024      -0.019\n",
      "==============================================================================\n",
      "Omnibus:                        2.777   Durbin-Watson:                   1.657\n",
      "Prob(Omnibus):                  0.249   Jarque-Bera (JB):                1.644\n",
      "Skew:                           0.163   Prob(JB):                        0.440\n",
      "Kurtosis:                       2.174   Cond. No.                         221.\n",
      "==============================================================================\n",
      "\n",
      "Warnings:\n",
      "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n"
     ]
    }
   ],
   "source": [
    "olsmod = sm.OLS(y, X)\n",
    "olsres = olsmod.fit()\n",
    "print(olsres.summary())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## In-sample prediction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 4.31422266  4.78974504  5.22877456  5.60677211  5.90805457  6.1283716\n",
      "  6.2756039   6.36846844  6.43344333  6.50041753  6.5977802   6.7477564\n",
      "  6.96275562  7.24333291  7.57809768  7.94558516  8.31778302  8.66473365\n",
      "  8.95945619  9.18237935  9.32455694  9.38913771  9.39084801  9.35357229\n",
      "  9.30642897  9.27898633  9.29640456  9.37530201  9.52102481  9.72676857\n",
      "  9.97469625 10.23886881 10.48950687 10.69788338 10.84104345 10.90557568\n",
      " 10.88981571 10.80411958 10.66916236 10.51254119 10.36424123 10.25170915\n",
      " 10.19534371 10.20514433 10.27906819 10.40336586 10.55484031 10.7046581\n",
      " 10.82308664 10.88437917]\n"
     ]
    }
   ],
   "source": [
    "ypred = olsres.predict(X)\n",
    "print(ypred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create a new sample of explanatory variables Xnew, predict and plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[10.85680717 10.70864515 10.45755087 10.14376412  9.82025463  9.53975322\n",
      "  9.34184147  9.24326075  9.23381337  9.27885931]\n"
     ]
    }
   ],
   "source": [
    "x1n = np.linspace(20.5,25, 10)\n",
    "Xnew = np.column_stack((x1n, np.sin(x1n), (x1n-5)**2))\n",
    "Xnew = sm.add_constant(Xnew)\n",
    "ynewpred =  olsres.predict(Xnew) # predict out of sample\n",
    "print(ynewpred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ax.plot(x1, y, 'o', label=\"Data\")\n",
    "ax.plot(x1, y_true, 'b-', label=\"True\")\n",
    "ax.plot(np.hstack((x1, x1n)), np.hstack((ypred, ynewpred)), 'r', label=\"OLS prediction\")\n",
    "ax.legend(loc=\"best\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predicting with Formulas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using formulas can make both estimation and prediction a lot easier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from statsmodels.formula.api import ols\n",
    "\n",
    "data = {\"x1\" : x1, \"y\" : y}\n",
    "\n",
    "res = ols(\"y ~ x1 + np.sin(x1) + I((x1-5)**2)\", data=data).fit()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We use the `I` to indicate use of the Identity transform. Ie., we do not want any expansion magic from using `**2`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Intercept           4.849149\n",
       "x1                  0.521925\n",
       "np.sin(x1)          0.450267\n",
       "I((x1 - 5) ** 2)   -0.021397\n",
       "dtype: float64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.params"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we only have to pass the single variable and we get the transformed right-hand side variables automatically"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    10.856807\n",
       "1    10.708645\n",
       "2    10.457551\n",
       "3    10.143764\n",
       "4     9.820255\n",
       "5     9.539753\n",
       "6     9.341841\n",
       "7     9.243261\n",
       "8     9.233813\n",
       "9     9.278859\n",
       "dtype: float64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.predict(exog=dict(x1=x1n))"
   ]
  }
 ],
 "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.2rc2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
