AntonAntonov/ QuantileRegression

Quantile regression functions

Contributed by: Anton Antonov

Various Quantile Regression (QR) functions. Multi-dimensional QR is supported.

Installation Instructions

To install this paclet in your Wolfram Language environment, evaluate this code:
PacletInstall["AntonAntonov/QuantileRegression"]


To load the code after installation, evaluate this code:
Needs["AntonAntonov`QuantileRegression`"]

Details

QuantileRegression works on time series, lists of numbers and lists of numeric pairs.
The curves computed with quantile regression are called regression quantiles.
The regression quantiles corresponding to the specified probabilities are linear combinations of B-splines generated over the specified knots.
In other words, QuantileRegression computes fits using a B-spline functions basis. The basis is specified with the knots argument and the option InterpolationOrder.
QuantileRegression takes the following options:
InterpolationOrder3interpolation order
MethodLinearProgrammingmethod for the quantile regression computations
QuantileRegressionFit is very similar to QuantileRegression but uses a given list of basis functions.
QuantileEnvelope provides experimental implementation of quantile envelopes points finding.
QuantileEnvelopeRegion provides experimental implementation of 2D or 3D quantile envelope region finding.

Paclet Guide

Examples

Basic Examples (5) 

Make a random signal:

In[1]:=
SeedRandom[23];
n = 200;
randData = Transpose[{Range[n], RandomReal[{0, 100.}, n]}];

Compute QuantileRegression with five knots for the probabilities 0.25 and 0.75:

