.. 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-36 .. code-block:: default X1 = ot.Normal(0.0, 1.0) X2 = ot.Normal(0.0, 3.0) .. GENERATED FROM PYTHON SOURCE LINES 37-39 Independent marginals --------------------- .. GENERATED FROM PYTHON SOURCE LINES 39-44 .. code-block:: default distX = ot.ComposedDistribution([X1, X2]) sample = distX.getSample(1000) .. GENERATED FROM PYTHON SOURCE LINES 45-46 Let's see the data .. GENERATED FROM PYTHON SOURCE LINES 48-56 .. 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-sg:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_001.png :alt: A sample from $X=(X_1, X_2)$ :srcset: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 57-58 We draw the isolines of the PDF of :math:`X` : .. GENERATED FROM PYTHON SOURCE LINES 58-64 .. 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-sg:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_002.png :alt: iso-PDF of $X=(X_1, X_2)$ :srcset: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_002.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 65-66 We estimate the density with kernel smoothing : .. GENERATED FROM PYTHON SOURCE LINES 66-70 .. code-block:: default kernel = ot.KernelSmoothing() estimated = kernel.build(sample) .. GENERATED FROM PYTHON SOURCE LINES 71-72 We draw the isolines of the estimated PDF of :math:`X` : .. GENERATED FROM PYTHON SOURCE LINES 72-79 .. 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-sg:: /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 :srcset: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_003.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 80-82 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 84-85 We first create N observation points in :math:`[-3.0, 3.0]` : .. GENERATED FROM PYTHON SOURCE LINES 87-91 .. 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 92-93 We create curves of the exact and approximated quantile :math:`Q_1` .. GENERATED FROM PYTHON SOURCE LINES 95-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-112 .. 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-sg:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_004.png :alt: 90% quantile of $X_1 | X_2=x_2$ :srcset: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_004.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 113-115 In this case the Q_1 quantile is constant because of the independance of the marginals. .. GENERATED FROM PYTHON SOURCE LINES 117-124 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 126-129 .. code-block:: default copula = ot.ClaytonCopula(2.5) distX = ot.ComposedDistribution([X1, X2], copula) .. GENERATED FROM PYTHON SOURCE LINES 130-131 We generate a sample from the distribution : .. GENERATED FROM PYTHON SOURCE LINES 131-133 .. code-block:: default sample = distX.getSample(1000) .. GENERATED FROM PYTHON SOURCE LINES 134-135 Let's see the data .. GENERATED FROM PYTHON SOURCE LINES 137-145 .. 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-sg:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_005.png :alt: A sample from $X=(X_1, X_2)$ :srcset: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_005.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 146-147 We draw the isolines of the PDF of :math:`X` : .. GENERATED FROM PYTHON SOURCE LINES 147-153 .. 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-sg:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_006.png :alt: iso-PDF of $X=(X_1, X_2)$ :srcset: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_006.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 154-155 We estimate the density with kernel smoothing : .. GENERATED FROM PYTHON SOURCE LINES 155-158 .. code-block:: default kernel = ot.KernelSmoothing() estimated = kernel.build(sample) .. GENERATED FROM PYTHON SOURCE LINES 159-160 We draw the isolines of the estimated PDF of :math:`X` : .. GENERATED FROM PYTHON SOURCE LINES 160-167 .. 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-sg:: /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 :srcset: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_007.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 168-170 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 172-173 We first create N observation points in :math:`[-3.0, 3.0]` : .. GENERATED FROM PYTHON SOURCE LINES 175-179 .. 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 180-181 We create curves of the exact and approximated quantile :math:`Q_1` .. GENERATED FROM PYTHON SOURCE LINES 183-188 .. 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 189-200 .. 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-sg:: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_008.png :alt: 90% quantile of $X_1 | X_2=x_2$ :srcset: /auto_data_analysis/distribution_fitting/images/sphx_glr_plot_estimate_conditional_quantile_008.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 201-203 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 203-204 .. code-block:: default plt.show() .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 2.816 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 `_