{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# On Combining Two Forecasts\n", "\n", "Assume that we provide two probability distributions (one is yours one is mine) to foreacast two numbers.\n", "The means are respectively (0,0) and (10,10). If a distribution has a higher variance (compared to the other distribution) that means that the owner of the distribution is less confident in her forecast (relative to the other).\n", "\n", "First consider the situation that the **corellation is zero**, then:\n", "1. If we are equally confident in our forecasts then the mean of the concencus distribution is (5,5).\n", "2. If you're four times confident then me, then the mean of the concencus distribution is (2,2).\n", "\n", "> ### What if the corolletion is different from zero?" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "import matplotlib.pyplot as plt\n", "import ipywidgets as widgets\n", "from ipywidgets import interact, interactive, fixed, interact_manual, Layout, HBox, VBox, Box, interactive_output,Label\n", "from ipywidgets import Button\n", "from scipy.stats import norm\n", "import itertools\n", "from scipy.stats import multivariate_normal\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "cartesian = pd.DataFrame()\n", "i = 0\n", "for element in itertools.product(*[[x for x in np.arange(-1,1,0.02)],[x for x in np.arange(-1,1,0.02)]]):\n", " i = i+1\n", " cartesian = cartesian.append(pd.DataFrame(data = list(element),columns=[i]).T)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def pdf_generator(first_cov11,first_cov22,corr1,first_mean1,first_mean2,sec_cov11,sec_cov22,corr2,sec_mean1,sec_mean2):\n", " first_cov12 = corr1*np.sqrt(first_cov11*first_cov22)\n", " first_cov = np.array([[first_cov11, first_cov12], [first_cov12, first_cov22]])\n", " \n", " min_eig = np.min(np.real(np.linalg.eigvals(first_cov)))\n", " if min_eig < 0:\n", " first_cov -= 10*min_eig * np.eye(*first_cov.shape)\n", "\n", " first_mean = np.array([first_mean1, first_mean2])\n", " \n", " sec_cov12 = corr2*np.sqrt(sec_cov11*sec_cov22)\n", "\n", " sec_cov = np.array([[sec_cov11, sec_cov12], [sec_cov12, sec_cov22]])\n", " \n", " min_eig = np.min(np.real(np.linalg.eigvals(sec_cov)))\n", " if min_eig < 0:\n", " sec_cov -= 10*min_eig * np.eye(*sec_cov.shape)\n", " \n", " sec_mean = np.array([sec_mean1, sec_mean2])\n", " \n", " pdf = cartesian.copy()\n", " y = multivariate_normal.pdf(pdf.values, mean=first_mean, cov=first_cov)\n", " z = multivariate_normal.pdf(pdf.values, mean=sec_mean, cov=sec_cov)\n", " pdf['Prior'] = y\n", " pdf['Prior'] = pdf['Prior']/(pdf['Prior'].sum())\n", " \n", " pdf['Likelihood'] = z\n", " pdf['Likelihood'] = pdf['Likelihood']/(pdf['Likelihood'].sum())\n", " \n", " pdf['Posterior'] = z*y\n", " pdf['Posterior'] = pdf['Posterior']/(pdf['Posterior'].sum()) \n", " \n", " dist_prob_first = pdf.pivot(index=0,columns=1,values='Prior')\n", " dist_prob_sec = pdf.pivot(index=0,columns=1,values='Likelihood')\n", " dist_prob_multip = pdf.pivot(index=0,columns=1,values='Posterior')\n", " \n", " plt.figure(figsize=(15,8))\n", " prior = plt.contour(dist_prob_first.index, dist_prob_first.columns, dist_prob_first.values,5,cmap='coolwarm')\n", " plt.clabel(prior, inline=1, fontsize=16)\n", " likely = plt.contour(dist_prob_sec.index, dist_prob_sec.columns, dist_prob_sec.values,5,cmap='coolwarm')\n", " plt.clabel(likely, inline=1, fontsize=16)\n", " post = plt.contour(dist_prob_multip.index, dist_prob_multip.columns, dist_prob_multip.values,5,cmap='coolwarm')\n", " plt.clabel(post, inline=1, fontsize=16)\n", " plt.xlabel('x',fontsize=20)\n", " plt.ylabel('y',fontsize=20)\n", " plt.xticks(fontsize=16)\n", " plt.yticks(fontsize=16)\n", " \n", " \n", " #plt.colorbar()\n", " list_dist = ['Prior','Likelihood','Posterior']\n", "\n", " for i,k in zip(pdf[list_dist].idxmax().values,list_dist):\n", " plt.scatter(pdf.iloc[i][[1]],pdf.iloc[i][[0]],marker=(5,1,0),s=60,color='green')\n", " plt.text(pdf.iloc[i][[1]], pdf.iloc[i][[0]], k, fontsize=16)\n", "\n", " " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "\n", "first_cov11=widgets.FloatSlider(min = 0,max=0.10,step=0.005,value=0.01,continuous_update=False,description='Variance 1')\n", "first_cov22=widgets.FloatSlider(min = 0,max=1,step=0.005,value=0.02,continuous_update=False,description='Variance 2')\n", "corr1=widgets.FloatSlider(min = -1,max=1,step=0.1,value=0.01,continuous_update=False,description='Correlation')\n", "first_mean1=widgets.FloatSlider(min = -2,max=3,step=0.1,value=-0.5,continuous_update=False,description='Mean 1')\n", "first_mean2=widgets.FloatSlider(min = -2,max=3,step=0.1,value=-0.5,continuous_update=False,description='Mean 2')\n", "sec_cov11=widgets.FloatSlider(min = 0,max=0.1,step=0.005,value = 0.01,continuous_update=False,description='Variance 1')\n", "sec_cov22=widgets.FloatSlider(min = 0,max=0.1,step=0.005,value=0.02,continuous_update=False,description='Variance 2')\n", "corr2=widgets.FloatSlider(min = -1,max=1,step=0.005,value=0.1,continuous_update=False,description='Correlation')\n", "sec_mean1=widgets.FloatSlider(min = -1,max=1,step=0.1,value=0.5,continuous_update=False,description='Mean 1')\n", "sec_mean2=widgets.FloatSlider(min = -1,max=1,step=0.1,value=0.5,continuous_update=False,description='Mean 2')\n", "\n", "interactor = (interactive(pdf_generator,\n", " first_cov11=first_cov11,\n", " first_cov22=first_cov22,\n", " corr1=corr1,\n", " first_mean1=first_mean1,\n", " first_mean2=first_mean2,\n", " sec_cov11=sec_cov11,\n", " sec_cov22=sec_cov22,\n", " corr2=corr2,\n", " sec_mean1=sec_mean1,\n", " sec_mean2=sec_mean2\n", " ))\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0650adce8b9b4b38bd4aa4650a1cbcae", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(Button(button_style='danger', description='Me', layout=Layout(width='30%'), style=ButtonStyle()…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9cab0ec0db514067aa0079e0fb4e7ed0", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(VBox(children=(FloatSlider(value=0.01, continuous_update=False, description='Variance 1', max=0…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "85b799a3dbef45a686fa42541596c7b6", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "button1 = Button(description = 'Me',layout=Layout(width='30%'),button_style='danger')\n", "button2 = Button(description = 'You',layout=Layout(width='30%'),button_style='danger')\n", "header =HBox((button1, button2))\n", "header.layout.justify_content = 'center'\n", "display(header)\n", "\n", "myh = HBox([VBox(interactor.children[:-1][:5]),VBox(interactor.children[:-1][5:])])\n", "myh.layout.justify_content = 'center'\n", "display(myh, interactor.children[-1])\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.6.6" } }, "nbformat": 4, "nbformat_minor": 2 }