In[2]:=
qFuncs = InterpretationBox[FrameBox[TagBox[TooltipBox[PaneBox[GridBox[List[List[GraphicsBox[List[Thickness[0.0025`], List[FaceForm[List[RGBColor[0.9607843137254902`, 0.5058823529411764`, 0.19607843137254902`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3]]], List[List[List[205.`, 22.863691329956055`], List[205.`, 212.31669425964355`], List[246.01799774169922`, 235.99870109558105`], List[369.0710144042969`, 307.0436840057373`], List[369.0710144042969`, 117.59068870544434`], List[205.`, 22.863691329956055`]], List[List[30.928985595703125`, 307.0436840057373`], List[153.98200225830078`, 235.99870109558105`], List[195.`, 212.31669425964355`], List[195.`, 22.863691329956055`], List[30.928985595703125`, 117.59068870544434`], List[30.928985595703125`, 307.0436840057373`]], List[List[200.`, 410.42970085144043`], List[364.0710144042969`, 315.7036876678467`], List[241.01799774169922`, 244.65868949890137`], List[200.`, 220.97669792175293`], List[158.98200225830078`, 244.65868949890137`], List[35.928985595703125`, 315.7036876678467`], List[200.`, 410.42970085144043`]], List[List[376.5710144042969`, 320.03370475769043`], List[202.5`, 420.53370475769043`], List[200.95300006866455`, 421.42667961120605`], List[199.04699993133545`, 421.42667961120605`], List[197.5`, 420.53370475769043`], List[23.428985595703125`, 320.03370475769043`], List[21.882003784179688`, 319.1406993865967`], List[20.928985595703125`, 317.4896984100342`], List[20.928985595703125`, 315.7036876678467`], List[20.928985595703125`, 114.70369529724121`], List[20.928985595703125`, 112.91769218444824`], List[21.882003784179688`, 111.26669120788574`], List[23.428985595703125`, 110.37369346618652`], List[197.5`, 9.87369155883789`], List[198.27300024032593`, 9.426692008972168`], List[199.13700008392334`, 9.203690528869629`], List[200.`, 9.203690528869629`], List[200.86299991607666`, 9.203690528869629`], List[201.72699999809265`, 9.426692008972168`], List[202.5`, 9.87369155883789`], List[376.5710144042969`, 110.37369346618652`], List[378.1179962158203`, 111.26669120788574`], List[379.0710144042969`, 112.91769218444824`], List[379.0710144042969`, 114.70369529724121`], List[379.0710144042969`, 315.7036876678467`], List[379.0710144042969`, 317.4896984100342`], List[378.1179962158203`, 319.1406993865967`], List[376.5710144042969`, 320.03370475769043`]]]]], List[FaceForm[List[RGBColor[0.5529411764705883`, 0.6745098039215687`, 0.8117647058823529`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[44.92900085449219`, 282.59088134765625`], List[181.00001525878906`, 204.0298843383789`], List[181.00001525878906`, 46.90887451171875`], List[44.92900085449219`, 125.46986389160156`], List[44.92900085449219`, 282.59088134765625`]]]]], List[FaceForm[List[RGBColor[0.6627450980392157`, 0.803921568627451`, 0.5686274509803921`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[355.0710144042969`, 282.59088134765625`], List[355.0710144042969`, 125.46986389160156`], List[219.`, 46.90887451171875`], List[219.`, 204.0298843383789`], List[355.0710144042969`, 282.59088134765625`]]]]], List[FaceForm[List[RGBColor[0.6901960784313725`, 0.5882352941176471`, 0.8117647058823529`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[200.`, 394.0606994628906`], List[336.0710144042969`, 315.4997024536133`], List[200.`, 236.93968200683594`], List[63.928985595703125`, 315.4997024536133`], List[200.`, 394.0606994628906`]]]]]], List[Rule[BaselinePosition, Scaled[0.15`]], Rule[ImageSize, 10], Rule[ImageSize, 15]]], StyleBox[RowBox[List["QuantileRegression", " "]], Rule[ShowAutoStyles, False], Rule[ShowStringCharacters, False], Rule[FontSize, Times[0.9`, Inherited]], Rule[FontColor, GrayLevel[0.1`]]]]], Rule[GridBoxSpacings, List[Rule["Columns", List[List[0.25`]]]]]], Rule[Alignment, List[Left, Baseline]], Rule[BaselinePosition, Baseline], Rule[FrameMargins, List[List[3, 0], List[0, 0]]], Rule[BaseStyle, List[Rule[LineSpacing, List[0, 0]], Rule[LineBreakWithin, False]]]], RowBox[List["PacletSymbol", "[", RowBox[List["\"AntonAntonov/QuantileRegression\"", ",", "\"AntonAntonov`QuantileRegression`QuantileRegression\""]], "]"]], Rule[TooltipStyle, List[Rule[ShowAutoStyles, True], Rule[ShowStringCharacters, True]]]], Function[Annotation[Slot[1], Style[Defer[PacletSymbol["AntonAntonov/QuantileRegression", "AntonAntonov`QuantileRegression`QuantileRegression"]], Rule[ShowStringCharacters, True]], "Tooltip"]]], Rule[Background, RGBColor[0.968`, 0.976`, 0.984`]], Rule[BaselinePosition, Baseline], Rule[DefaultBaseStyle, List[]], Rule[FrameMargins, List[List[0, 0], List[1, 1]]], Rule[FrameStyle, RGBColor[0.831`, 0.847`, 0.85`]], Rule[RoundingRadius, 4]], PacletSymbol["AntonAntonov/QuantileRegression", "AntonAntonov`QuantileRegression`QuantileRegression"], Rule[Selectable, False], Rule[SelectWithContents, True], Rule[BoxID, "PacletSymbolBox"]][randData, 5, {0.25, 0.75}];

Here are the formulas of the obtained regression quantiles:

In[3]:=
Simplify /@ Through[qFuncs[x]]
Out[3]=

Here is a plot of the original data and the obtained regression quantiles:

In[4]:=
ListLinePlot[{randData, qFuncs[[1]] /@ randData[[All, 1]], qFuncs[[2]] /@ randData[[All, 1]]}, PlotLegends -> {"data", 0.25`, 0.75`}, PlotStyle -> {Thin, Thick, Thick}, PlotTheme -> "Detailed"]
Out[4]=

Find the fraction of the data points that are under the second regression quantile:

In[5]:=
Length[Select[randData, #[[2]] < qFuncs[[2]][#[[1]]] &]]/
  Length[randData] // N
Out[5]=

The obtained fraction is close to the second probability, 0.75, given to QuantileRegression.

Scope (4) 

Here is a quantile regression computation over a numerical vector:

In[6]:=
vecData = Sin[Range[200]/6] + RandomReal[{-0.5, 0.5}, 200];
qFunc = First@InterpretationBox[FrameBox[TagBox[TooltipBox[PaneBox[GridBox[List[List[GraphicsBox[List[Thickness[0.0025`], List[FaceForm[List[RGBColor[0.9607843137254902`, 0.5058823529411764`, 0.19607843137254902`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3]]], List[List[List[205.`, 22.863691329956055`], List[205.`, 212.31669425964355`], List[246.01799774169922`, 235.99870109558105`], List[369.0710144042969`, 307.0436840057373`], List[369.0710144042969`, 117.59068870544434`], List[205.`, 22.863691329956055`]], List[List[30.928985595703125`, 307.0436840057373`], List[153.98200225830078`, 235.99870109558105`], List[195.`, 212.31669425964355`], List[195.`, 22.863691329956055`], List[30.928985595703125`, 117.59068870544434`], List[30.928985595703125`, 307.0436840057373`]], List[List[200.`, 410.42970085144043`], List[364.0710144042969`, 315.7036876678467`], List[241.01799774169922`, 244.65868949890137`], List[200.`, 220.97669792175293`], List[158.98200225830078`, 244.65868949890137`], List[35.928985595703125`, 315.7036876678467`], List[200.`, 410.42970085144043`]], List[List[376.5710144042969`, 320.03370475769043`], List[202.5`, 420.53370475769043`], List[200.95300006866455`, 421.42667961120605`], List[199.04699993133545`, 421.42667961120605`], List[197.5`, 420.53370475769043`], List[23.428985595703125`, 320.03370475769043`], List[21.882003784179688`, 319.1406993865967`], List[20.928985595703125`, 317.4896984100342`], List[20.928985595703125`, 315.7036876678467`], List[20.928985595703125`, 114.70369529724121`], List[20.928985595703125`, 112.91769218444824`], List[21.882003784179688`, 111.26669120788574`], List[23.428985595703125`, 110.37369346618652`], List[197.5`, 9.87369155883789`], List[198.27300024032593`, 9.426692008972168`], List[199.13700008392334`, 9.203690528869629`], List[200.`, 9.203690528869629`], List[200.86299991607666`, 9.203690528869629`], List[201.72699999809265`, 9.426692008972168`], List[202.5`, 9.87369155883789`], List[376.5710144042969`, 110.37369346618652`], List[378.1179962158203`, 111.26669120788574`], List[379.0710144042969`, 112.91769218444824`], List[379.0710144042969`, 114.70369529724121`], List[379.0710144042969`, 315.7036876678467`], List[379.0710144042969`, 317.4896984100342`], List[378.1179962158203`, 319.1406993865967`], List[376.5710144042969`, 320.03370475769043`]]]]], List[FaceForm[List[RGBColor[0.5529411764705883`, 0.6745098039215687`, 0.8117647058823529`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[44.92900085449219`, 282.59088134765625`], List[181.00001525878906`, 204.0298843383789`], List[181.00001525878906`, 46.90887451171875`], List[44.92900085449219`, 125.46986389160156`], List[44.92900085449219`, 282.59088134765625`]]]]], List[FaceForm[List[RGBColor[0.6627450980392157`, 0.803921568627451`, 0.5686274509803921`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[355.0710144042969`, 282.59088134765625`], List[355.0710144042969`, 125.46986389160156`], List[219.`, 46.90887451171875`], List[219.`, 204.0298843383789`], List[355.0710144042969`, 282.59088134765625`]]]]], List[FaceForm[List[RGBColor[0.6901960784313725`, 0.5882352941176471`, 0.8117647058823529`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[200.`, 394.0606994628906`], List[336.0710144042969`, 315.4997024536133`], List[200.`, 236.93968200683594`], List[63.928985595703125`, 315.4997024536133`], List[200.`, 394.0606994628906`]]]]]], List[Rule[BaselinePosition, Scaled[0.15`]], Rule[ImageSize, 10], Rule[ImageSize, 15]]], StyleBox[RowBox[List["QuantileRegression", " "]], Rule[ShowAutoStyles, False], Rule[ShowStringCharacters, False], Rule[FontSize, Times[0.9`, Inherited]], Rule[FontColor, GrayLevel[0.1`]]]]], Rule[GridBoxSpacings, List[Rule["Columns", List[List[0.25`]]]]]], Rule[Alignment, List[Left, Baseline]], Rule[BaselinePosition, Baseline], Rule[FrameMargins, List[List[3, 0], List[0, 0]]], Rule[BaseStyle, List[Rule[LineSpacing, List[0, 0]], Rule[LineBreakWithin, False]]]], RowBox[List["PacletSymbol", "[", RowBox[List["\"AntonAntonov/QuantileRegression\"", ",", "\"AntonAntonov`QuantileRegression`QuantileRegression\""]], "]"]], Rule[TooltipStyle, List[Rule[ShowAutoStyles, True], Rule[ShowStringCharacters, True]]]], Function[Annotation[Slot[1], Style[Defer[PacletSymbol["AntonAntonov/QuantileRegression", "AntonAntonov`QuantileRegression`QuantileRegression"]], Rule[ShowStringCharacters, True]], "Tooltip"]]], Rule[Background, RGBColor[0.968`, 0.976`, 0.984`]], Rule[BaselinePosition, Baseline], Rule[DefaultBaseStyle, List[]], Rule[FrameMargins, List[List[0, 0], List[1, 1]]], Rule[FrameStyle, RGBColor[0.831`, 0.847`, 0.85`]], Rule[RoundingRadius, 4]], PacletSymbol["AntonAntonov/QuantileRegression", "AntonAntonov`QuantileRegression`QuantileRegression"], Rule[Selectable, False], Rule[SelectWithContents, True], Rule[BoxID, "PacletSymbolBox"]][vecData, 12, 0.5];
ListLinePlot[{vecData, qFunc[#] & /@ Range[Length[vecData]]}, PlotRange -> All, PlotTheme -> "Detailed", PlotLegends -> {"vector", "fit"}]
Out[8]=

Here is a quantile regression computation over a time series object:

In[9]:=
finData = FinancialData["GE", {{2010, 1, 1}, {2019, 10, 15}, "Week"}];
qFunc = First@InterpretationBox[FrameBox[TagBox[TooltipBox[PaneBox[GridBox[List[List[GraphicsBox[List[Thickness[0.0025`], List[FaceForm[List[RGBColor[0.9607843137254902`, 0.5058823529411764`, 0.19607843137254902`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3]]], List[List[List[205.`, 22.863691329956055`], List[205.`, 212.31669425964355`], List[246.01799774169922`, 235.99870109558105`], List[369.0710144042969`, 307.0436840057373`], List[369.0710144042969`, 117.59068870544434`], List[205.`, 22.863691329956055`]], List[List[30.928985595703125`, 307.0436840057373`], List[153.98200225830078`, 235.99870109558105`], List[195.`, 212.31669425964355`], List[195.`, 22.863691329956055`], List[30.928985595703125`, 117.59068870544434`], List[30.928985595703125`, 307.0436840057373`]], List[List[200.`, 410.42970085144043`], List[364.0710144042969`, 315.7036876678467`], List[241.01799774169922`, 244.65868949890137`], List[200.`, 220.97669792175293`], List[158.98200225830078`, 244.65868949890137`], List[35.928985595703125`, 315.7036876678467`], List[200.`, 410.42970085144043`]], List[List[376.5710144042969`, 320.03370475769043`], List[202.5`, 420.53370475769043`], List[200.95300006866455`, 421.42667961120605`], List[199.04699993133545`, 421.42667961120605`], List[197.5`, 420.53370475769043`], List[23.428985595703125`, 320.03370475769043`], List[21.882003784179688`, 319.1406993865967`], List[20.928985595703125`, 317.4896984100342`], List[20.928985595703125`, 315.7036876678467`], List[20.928985595703125`, 114.70369529724121`], List[20.928985595703125`, 112.91769218444824`], List[21.882003784179688`, 111.26669120788574`], List[23.428985595703125`, 110.37369346618652`], List[197.5`, 9.87369155883789`], List[198.27300024032593`, 9.426692008972168`], List[199.13700008392334`, 9.203690528869629`], List[200.`, 9.203690528869629`], List[200.86299991607666`, 9.203690528869629`], List[201.72699999809265`, 9.426692008972168`], List[202.5`, 9.87369155883789`], List[376.5710144042969`, 110.37369346618652`], List[378.1179962158203`, 111.26669120788574`], List[379.0710144042969`, 112.91769218444824`], List[379.0710144042969`, 114.70369529724121`], List[379.0710144042969`, 315.7036876678467`], List[379.0710144042969`, 317.4896984100342`], List[378.1179962158203`, 319.1406993865967`], List[376.5710144042969`, 320.03370475769043`]]]]], List[FaceForm[List[RGBColor[0.5529411764705883`, 0.6745098039215687`, 0.8117647058823529`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[44.92900085449219`, 282.59088134765625`], List[181.00001525878906`, 204.0298843383789`], List[181.00001525878906`, 46.90887451171875`], List[44.92900085449219`, 125.46986389160156`], List[44.92900085449219`, 282.59088134765625`]]]]], List[FaceForm[List[RGBColor[0.6627450980392157`, 0.803921568627451`, 0.5686274509803921`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[355.0710144042969`, 282.59088134765625`], List[355.0710144042969`, 125.46986389160156`], List[219.`, 46.90887451171875`], List[219.`, 204.0298843383789`], List[355.0710144042969`, 282.59088134765625`]]]]], List[FaceForm[List[RGBColor[0.6901960784313725`, 0.5882352941176471`, 0.8117647058823529`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[200.`, 394.0606994628906`], List[336.0710144042969`, 315.4997024536133`], List[200.`, 236.93968200683594`], List[63.928985595703125`, 315.4997024536133`], List[200.`, 394.0606994628906`]]]]]], List[Rule[BaselinePosition, Scaled[0.15`]], Rule[ImageSize, 10], Rule[ImageSize, 15]]], StyleBox[RowBox[List["QuantileRegression", " "]], Rule[ShowAutoStyles, False], Rule[ShowStringCharacters, False], Rule[FontSize, Times[0.9`, Inherited]], Rule[FontColor, GrayLevel[0.1`]]]]], Rule[GridBoxSpacings, List[Rule["Columns", List[List[0.25`]]]]]], Rule[Alignment, List[Left, Baseline]], Rule[BaselinePosition, Baseline], Rule[FrameMargins, List[List[3, 0], List[0, 0]]], Rule[BaseStyle, List[Rule[LineSpacing, List[0, 0]], Rule[LineBreakWithin, False]]]], RowBox[List["PacletSymbol", "[", RowBox[List["\"AntonAntonov/QuantileRegression\"", ",", "\"AntonAntonov`QuantileRegression`QuantileRegression\""]], "]"]], Rule[TooltipStyle, List[Rule[ShowAutoStyles, True], Rule[ShowStringCharacters, True]]]], Function[Annotation[Slot[1], Style[Defer[PacletSymbol["AntonAntonov/QuantileRegression", "AntonAntonov`QuantileRegression`QuantileRegression"]], Rule[ShowStringCharacters, True]], "Tooltip"]]], Rule[Background, RGBColor[0.968`, 0.976`, 0.984`]], Rule[BaselinePosition, Baseline], Rule[DefaultBaseStyle, List[]], Rule[FrameMargins, List[List[0, 0], List[1, 1]]], Rule[FrameStyle, RGBColor[0.831`, 0.847`, 0.85`]], Rule[RoundingRadius, 4]], PacletSymbol["AntonAntonov/QuantileRegression", "AntonAntonov`QuantileRegression`QuantileRegression"], Rule[Selectable, False], Rule[SelectWithContents, True], Rule[BoxID, "PacletSymbolBox"]][finData, 12, 0.5];
DateListPlot[{finData, {#, qFunc[#]} & /@ finData["Times"]}, Joined -> {False, True}, PlotLegends -> {"time series", "fit"}]
Out[11]=

Here we find are some randomly generated 2D points:

In[12]:=
sndData = CompressedData["
1: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
"];

Here 2D quantile envelopes are computed of the points:

In[13]:=
qs = Range[0.7, 1, 0.05];
qsPoints = InterpretationBox[FrameBox[TagBox[TooltipBox[PaneBox[GridBox[List[List[GraphicsBox[List[Thickness[0.0025`], List[FaceForm[List[RGBColor[0.9607843137254902`, 0.5058823529411764`, 0.19607843137254902`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3]]], List[List[List[205.`, 22.863691329956055`], List[205.`, 212.31669425964355`], List[246.01799774169922`, 235.99870109558105`], List[369.0710144042969`, 307.0436840057373`], List[369.0710144042969`, 117.59068870544434`], List[205.`, 22.863691329956055`]], List[List[30.928985595703125`, 307.0436840057373`], List[153.98200225830078`, 235.99870109558105`], List[195.`, 212.31669425964355`], List[195.`, 22.863691329956055`], List[30.928985595703125`, 117.59068870544434`], List[30.928985595703125`, 307.0436840057373`]], List[List[200.`, 410.42970085144043`], List[364.0710144042969`, 315.7036876678467`], List[241.01799774169922`, 244.65868949890137`], List[200.`, 220.97669792175293`], List[158.98200225830078`, 244.65868949890137`], List[35.928985595703125`, 315.7036876678467`], List[200.`, 410.42970085144043`]], List[List[376.5710144042969`, 320.03370475769043`], List[202.5`, 420.53370475769043`], List[200.95300006866455`, 421.42667961120605`], List[199.04699993133545`, 421.42667961120605`], List[197.5`, 420.53370475769043`], List[23.428985595703125`, 320.03370475769043`], List[21.882003784179688`, 319.1406993865967`], List[20.928985595703125`, 317.4896984100342`], List[20.928985595703125`, 315.7036876678467`], List[20.928985595703125`, 114.70369529724121`], List[20.928985595703125`, 112.91769218444824`], List[21.882003784179688`, 111.26669120788574`], List[23.428985595703125`, 110.37369346618652`], List[197.5`, 9.87369155883789`], List[198.27300024032593`, 9.426692008972168`], List[199.13700008392334`, 9.203690528869629`], List[200.`, 9.203690528869629`], List[200.86299991607666`, 9.203690528869629`], List[201.72699999809265`, 9.426692008972168`], List[202.5`, 9.87369155883789`], List[376.5710144042969`, 110.37369346618652`], List[378.1179962158203`, 111.26669120788574`], List[379.0710144042969`, 112.91769218444824`], List[379.0710144042969`, 114.70369529724121`], List[379.0710144042969`, 315.7036876678467`], List[379.0710144042969`, 317.4896984100342`], List[378.1179962158203`, 319.1406993865967`], List[376.5710144042969`, 320.03370475769043`]]]]], List[FaceForm[List[RGBColor[0.5529411764705883`, 0.6745098039215687`, 0.8117647058823529`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[44.92900085449219`, 282.59088134765625`], List[181.00001525878906`, 204.0298843383789`], List[181.00001525878906`, 46.90887451171875`], List[44.92900085449219`, 125.46986389160156`], List[44.92900085449219`, 282.59088134765625`]]]]], List[FaceForm[List[RGBColor[0.6627450980392157`, 0.803921568627451`, 0.5686274509803921`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[355.0710144042969`, 282.59088134765625`], List[355.0710144042969`, 125.46986389160156`], List[219.`, 46.90887451171875`], List[219.`, 204.0298843383789`], List[355.0710144042969`, 282.59088134765625`]]]]], List[FaceForm[List[RGBColor[0.6901960784313725`, 0.5882352941176471`, 0.8117647058823529`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[200.`, 394.0606994628906`], List[336.0710144042969`, 315.4997024536133`], List[200.`, 236.93968200683594`], List[63.928985595703125`, 315.4997024536133`], List[200.`, 394.0606994628906`]]]]]], List[Rule[BaselinePosition, Scaled[0.15`]], Rule[ImageSize, 10], Rule[ImageSize, 15]]], StyleBox[RowBox[List["QuantileEnvelope", " "]], Rule[ShowAutoStyles, False], Rule[ShowStringCharacters, False], Rule[FontSize, Times[0.9`, Inherited]], Rule[FontColor, GrayLevel[0.1`]]]]], Rule[GridBoxSpacings, List[Rule["Columns", List[List[0.25`]]]]]], Rule[Alignment, List[Left, Baseline]], Rule[BaselinePosition, Baseline], Rule[FrameMargins, List[List[3, 0], List[0, 0]]], Rule[BaseStyle, List[Rule[LineSpacing, List[0, 0]], Rule[LineBreakWithin, False]]]], RowBox[List["PacletSymbol", "[", RowBox[List["\"AntonAntonov/QuantileRegression\"", ",", "\"AntonAntonov`QuantileRegression`QuantileEnvelope\""]], "]"]], Rule[TooltipStyle, List[Rule[ShowAutoStyles, True], Rule[ShowStringCharacters, True]]]], Function[Annotation[Slot[1], Style[Defer[PacletSymbol["AntonAntonov/QuantileRegression", "AntonAntonov`QuantileRegression`QuantileEnvelope"]], Rule[ShowStringCharacters, True]], "Tooltip"]]], Rule[Background, RGBColor[0.968`, 0.976`, 0.984`]], Rule[BaselinePosition, Baseline], Rule[DefaultBaseStyle, List[]], Rule[FrameMargins, List[List[0, 0], List[1, 1]]], Rule[FrameStyle, RGBColor[0.831`, 0.847`, 0.85`]], Rule[RoundingRadius, 4]], PacletSymbol["AntonAntonov/QuantileRegression", "AntonAntonov`QuantileRegression`QuantileEnvelope"], Rule[Selectable, False], Rule[SelectWithContents, True], Rule[BoxID, "PacletSymbolBox"]][sndData, qs, 20];

Here the envelopes are plotted together with the data:

In[14]:=
Block[{data = sndData}, Show[{ListPlot[data, PlotStyle -> {PointSize[0.006], GrayLevel[0.65]}, AspectRatio -> 1, PlotTheme -> "Detailed", PlotLegends -> SwatchLegend[
      Blend[{Blue, Red}, Rescale[#1, {Min[qs], Max[qs]}, {0, 1}]] & /@
        qs, qs]], Graphics[{PointSize[0.005], Thickness[0.005], MapThread[{Blend[{Blue, Red}, Rescale[#1, {Min[qs], Max[qs]}, {0, 1}]], Tooltip[Line[Append[#2, #2[[1]]]], #1], Point[#2]} &, {qs, qsPoints}]}]}]]
Out[14]=

Generate noisy 3D data:

In[15]:=
Block[{c = 2, h = 0.1},
 data = Flatten[
    Table[{x, y, Exp[-(x^2 + y^2)/4]*(1 + RandomReal[1.2])}, {x, -c, c, h}, {y, x, c, h}], 1];
 ]

Compute Quantile regression for probabilities 0.1 and 0.9:

In[16]:=
probs = {0.1, 0.9};
AbsoluteTiming[
 funcs = AssociationThread[
    probs -> InterpretationBox[FrameBox[TagBox[TooltipBox[PaneBox[GridBox[List[List[GraphicsBox[List[Thickness[0.0025`], List[FaceForm[List[RGBColor[0.9607843137254902`, 0.5058823529411764`, 0.19607843137254902`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]], List[List[0, 2, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3], List[0, 1, 0], List[1, 3, 3]]], List[List[List[205.`, 22.863691329956055`], List[205.`, 212.31669425964355`], List[246.01799774169922`, 235.99870109558105`], List[369.0710144042969`, 307.0436840057373`], List[369.0710144042969`, 117.59068870544434`], List[205.`, 22.863691329956055`]], List[List[30.928985595703125`, 307.0436840057373`], List[153.98200225830078`, 235.99870109558105`], List[195.`, 212.31669425964355`], List[195.`, 22.863691329956055`], List[30.928985595703125`, 117.59068870544434`], List[30.928985595703125`, 307.0436840057373`]], List[List[200.`, 410.42970085144043`], List[364.0710144042969`, 315.7036876678467`], List[241.01799774169922`, 244.65868949890137`], List[200.`, 220.97669792175293`], List[158.98200225830078`, 244.65868949890137`], List[35.928985595703125`, 315.7036876678467`], List[200.`, 410.42970085144043`]], List[List[376.5710144042969`, 320.03370475769043`], List[202.5`, 420.53370475769043`], List[200.95300006866455`, 421.42667961120605`], List[199.04699993133545`, 421.42667961120605`], List[197.5`, 420.53370475769043`], List[23.428985595703125`, 320.03370475769043`], List[21.882003784179688`, 319.1406993865967`], List[20.928985595703125`, 317.4896984100342`], List[20.928985595703125`, 315.7036876678467`], List[20.928985595703125`, 114.70369529724121`], List[20.928985595703125`, 112.91769218444824`], List[21.882003784179688`, 111.26669120788574`], List[23.428985595703125`, 110.37369346618652`], List[197.5`, 9.87369155883789`], List[198.27300024032593`, 9.426692008972168`], List[199.13700008392334`, 9.203690528869629`], List[200.`, 9.203690528869629`], List[200.86299991607666`, 9.203690528869629`], List[201.72699999809265`, 9.426692008972168`], List[202.5`, 9.87369155883789`], List[376.5710144042969`, 110.37369346618652`], List[378.1179962158203`, 111.26669120788574`], List[379.0710144042969`, 112.91769218444824`], List[379.0710144042969`, 114.70369529724121`], List[379.0710144042969`, 315.7036876678467`], List[379.0710144042969`, 317.4896984100342`], List[378.1179962158203`, 319.1406993865967`], List[376.5710144042969`, 320.03370475769043`]]]]], List[FaceForm[List[RGBColor[0.5529411764705883`, 0.6745098039215687`, 0.8117647058823529`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[44.92900085449219`, 282.59088134765625`], List[181.00001525878906`, 204.0298843383789`], List[181.00001525878906`, 46.90887451171875`], List[44.92900085449219`, 125.46986389160156`], List[44.92900085449219`, 282.59088134765625`]]]]], List[FaceForm[List[RGBColor[0.6627450980392157`, 0.803921568627451`, 0.5686274509803921`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[355.0710144042969`, 282.59088134765625`], List[355.0710144042969`, 125.46986389160156`], List[219.`, 46.90887451171875`], List[219.`, 204.0298843383789`], List[355.0710144042969`, 282.59088134765625`]]]]], List[FaceForm[List[RGBColor[0.6901960784313725`, 0.5882352941176471`, 0.8117647058823529`], Opacity[1.`]]], FilledCurveBox[List[List[List[0, 2, 0], List[0, 1, 0], List[0, 1, 0], List[0, 1, 0]]], List[List[List[200.`, 394.0606994628906`], List[336.0710144042969`, 315.4997024536133`], List[200.`, 236.93968200683594`], List[63.928985595703125`, 315.4997024536133`], List[200.`, 394.0606994628906`]]]]]], List[Rule[BaselinePosition, Scaled[0.15`]], Rule[ImageSize, 10], Rule[ImageSize, 15]]], StyleBox[RowBox[List["QuantileRegression", " "]], Rule[ShowAutoStyles, False], Rule[ShowStringCharacters, False], Rule[FontSize, Times[0.9`, Inherited]], Rule[FontColor, GrayLevel[0.1`]]]]], Rule[GridBoxSpacings, List[Rule["Columns", List[List[0.25`]]]]]], Rule[Alignment, List[Left, Baseline]], Rule[BaselinePosition, Baseline], Rule[FrameMargins, List[List[3, 0], List[0, 0]]], Rule[BaseStyle, List[Rule[LineSpacing, List[0, 0]], Rule[LineBreakWithin, False]]]], RowBox[List["PacletSymbol", "[", RowBox[List["\"AntonAntonov/QuantileRegression\"", ",", "\"AntonAntonov`QuantileRegression`QuantileRegression\""]], "]"]], Rule[TooltipStyle, List[Rule[ShowAutoStyles, True], Rule[ShowStringCharacters, True]]]], Function[Annotation[Slot[1], Style[Defer[PacletSymbol["AntonAntonov/QuantileRegression", "AntonAntonov`QuantileRegression`QuantileRegression"]], Rule[ShowStringCharacters, True]], "Tooltip"]]], Rule[Background, RGBColor[0.968`, 0.976`, 0.984`]], Rule[BaselinePosition, Baseline], Rule[DefaultBaseStyle, List[]], Rule[FrameMargins, List[List[0, 0], List[1, 1]]], Rule[FrameStyle, RGBColor[0.831`, 0.847`, 0.85`]], Rule[RoundingRadius, 4]], PacletSymbol["AntonAntonov/QuantileRegression", "AntonAntonov`QuantileRegression`QuantileRegression"], Rule[Selectable, False], Rule[SelectWithContents, True], Rule[BoxID, "PacletSymbolBox"]][data, 4, probs]];
 ]
Out[1]=

Plot the data points and regression quantiles together:

In[17]:=
reg = ConvexHullRegion[Most /@ data];
Show[
 ListPointPlot3D[data, Sequence[
  BoxRatios -> {1, 1, 2/3}, PlotStyle -> Red, PlotRange -> All]],
 Plot3D[Evaluate[Through[Values[funcs][x, y]]], {x, Min[data[[All, 1]]], Max[data[[All, 1]]]}, {y, Min[data[[All, 2]]],
    Max[data[[All, 2]]]},
  PlotRange -> All, PlotStyle -> {Opacity[0.7`]}, Mesh -> True, PlotTheme -> "LightMesh", PerformanceGoal -> "Quality", PlotLegends -> Keys[funcs], RegionFunction -> Function[{x, y}, RegionMember[reg, {x, y}]]],
 ImageSize -> Medium
 ]
Out[18]=

Publisher

Anton Antonov

Compatibility

Wolfram Language Version 13.0

Version History

  • 1.0.7 – 20 May 2023
  • 1.0.6 – 17 May 2023
  • 1.0.5 – 17 May 2023
  • 1.0.4 – 16 May 2023
  • 1.0.3 – 13 May 2023
  • 1.0.2 – 29 April 2023
  • 1.0.1 – 29 April 2023
  • 1.0.0 – 18 April 2023

License Information

Artistic License 2.0

Paclet Source

Source Metadata

See Also