.. 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-22 .. code-block:: default 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 23-24 Set the random generator seed .. GENERATED FROM PYTHON SOURCE LINES 24-26 .. code-block:: default ot.RandomGenerator.SetSeed(0) .. GENERATED FROM PYTHON SOURCE LINES 27-31 Defining the marginals ---------------------- We consider two independent normal marginals : .. GENERATED FROM PYTHON SOURCE LINES 31-35 .. code-block:: default X1 = ot.Normal(0.0, 1.0) X2 = ot.Normal(0.0, 3.0) .. GENERATED FROM PYTHON SOURCE LINES 36-38 Independent marginals --------------------- .. GENERATED FROM PYTHON SOURCE LINES 38-43 .. code-block:: default distX = ot.ComposedDistribution([X1, X2]) sample = distX.getSample(1000) .. GENERATED FROM PYTHON SOURCE LINES 44-45 Let's see the data .. GENERATED FROM PYTHON SOURCE LINES 47-55 .. 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 56-57 We draw the isolines of the PDF of :math:`X` : .. GENERATED FROM PYTHON SOURCE LINES 57-63 .. 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 64-65 We estimate the density with kernel smoothing : .. GENERATED FROM PYTHON SOURCE LINES 65-69 .. code-block:: default kernel = ot.KernelSmoothing() estimated = kernel.build(sample) .. GENERATED FROM PYTHON SOURCE LINES 70-71 We draw the isolines of the estimated PDF of :math:`X` : .. GENERATED FROM PYTHON SOURCE LINES 71-78 .. 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 79-81 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 83-84 We first create N observation points in :math:`[-3.0, 3.0]` : .. GENERATED FROM PYTHON SOURCE LINES 86-90 .. 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 91-92 We create curves of the exact and approximated quantile :math:`Q_1` .. GENERATED FROM PYTHON SOURCE LINES 94-99 .. 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 100-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-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 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-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 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-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 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-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 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-187 .. 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 188-199 .. 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 200-202 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 202-203 .. code-block:: default plt.show() .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 1.489 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 `_