.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_data_analysis/distribution_fitting/plot_estimate_conditional_quantile.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_data_analysis_distribution_fitting_plot_estimate_conditional_quantile.py: Estimate a conditional quantile =============================== .. GENERATED FROM PYTHON SOURCE LINES 5-6 .. code-block:: default # sphinx_gallery_thumbnail_number = 8 .. GENERATED FROM PYTHON SOURCE LINES 7-14 From a multivariate data sample we estimate its distribution with kernel smoothing. Here we present a bivariate distribution X= (X1, X2). We use the `computeConditionalQuantile` method to estimate the 90% quantile :math:`Q_1` of the conditional variable :math:`X1|X2` : .. math:: Q_1 : x_2 \mapsto q_{0.9}(X_1|X_2=x_2) We then draw the curve :math:`Q_1 : x_2 \mapsto Q_1(x_2)`. We first start with independent normals then we consider dependent marginals with a Clayton copula. .. GENERATED FROM PYTHON SOURCE LINES 16-23 .. code-block:: default from __future__ import print_function import openturns as ot import openturns.viewer as viewer from matplotlib import pylab as plt import numpy as np ot.Log.Show(ot.Log.NONE) .. GENERATED FROM PYTHON SOURCE LINES 24-25 Set the random generator seed .. GENERATED FROM PYTHON SOURCE LINES 25-27 .. code-block:: default ot.RandomGenerator.SetSeed(0) .. GENERATED FROM PYTHON SOURCE LINES 28-32 Defining the marginals ---------------------- We consider two independent normal marginals : .. GENERATED FROM PYTHON SOURCE LINES 32-37 .. code-block:: default X1 = ot.Normal(0.0, 1.0) X2 = ot.Normal(0.0, 3.0) .. GENERATED FROM PYTHON SOURCE LINES 38-40 Independent marginals --------------------- .. GENERATED FROM PYTHON SOURCE LINES 40-45 .. code-block:: default distX = ot.ComposedDistribution([X1,X2]) sample = distX.getSample(1000) .. GENERATED FROM PYTHON SOURCE LINES 46-47 Let's see the data .. GENERATED FROM PYTHON SOURCE LINES 49-57 .. code-block:: default graph = ot.Graph('2D-Normal sample', 'x1', 'x2', True, '') cloud = ot.Cloud(sample, 'blue', 'fsquare', 'My Cloud') graph.add(cloud) graph.setXTitle("$X_1$") graph.setYTitle("$X_2$") graph.setTitle("A sample from $X=(X_1, X_2)$") view = viewer.View(graph) .. image:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_001.png :alt: A sample from $X=(X_1, X_2)$ :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 58-59 We draw the isolines of the PDF of :math:`X` : .. GENERATED FROM PYTHON SOURCE LINES 59-65 .. code-block:: default graph = distX.drawPDF() graph.setXTitle("$X_1$") graph.setYTitle("$X_2$") graph.setTitle("iso-PDF of $X=(X_1, X_2)$") view = viewer.View(graph) .. image:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_002.png :alt: iso-PDF of $X=(X_1, X_2)$ :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 66-67 We estimate the density with kernel smoothing : .. GENERATED FROM PYTHON SOURCE LINES 67-71 .. code-block:: default kernel = ot.KernelSmoothing() estimated = kernel.build(sample) .. GENERATED FROM PYTHON SOURCE LINES 72-73 We draw the isolines of the estimated PDF of :math:`X` : .. GENERATED FROM PYTHON SOURCE LINES 73-80 .. code-block:: default graph = estimated.drawPDF() graph.setXTitle("$X_1$") graph.setYTitle("$X_2$") graph.setTitle("iso-PDF of $X=(X_1, X_2)$ estimated by kernel smoothing") view = viewer.View(graph) .. image:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_003.png :alt: iso-PDF of $X=(X_1, X_2)$ estimated by kernel smoothing :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 81-83 We can compute the conditional quantile of :math:`X_1 | X_2` with the `computeConditionalQuantile` method and draw it after. .. GENERATED FROM PYTHON SOURCE LINES 85-86 We first create N observation points in :math:`[-3.0, 3.0]` : .. GENERATED FROM PYTHON SOURCE LINES 88-92 .. code-block:: default N = 301 xobs = np.linspace(-3.0, 3.0, N) sampleObs = ot.Sample([[xi] for xi in xobs]) .. GENERATED FROM PYTHON SOURCE LINES 93-94 We create curves of the exact and approximated quantile :math:`Q_1` .. GENERATED FROM PYTHON SOURCE LINES 96-100 .. code-block:: default x = [xi for xi in xobs] yapp = [estimated.computeConditionalQuantile(0.9, sampleObs[i]) for i in range(N)] yex = [distX.computeConditionalQuantile(0.9, sampleObs[i]) for i in range(N)] .. GENERATED FROM PYTHON SOURCE LINES 101-111 .. code-block:: default cxy_app = ot.Curve(x,yapp) cxy_ex = ot.Curve(x,yex) graph = ot.Graph('90% quantile of $X_1 | X_2=x_2$', '$x_2$', '$Q_1(x_2)$', True, '') graph.add(cxy_app) graph.add(cxy_ex) graph.setLegends(["$Q_1$ kernel smoothing","$Q_1$ exact"]) graph.setLegendPosition('bottomright') graph.setColors(["red", "blue"]) view = viewer.View(graph) .. image:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_004.png :alt: 90% quantile of $X_1 | X_2=x_2$ :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 112-114 In this case the Q_1 quantile is constant because of the independance of the marginals. .. GENERATED FROM PYTHON SOURCE LINES 116-123 Dependance through a Clayton copula ----------------------------------- We now define a Clayton copula to model the dependance between our marginals. The Clayton copula is a bivariate asymmmetric Archimedean copula, exhibiting greater dependence in the negative tail than in the positive. .. GENERATED FROM PYTHON SOURCE LINES 125-128 .. code-block:: default copula = ot.ClaytonCopula(2.5) distX = ot.ComposedDistribution([X1,X2],copula) .. GENERATED FROM PYTHON SOURCE LINES 129-130 We generate a sample from the distribution : .. GENERATED FROM PYTHON SOURCE LINES 130-132 .. code-block:: default sample = distX.getSample(1000) .. GENERATED FROM PYTHON SOURCE LINES 133-134 Let's see the data .. GENERATED FROM PYTHON SOURCE LINES 136-144 .. code-block:: default graph = ot.Graph('2D-Normal sample', 'x1', 'x2', True, '') cloud = ot.Cloud(sample, 'blue', 'fsquare', 'My Cloud') graph.add(cloud) graph.setXTitle("$X_1$") graph.setYTitle("$X_2$") graph.setTitle("A sample from $X=(X_1, X_2)$") view = viewer.View(graph) .. image:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_005.png :alt: A sample from $X=(X_1, X_2)$ :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 145-146 We draw the isolines of the PDF of :math:`X` : .. GENERATED FROM PYTHON SOURCE LINES 146-152 .. code-block:: default graph = distX.drawPDF() graph.setXTitle("$X_1$") graph.setYTitle("$X_2$") graph.setTitle("iso-PDF of $X=(X_1, X_2)$") view = viewer.View(graph) .. image:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_006.png :alt: iso-PDF of $X=(X_1, X_2)$ :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 153-154 We estimate the density with kernel smoothing : .. GENERATED FROM PYTHON SOURCE LINES 154-157 .. code-block:: default kernel = ot.KernelSmoothing() estimated = kernel.build(sample) .. GENERATED FROM PYTHON SOURCE LINES 158-159 We draw the isolines of the estimated PDF of :math:`X` : .. GENERATED FROM PYTHON SOURCE LINES 159-166 .. code-block:: default graph = estimated.drawPDF() graph.setXTitle("$X_1$") graph.setYTitle("$X_2$") graph.setTitle("iso-PDF of $X=(X_1, X_2)$ estimated by kernel smoothing") view = viewer.View(graph) .. image:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_007.png :alt: iso-PDF of $X=(X_1, X_2)$ estimated by kernel smoothing :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 167-169 We can compute the conditional quantile of :math:`X_1 | X_2` with the `computeConditionalQuantile` method and draw it after. .. GENERATED FROM PYTHON SOURCE LINES 171-172 We first create N observation points in :math:`[-3.0, 3.0]` : .. GENERATED FROM PYTHON SOURCE LINES 174-178 .. code-block:: default N = 301 xobs = np.linspace(-3.0, 3.0, N) sampleObs = ot.Sample([[xi] for xi in xobs]) .. GENERATED FROM PYTHON SOURCE LINES 179-180 We create curves of the exact and approximated quantile :math:`Q_1` .. GENERATED FROM PYTHON SOURCE LINES 182-186 .. code-block:: default x = [xi for xi in xobs] yapp = [estimated.computeConditionalQuantile(0.9, sampleObs[i]) for i in range(N)] yex = [distX.computeConditionalQuantile(0.9, sampleObs[i]) for i in range(N)] .. GENERATED FROM PYTHON SOURCE LINES 187-197 .. code-block:: default cxy_app = ot.Curve(x,yapp) cxy_ex = ot.Curve(x,yex) graph = ot.Graph('90% quantile of $X_1 | X_2=x_2$', '$x_2$', '$Q_1(x_2)$', True, '') graph.add(cxy_app) graph.add(cxy_ex) graph.setLegends(["$Q_1$ kernel smoothing","$Q_1$ exact"]) graph.setLegendPosition('bottomright') graph.setColors(["red", "blue"]) view = viewer.View(graph) .. image:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_008.png :alt: 90% quantile of $X_1 | X_2=x_2$ :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 198-200 Our estimated conditional quantile is a good approximate and should be better the more data we have. We can observe it by increasing the number of samples. .. GENERATED FROM PYTHON SOURCE LINES 200-201 .. code-block:: default plt.show() .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 2.778 seconds) .. _sphx_glr_download_auto_data_analysis_distribution_fitting_plot_estimate_conditional_quantile.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_estimate_conditional_quantile.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_estimate_conditional_quantile.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_