From 2d0b1e7935d3d13f57fda4f0f7becae161ab57b1 Mon Sep 17 00:00:00 2001 From: jkriege2 Date: Sat, 1 Jun 2019 18:15:04 +0200 Subject: [PATCH] added regression, IRLS robust regression, weighted regression and polynomial fitting/evaluation to statistics library added example for regression, IRLS robust regression, weighted regression and polynomial fitting --- JKQtPlotterBuildAllExamples.pro | 1 + doc/dox/examples_and_tutorials.dox | 3 + examples/README.md | 1 + examples/simpletest_datastore/README.md | 4 + .../simpletest_datastore_iterators/README.md | 4 + .../simpletest_datastore_regression/README.md | 362 ++++++++++ ...lotter_simpletest_datastore_regression.cpp | 327 +++++++++ ...lotter_simpletest_datastore_regression.pro | 27 + ...impletest_datastore_regression_and_lib.pro | 8 + .../simpletest_datastore_statistics/README.md | 3 + lib/jkqtcommon/jkqtplinalgtools.h | 10 +- lib/jkqtcommon/jkqtpmathtools.h | 27 +- lib/jkqtcommon/jkqtpstatisticstools.cpp | 58 ++ lib/jkqtcommon/jkqtpstatisticstools.h | 614 ++++++++++++++++- .../jkqtpgraphsstatisticsadaptors.cpp | 54 ++ .../jkqtpgraphsstatisticsadaptors.h | 639 +++++++++++++++++- ...lotter_simpletest_datastore_regression.png | Bin 0 -> 140376 bytes ...er_simpletest_datastore_regression_lin.png | Bin 0 -> 16393 bytes ...pletest_datastore_regression_linrobust.png | Bin 0 -> 23291 bytes ...etest_datastore_regression_linrobust_p.png | Bin 0 -> 32999 bytes ...pletest_datastore_regression_linweight.png | Bin 0 -> 24799 bytes ...pletest_datastore_regression_nonlinreg.png | Bin 0 -> 33972 bytes ...impletest_datastore_regression_polynom.png | Bin 0 -> 33695 bytes ...st_datastore_regression_polynom_errros.png | Bin 0 -> 36576 bytes ..._simpletest_datastore_regression_small.png | Bin 0 -> 15904 bytes 25 files changed, 2127 insertions(+), 15 deletions(-) create mode 100644 examples/simpletest_datastore_regression/README.md create mode 100644 examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression.cpp create mode 100644 examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression.pro create mode 100644 examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression_and_lib.pro create mode 100644 screenshots/jkqtplotter_simpletest_datastore_regression.png create mode 100644 screenshots/jkqtplotter_simpletest_datastore_regression_lin.png create mode 100644 screenshots/jkqtplotter_simpletest_datastore_regression_linrobust.png create mode 100644 screenshots/jkqtplotter_simpletest_datastore_regression_linrobust_p.png create mode 100644 screenshots/jkqtplotter_simpletest_datastore_regression_linweight.png create mode 100644 screenshots/jkqtplotter_simpletest_datastore_regression_nonlinreg.png create mode 100644 screenshots/jkqtplotter_simpletest_datastore_regression_polynom.png create mode 100644 screenshots/jkqtplotter_simpletest_datastore_regression_polynom_errros.png create mode 100644 screenshots/jkqtplotter_simpletest_datastore_regression_small.png diff --git a/JKQtPlotterBuildAllExamples.pro b/JKQtPlotterBuildAllExamples.pro index 8c7a2268d5..517ce9d061 100644 --- a/JKQtPlotterBuildAllExamples.pro +++ b/JKQtPlotterBuildAllExamples.pro @@ -82,6 +82,7 @@ addSimpleTest(imageplot_nodatastore) addSimpleTest(datastore) addSimpleTest(datastore_iterators) addSimpleTest(datastore_statistics) +addSimpleTest(datastore_regression) addSimpleTest(contourplot) #addSimpleTest(rgbimageplot_opencv) #addSimpleTest(imageplot_opencv) diff --git a/doc/dox/examples_and_tutorials.dox b/doc/dox/examples_and_tutorials.dox index 21fd4f4658..0438b34da4 100644 --- a/doc/dox/examples_and_tutorials.dox +++ b/doc/dox/examples_and_tutorials.dox @@ -159,6 +159,9 @@ All test-projects are Qt-projects that use qmake to build. You can load them int \image html jkqtplotter_simpletest_datastore_statistics_small.png \subpage JKQTPlotterBasicJKQTPDatastoreStatistics Advanced 1-Dimensional Statistical Computation with JKQTPDatastore
using the internal statistics library (see \ref jkqtptools_math_statistics )
basic statistics (mean, standard deviation, ...)
boxplots
histograms
kernel density estimates (KDE) + \image html jkqtplotter_simpletest_datastore_regression_small.png + \subpage JKQTPlotterBasicJKQTPDatastoreRegression + Advanced 1-Dimensional Statistical Computation with JKQTPDatastore
using the internal statistics library
Regression Analysis (with the Statistics Library)
robust regression (IRLS)
weighted regression
non-linear regression
polynomial fitting diff --git a/examples/README.md b/examples/README.md index 9027e96397..44d074cd41 100644 --- a/examples/README.md +++ b/examples/README.md @@ -65,6 +65,7 @@ All test-projects are Qt-projects that use qmake to build. You can load them int | [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/simpletest_datastore_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_datastore) | [Tutorial: Basic Usage of JKQTPDatastore](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_datastore) | Basic Data Management with JKQTPDatastore
Copying data into a JKQTPDatastore
Editing data inside a JKQTPDatastore
Editing Image Data in a JKQTPDatastore | | [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/simpletest_datastore_iterators_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_datastore_iterators) | [Tutorial: Iterator-based access to JKQTPDatastore](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_datastore_iterators) | Iterator-based Data Management with JKQTPDatastore | | [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_datastore_statistics_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_datastore_statistics) | [Tutorial: Advanced 1-Dimensional Statistics with JKQTPDatastore](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_datastore_statistics) | Advanced 1-Dimensional Statistical Computation with JKQTPDatastore
using the internal statistics library
basic statistics (mean, standard deviation, ...)
boxplots
histograms
kernel density estimates (KDE) | +| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_datastore_regression_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_datastore_regression) | [Tutorial: Regression Analysis (with the Statistics Library)](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_datastore_regression) | Advanced 1-Dimensional Statistical Computation with JKQTPDatastore
using the internal statistics library
Regression Analysis (with the Statistics Library)
robust regression (IRLS)
weighted regression
non-linear regression
polynomial fitting | ## More Complex Examples diff --git a/examples/simpletest_datastore/README.md b/examples/simpletest_datastore/README.md index 54af3adf65..accb3b0139 100644 --- a/examples/simpletest_datastore/README.md +++ b/examples/simpletest_datastore/README.md @@ -1,8 +1,10 @@ # Tutorial (JKQTPDatastore): Basic Usage of JKQTPDatastore {#JKQTPlotterBasicJKQTPDatastore} + [JKQTPlotterBasicJKQTPDatastore]: @ref JKQTPlotterBasicJKQTPDatastore "Basic Usage of JKQTPDatastore" [JKQTPlotterBasicJKQTPDatastoreIterators]: @ref JKQTPlotterBasicJKQTPDatastoreIterators "Iterator-Based usage of JKQTPDatastore" [JKQTPlotterBasicJKQTPDatastoreStatistics]: @ref JKQTPlotterBasicJKQTPDatastoreStatistics "Advanced 1-Dimensional Statistics with JKQTPDatastore" +[JKQTPlotterBasicJKQTPDatastoreRegression]: @ref JKQTPlotterBasicJKQTPDatastoreRegression "Regression Analysis (with the Statistics Library)" [statisticslibrary]: @ref jkqtptools_math_statistics "JKQTPlotter Statistics Library" This tutorial project (see `./examples/simpletest_datastore/`) explains several options of JKQTPDatastore, which is the class used to centrally store the data for (most) graphs on a JKQTPlotter widget. @@ -11,6 +13,8 @@ This tutorial project (see `./examples/simpletest_datastore/`) explains several - [JKQTPlotterBasicJKQTPDatastore] - [JKQTPlotterBasicJKQTPDatastoreIterators] - [JKQTPlotterBasicJKQTPDatastoreStatistics] + - [JKQTPlotterBasicJKQTPDatastoreRegression] + [TOC] diff --git a/examples/simpletest_datastore_iterators/README.md b/examples/simpletest_datastore_iterators/README.md index 16cac83f9c..4c39e0f6cb 100644 --- a/examples/simpletest_datastore_iterators/README.md +++ b/examples/simpletest_datastore_iterators/README.md @@ -1,8 +1,10 @@ # Tutorial (JKQTPDatastore): Iterator-Based usage of JKQTPDatastore {#JKQTPlotterBasicJKQTPDatastoreIterators} + [JKQTPlotterBasicJKQTPDatastore]: @ref JKQTPlotterBasicJKQTPDatastore "Basic Usage of JKQTPDatastore" [JKQTPlotterBasicJKQTPDatastoreIterators]: @ref JKQTPlotterBasicJKQTPDatastoreIterators "Iterator-Based usage of JKQTPDatastore" [JKQTPlotterBasicJKQTPDatastoreStatistics]: @ref JKQTPlotterBasicJKQTPDatastoreStatistics "Advanced 1-Dimensional Statistics with JKQTPDatastore" +[JKQTPlotterBasicJKQTPDatastoreRegression]: @ref JKQTPlotterBasicJKQTPDatastoreRegression "Regression Analysis (with the Statistics Library)" [statisticslibrary]: @ref jkqtptools_math_statistics "JKQTPlotter Statistics Library" This tutorial project (see `./examples/simpletest_datastore_iterators/`) explains how to use the iterator-based interface to JKQTPDatastore. @@ -11,6 +13,8 @@ This tutorial project (see `./examples/simpletest_datastore_iterators/`) explain - [JKQTPlotterBasicJKQTPDatastore] - [JKQTPlotterBasicJKQTPDatastoreIterators] - [JKQTPlotterBasicJKQTPDatastoreStatistics] + - [JKQTPlotterBasicJKQTPDatastoreRegression] + [TOC] diff --git a/examples/simpletest_datastore_regression/README.md b/examples/simpletest_datastore_regression/README.md new file mode 100644 index 0000000000..e89e476990 --- /dev/null +++ b/examples/simpletest_datastore_regression/README.md @@ -0,0 +1,362 @@ +# Tutorial (JKQTPDatastore): Regression Analysis (with the Statistics Library) {#JKQTPlotterBasicJKQTPDatastoreRegression} + +[JKQTPlotterBasicJKQTPDatastore]: @ref JKQTPlotterBasicJKQTPDatastore "Basic Usage of JKQTPDatastore" +[JKQTPlotterBasicJKQTPDatastoreIterators]: @ref JKQTPlotterBasicJKQTPDatastoreIterators "Iterator-Based usage of JKQTPDatastore" +[JKQTPlotterBasicJKQTPDatastoreStatistics]: @ref JKQTPlotterBasicJKQTPDatastoreStatistics "Advanced 1-Dimensional Statistics with JKQTPDatastore" +[JKQTPlotterBasicJKQTPDatastoreRegression]: @ref JKQTPlotterBasicJKQTPDatastoreRegression "Regression Analysis (with the Statistics Library)" +[statisticslibrary]: @ref jkqtptools_math_statistics "JKQTPlotter Statistics Library" + + +This tutorial project (see `./examples/simpletest_datastore_statistics/`) explains several advanced functions of JKQTPDatastore in combination with the [[statisticslibrary]] conatined in JKQTPlotter. + +***Note*** that there are additional tutorial explaining other aspects of data mangement in JKQTPDatastore: + - [JKQTPlotterBasicJKQTPDatastore] + - [JKQTPlotterBasicJKQTPDatastoreIterators] + - [JKQTPlotterBasicJKQTPDatastoreStatistics] + - [JKQTPlotterBasicJKQTPDatastoreRegression] + + +[TOC] + +The source code of the main application can be found in [`jkqtplotter_simpletest_datastore_regression.cpp`](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_datastore_statistics/jkqtplotter_simpletest_datastore_regression.cpp). +This tutorial cites only parts of this code to demonstrate different ways of performing regression analysis. + +# Simple Linear Regression + +First we generate a set of datapoints (x,y), which scatter randomly around a linear function. +```.cpp + std::random_device rd; // random number generators: + std::mt19937 gen{rd()}; + std::normal_distribution<> d1{0,1}; + double a0=-5; + double b0=2; + size_t colLinX=datastore1->addColumn("lin data, x"); + size_t colLinY=datastore1->addColumn("lin data, y"); + for (double x=-5; x<=10; x++) { + datastore1->appendToColumn(colLinX, x); + datastore1->appendToColumn(colLinY, a0+b0*x+d1(gen)); + } +``` +... and we visualize this data with a simple scatter graph: +```.cpp + JKQTPXYLineGraph* graphD; + plot1->addGraph(graphD=new JKQTPXYLineGraph(plot1)); + graphD->setXYColumns(colLinX, colLinY); + graphD->setDrawLine(false); + graphD->setTitle("data"); +``` + +Now we can caluate the regression line (i.e. the two regression coefficients a and b of the function \c f(x)=a+b*x) using the function `jkqtpstatLinearRegression()` from the [statisticslibrary]: +```.cpp + double coeffA=0, coeffB=0; + jkqtpstatLinearRegression(datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY), coeffA, coeffB); +``` +... and add a `JKQTPXFunctionLineGraph` to draw the resulting linear function: +```.cpp + JKQTPXFunctionLineGraph *graphRegLine=new JKQTPXFunctionLineGraph(plot1); + graphRegLine->setSpecialFunction(JKQTPXFunctionLineGraph::SpecialFunction::Line); + graphRegLine->setParamsV(coeffA, coeffB); + graphRegLine->setTitle(QString("regression: $f(x) = %1 + %2 \\cdot x$").arg(jkqtp_floattolatexqstr(coeffA)).arg(jkqtp_floattolatexqstr(coeffB))); + plot1->addGraph(graphRegLine); +``` + +These two steps can be simplified using an "adaptor": +```.cpp + jkqtpstatAddLinearRegression(plot1->getPlotter(), datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY)); +``` +... or even shorter: +```.cpp + jkqtpstatAddLinearRegression(graphD); +``` +Here the x- and y-columns from the `JKQTPXYGraph`-based graph `graphD` (see above) are used as datasources for the plot. + +The plot resulting from any of the variants above looks like this: + +![jkqtplotter_simpletest_datastore_regression_lin](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_datastore_regression_lin.png) + +# Robust Linear Regression + +Sometimes data contains outliers that can render the results of a regression analysis inaccurate. For such cases the [statisticslibrary] offers the function `jkqtpstatRobustIRLSLinearRegression()`, which is a drop-in replacement for `jkqtpstatLinearRegression()` and solves the optimization problem a) in the Lp-norm (which is more robust to outliers) and b) uses the [iteratively reweighted least-squares algorithm (IRLS)](https://en.wikipedia.org/wiki/Iteratively_reweighted_least_squares), which performs a series of regressions, where in each instance the data-points are weighted differently. The method assigns a lower weight to those points that are far from the current best-fit (typically the outliers) and thus slowly comes nearer to an estimate that is not distorted by the outliers. + +To demonstrate this method, we use the same dataset as above, but add a few outliers: + +```.cpp + std::random_device rd; // random number generators: + std::mt19937 gen{rd()}; + std::normal_distribution<> d1{0,1}; + double a0=-5; + double b0=2; + size_t colLinX=datastore1->addColumn("lin data, x"); + size_t colLinY=datastore1->addColumn("lin data, y"); + for (double x=-5; x<=10; x++) { + datastore1->appendToColumn(colLinX, x); + if (jkqtp_approximatelyEqual(x, -5)||jkqtp_approximatelyEqual(x, -3)) datastore1->appendToColumn(colRLinY, a0+b0*x+d1(gen)+12); + else datastore1->appendToColumn(colRLinY, a0+b0*x+d1(gen)); + } +``` + +Note the outliers ar x=-5 and x=-3! + +With this dataset we can use the same code as above, but with `jkqtpstatRobustIRLSLinearRegression()` instead of `jkqtpstatLinearRegression()`: + +```.cpp + double coeffA=0, coeffB=0; + jkqtpstatRobustIRLSLinearRegression(datastore1->begin(colRLinX), datastore1->end(colRLinX), datastore1->begin(colRLinY), datastore1->end(colRLinY), coeffA, coeffB); + JKQTPXFunctionLineGraph *graphRegLine=new JKQTPXFunctionLineGraph(plot3); + graphRegLine->setSpecialFunction(JKQTPXFunctionLineGraph::SpecialFunction::Line); + graphRegLine->setParamsV(coeffA, coeffB); + graphRegLine->setTitle(QString("robust regression: $f(x) = %1 + %2 \\cdot x$").arg(jkqtp_floattolatexqstr(coeffA)).arg(jkqtp_floattolatexqstr(coeffB))); + plot3->addGraph(graphRegLine); +``` + +Also for the robust regression, there are two shortcuts in the form of "adaptors": +```.cpp + jkqtpstatAddRobustIRLSLinearRegression(plot3->getPlotter(), datastore1->begin(colRLinX), datastore1->end(colRLinX), datastore1->begin(colRLinY), datastore1->end(colRLinY)); +``` +and +```.cpp + jkqtpstatAddRobustIRLSLinearRegression(graphD); +``` + +The following screenshot shows the result of the IRLS regression analysis and for comparison the normal linear regression for the same dataset (plotted using `jkqtpstatAddLinearRegression(graphD);`): + +![jkqtplotter_simpletest_datastore_regression_linrobust](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_datastore_regression_linrobust.png) + +The following screenshot shows the influence of the regularization parameter p (default value 1.1) onto the fit result: + - the closer `p` is to 1, the more robust the fit is (it is closer to the L1-norm) + - the closer `p` is to 2, the closer the fit is to the least squares solution (i.e. the normal regression obtained with the L2 norm) + +![jkqtplotter_simpletest_datastore_regression_linrobust_p](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_datastore_regression_linrobust_p.png) + + + +# Weighted Linear Regression + +Another option to react to measurement errors is to take these into account when calculating the regression. To do so, you can use weighted regression that uses the measurement errors as inverse weights. This algorithm is implemented in the function `jkqtpstatLinearWeightedRegression()`. + +First we generate again a set of datapoints (x,y), which scatter randomly around a linear function. In addition we calculate an "error" `err` for each datapoint: +```.cpp + std::random_device rd; // random number generators: + std::mt19937 gen{rd()}; + std::uniform_real_distribution<> de{0.5,1.5}; + std::uniform_int_distribution<> ddecide{0,4}; + double a0=-5; + double b0=2; + size_t colWLinX=datastore1->addColumn("wlin data, x"); + size_t colWLinY=datastore1->addColumn("wlin data, y"); + size_t colWLinE=datastore1->addColumn("wlin data, errors"); + for (double x=-5; x<=10; x++) { + double factor=1; + if (ddecide(gen)==4) { + factor=4; + } + const double err=de(gen)*factor; + datastore1->appendToColumn(colWLinX, x); + datastore1->appendToColumn(colWLinY, a0+b0*x+err); + datastore1->appendToColumn(colWLinE, 1.0/err); + } +``` +We use distribution `de` to draw deviations from the ideal linear function from the range 0.5...1.5. then - for good measure - we use a second distribution `ddecide` (dice tossing) to select a few datapoints to have a 4-fold increased error. + +Finally we visualize this data with a simple scatter graph with error indicators: +```.cpp + JKQTPXYLineErrorGraph* graphE; + plot2->addGraph(graphE=new JKQTPXYLineErrorGraph(plot2)); + graphE->setXYColumns(colWLinX, colWLinY); + graphE->setYErrorColumn(static_cast(colWLinE)); + graphE->setDrawLine(false); + graphE->setTitle("data"); +``` + +Now we can caluate the regression line (i.e. the two regression coefficients a and b of the function \c f(x)=a+b*x) using the function `jkqtpstatLinearWeightedRegression()` from the [statisticslibrary]: + +```.cpp + double coeffA=0, coeffB=0; + jkqtpstatLinearWeightedRegression(datastore1->begin(colWLinX), datastore1->end(colWLinX), + datastore1->begin(colWLinY), datastore1->end(colWLinY), + datastore1->begin(colWLinE), datastore1->end(colWLinE), + coeffA, coeffB, false, false, + &jkqtp_inversePropSaveDefault); +``` +***Note*** that in addition to the three data-columns we also provided a C++ functor `jkqtp_inversePropSaveDefault()`, which calculates 1/error. This is done, because the function `jkqtpstatLinearWeightedRegression()` uses the data from the range `datastore1->begin(colWLinE)` ... `datastore1->end(colWLinE)` directly as weights, but we calculated errors, which are inversely proportional to the weight of each data point when solving the least squares problem, as data points with larger errors should be weighted less than thos with smaller errors (outliers). + + +Again these two steps can be simplified using an "adaptor": +```.cpp + jkqtpstatAddLinearWeightedRegression(plot1->getPlotter(), + datastore1->begin(colLinX), datastore1->end(colLinX), + datastore1->begin(colLinY), datastore1->end(colLinY), + datastore1->begin(colWLinE), datastore1->end(colWLinE), + &coeffA, &coeffB, false, false, + &jkqtp_inversePropSaveDefault); +```... or even shorter: +```.cpp + jkqtpstatAddLinearWeightedRegression(graphD); +``` +Here the x- and y-columns from the `JKQTPXYGraph`-based graph `graphE` (see above) and the weights from the error column of `graphE` are used as datasources for the plot. This function implicitly uses the function `jkqtp_inversePropSaveDefault()` to convert plot errors to weights, as it is already clear that we are dealing with errors rather than direct weights. + +The plot resulting from any of the variants above looks like this: + +![jkqtplotter_simpletest_datastore_regression_linweight](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_datastore_regression_linweight.png) + +For this plot we also added a call to +```.cpp + jkqtpstatAddLinearRegression(graphE); +``` +which performs a simple non-weighted regression. The difference between the two resulting linear functions (blue: simple regression, green: weighted regression) demonstrates the influence of the weighting. + +# Linearizable Regression Models + +In addition to the simple linear regression model `f(x)=a+b*x`, it is also possible to fit a few non-linear models by transforming the data: + - power-law function`f(x)=a*x^b`, which is a linear function in a log-log-plot + - exponential function `f(x)=a*exp(b*x)`, which is a linear function in a semi-log-plot +The available models are defined in the enum `JKQTPStatRegressionModelType`. And there exists a function `jkqtpStatGenerateRegressionModel()`, which returns a C++-functor representing the function. + +To demonstrate these fitting options, we first generate data from an exponential and a power-law model. Note that we also add normally distributed errors, but in order to ensure that we do not obtain y-values <0, we use loops that draw normally distributed random numbers, until this condition is met: + +```.cpp + std::random_device rd; // random number generators: + std::mt19937 gen{rd()}; + std::normal_distribution<> d1{0,1}; + double a0_powerlaw=20; + double b0_powerlaw=0.25; + double a0_exp=5; + double b0_exp=0.5; + size_t colNLLinX=datastore1->addColumn("non-lin data, x"); + size_t colNLLinYExp=datastore1->addColumn("non-lin data, y, exponential model"); + size_t colNLLinYPow=datastore1->addColumn("non-lin data, y, power-law model"); + auto model_powerlaw=jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType::PowerLaw); + auto model_exp=jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType::Exponential); + for (double x=0.1; x<=10; x+=0.5) { + datastore1->appendToColumn(colNLLinX, x); + double ypow=model_powerlaw(x, a0_powerlaw, b0_powerlaw)+d1(gen); + while (ypow<0) { + ypow=model_powerlaw(x, a0_powerlaw, b0_powerlaw)+d1(gen); + } + datastore1->appendToColumn(colNLLinYPow, ypow); + double yexp=model_exp(x, a0_powerlaw, b0_powerlaw)+d1(gen); + while (yexp<0) { + yexp=model_exp(x, a0_powerlaw, b0_powerlaw)+d1(gen); + } + datastore1->appendToColumn(colNLLinYExp, model_exp(x, a0_exp, b0_exp)+d1(gen)); + } +``` + +The generated data is visualized with scatter-plots: +```.cpp + JKQTPXYLineGraph* graphD_powerlaw; + plot5->addGraph(graphD_powerlaw=new JKQTPXYLineGraph(plot5)); + graphD_powerlaw->setXYColumns(colNLLinX, colNLLinYPow); + graphD_powerlaw->setDrawLine(false); + graphD_powerlaw->setTitle(QString("data $%1+\\mathcal{N}(0,1)$").arg(jkqtpstatRegressionModel2Latex(JKQTPStatRegressionModelType::PowerLaw, a0_powerlaw, b0_powerlaw))); + JKQTPXYLineGraph* graphD_exp; + plot4->addGraph(graphD_exp=new JKQTPXYLineGraph(plot4)); + graphD_exp->setXYColumns(colNLLinX, colNLLinYExp); + graphD_exp->setDrawLine(false); + graphD_exp->setTitle(QString("data $%1+\\mathcal{N}(0,1)$").arg(jkqtpstatRegressionModel2Latex(JKQTPStatRegressionModelType::Exponential, a0_exp, b0_exp))); +``` + +Now we can fit the regression models using `jkqtpstatRegression()`, which receives the model type as first parameter: +```.cpp + double cA=0, cB=0; + JKQTPXFunctionLineGraph* gFunc; + jkqtpstatRegression(JKQTPStatRegressionModelType::Exponential, datastore1->begin(colNLLinX), datastore1->end(colNLLinX), datastore1->begin(colNLLinYExp), datastore1->end(colNLLinYExp), cA, cB); + plot4->addGraph(gFunc=new JKQTPXFunctionLineGraph(plot4)); + gFunc->setPlotFunctionFunctor(jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType::Exponential, cA, cB)); + gFunc->setTitle(QString("regression: $%1$").arg(jkqtpstatRegressionModel2Latex(JKQTPStatRegressionModelType::Exponential, cA, cB))); + cA=0; cB=0; + jkqtpstatRegression(JKQTPStatRegressionModelType::PowerLaw, datastore1->begin(colNLLinX), datastore1->end(colNLLinX), datastore1->begin(colNLLinYPow), datastore1->end(colNLLinYPow), cA, cB); + plot5->addGraph(gFunc=new JKQTPXFunctionLineGraph(plot5)); + gFunc->setPlotFunctionFunctor(jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType::PowerLaw, cA, cB)); + gFunc->setTitle(QString("regression: $%1$").arg(jkqtpstatRegressionModel2Latex(JKQTPStatRegressionModelType::PowerLaw, cA, cB))); +``` + +The regression models can be plotted using a `JKQTPXFunctionLineGraph`. the fucntion to plot is again generated by calling `jkqtpStatGenerateRegressionModel()`, but now with the parameters determined above the respective lines. Note that `jkqtpstatRegressionModel2Latex()` outputs the model as LaTeX string, which can be used as plot label. + +The resulting plot looks like this: + +![jkqtplotter_simpletest_datastore_regression_nonlinreg](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_datastore_regression_nonlinreg.png) + +Of course also "adaptors" exist that allow to perform the steps above in a single function call: + +```.cpp + jkqtpstatAddRegression(plot4->getPlotter(), JKQTPStatRegressionModelType::Exponential, datastore1->begin(colNLLinX), datastore1->end(colNLLinX), datastore1->begin(colNLLinYExp), datastore1->end(colNLLinYExp)); + jkqtpstatAddRegression(plot5->getPlotter(), JKQTPStatRegressionModelType::PowerLaw, datastore1->begin(colNLLinX), datastore1->end(colNLLinX), datastore1->begin(colNLLinYPow), datastore1->end(colNLLinYPow)); +``` +... or even shorter: +```.cpp + jkqtpstatAddRegression(graphD_exp, JKQTPStatRegressionModelType::Exponential); + jkqtpstatAddRegression(graphD_powerlaw, JKQTPStatRegressionModelType::PowerLaw); +``` + +Also note that we used the function `jkqtpstatRegression()` above, which performs a linear regression (internally uses `jkqtpstatLinearRegression()`). But there also exist variants for robust IRLS regression adn weighted regression: + - `jkqtpstatRobustIRLSRegression()` / `jkqtpstatAddRobustIRLSRegression()` + - `jkqtpstatWeightedRegression()` / `jkqtpstatAddWeightedRegression()` + + +# Polynom Fitting + +Finally the [statisticslibrary] also supports one option for non-linear model fitting, namely fitting of polynomial models. This is implemented in the function `jkqtpstatPolyFit()`. + +To demonstrate this function we first generate data from a poylnomial model (with gaussian noise): + +```.cpp + std::random_device rd; // random number generators: + std::mt19937 gen{rd()}; + std::normal_distribution<> d1{0,50}; + std::vector pPoly {1,2,-2,0.5}; + size_t colPolyX=datastore1->addColumn("polynomial data, x"); + size_t colPolyY=datastore1->addColumn("polynomial data, y"); + for (double x=-10; x<=10; x++) { + datastore1->appendToColumn(colPolyX, x); + datastore1->appendToColumn(colPolyY, jkqtpstatPolyEval(x, pPoly.begin(), pPoly.end())+d1(gen)); + } +``` +The function `jkqtpstatPolyEval()` is used to evaluate a given polynomial (coefficients in `pPoly`) at a position `x`. + +The generated data is visualized with scatter-plots: +```.cpp + JKQTPXYLineGraph* graphP; + plot6->addGraph(graphP=new JKQTPXYLineGraph(plot6)); + graphP->setXYColumns(colPolyX, colPolyY); + graphP->setDrawLine(false); + graphP->setTitle(QString("data $%1+\\mathcal{N}(0,50)$").arg(jkqtpstatPolynomialModel2Latex(pPoly.begin(), pPoly.end()))); +``` +Here the function `jkqtpstatPolynomialModel2Latex()` generates a string from a polynomial model. + +Now we can call `jkqtpstatPolyFit()` to fit different polynomial regression models to the data: +```.cpp + for (size_t p=0; p<=5; p++) { + std::vector pFit; + JKQTPXFunctionLineGraph* gPoly; + jkqtpstatPolyFit(datastore1->begin(colPolyX), datastore1->end(colPolyX), datastore1->begin(colPolyY), datastore1->end(colPolyY), p, std::back_inserter(pFit)); + plot6->addGraph(gPoly=new JKQTPXFunctionLineGraph(plot6)); + gPoly->setPlotFunctionFunctor(jkqtpstatGeneratePolynomialModel(pFit.begin(), pFit.end())); + gPoly->setTitle(QString("regression: $%1$").arg(jkqtpstatPolynomialModel2Latex(pFit.begin(), pFit.end()))); + } +``` +Each model is also ploted using a `JKQTPXFunctionLineGraph`. The plot function assigned to these `JKQTPXFunctionLineGraph` is generated by calling `jkqtpstatGeneratePolynomialModel()`, which returns a C++-functor for a polynomial. + +The resulting plots look like this (without added gaussian noise): + +![jkqtplotter_simpletest_datastore_regression_polynom](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_datastore_regression_polynom.png) + +... and with added gaussian noise: + +![jkqtplotter_simpletest_datastore_regression_polynom_errros](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_datastore_regression_polynom_errros.png) + +Of course also the "adaptor" shortcuts are available: +```.cpp + for (size_t p=0; p<=5; p++) { + jkqtpstatAddPolyFit(plot6->getPlotter(), datastore1->begin(colPolyX), datastore1->end(colPolyX), datastore1->begin(colPolyY), datastore1->end(colPolyY), p); + jkqtpstatAddPolyFit(graphP, p); + } +``` + +# Screenshot of the full Program + +The output of the full test program [`jkqtplotter_simpletest_datastore_regression.cpp`](https://github.com/jkriege2/JKQtPlotter/tree/master/examples/simpletest_datastore_statistics/jkqtplotter_simpletest_datastore_regression.cpp) looks like this: + +![jkqtplotter_simpletest_datastore_regression](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_datastore_regression.png) + + diff --git a/examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression.cpp b/examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression.cpp new file mode 100644 index 0000000000..a96434ccc0 --- /dev/null +++ b/examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression.cpp @@ -0,0 +1,327 @@ +/** \example jkqtplotter_simpletest_datastore_regression.cpp + * Explains how to use the internal statistics library (see \ref jkqtptools_statistics ) together with JKQTPDatastore to perform different types of regression and polynomial fitting. + * + * \ref JKQTPlotterBasicJKQTPDatastoreRegression + */ + +#include +#include "jkqtplotter/jkqtplotter.h" +#include "jkqtplotter/jkqtpgraphspeakstream.h" +#include "jkqtplotter/jkqtpgraphsboxplot.h" +#include "jkqtplotter/jkqtpgraphsstatisticsadaptors.h" +#include "jkqtplotter/jkqtpgraphsevaluatedfunction.h" +#include "jkqtcommon/jkqtpstatisticstools.h" +#include "jkqtcommon/jkqtpstringtools.h" +#include +#include + + +int main(int argc, char* argv[]) +{ + QApplication app(argc, argv); + + + // 1. create a window with several plotters and get a pointer to the internal datastores (for convenience) + QWidget mainWidget; + QGridLayout* lay; + mainWidget.setLayout(lay=new QGridLayout); + JKQTPlotter* plot1=new JKQTPlotter(&mainWidget); + plot1->getPlotter()->setPlotLabel("Simple Linear Regression"); + JKQTPDatastore* datastore1=plot1->getDatastore(); + lay->addWidget(plot1,0,0); + JKQTPlotter *plot2=new JKQTPlotter(datastore1, &mainWidget); + plot2->getPlotter()->setPlotLabel("Weighted Linear Regression"); + lay->addWidget(plot2,1,0); + JKQTPlotter* plot3=new JKQTPlotter(datastore1, &mainWidget); + plot3->getPlotter()->setPlotLabel("Robust Linear Regression"); + lay->addWidget(plot3,0,1); + JKQTPlotter *plot6=new JKQTPlotter(datastore1, &mainWidget); + plot6->getPlotter()->setPlotLabel("Polynomial Fitting"); + lay->addWidget(plot6,1,1); + JKQTPlotter* plot4=new JKQTPlotter(datastore1, &mainWidget); + plot4->getPlotter()->setPlotLabel("Exponential Regression"); + lay->addWidget(plot4,0,2); + JKQTPlotter* plot5=new JKQTPlotter(datastore1, &mainWidget); + plot5->getPlotter()->setPlotLabel("Power-Law Regression"); + lay->addWidget(plot5,1,2); + + + // 2.1. To demonstrate linear regression, we create a dataset with a linear dependence between two + // columns and added gaussian noise + std::random_device rd; // random number generators: + std::mt19937 gen{rd()}; + std::normal_distribution<> d1{0,1}; + double a0=-5; + double b0=2; + size_t colLinX=datastore1->addColumn("lin data, x"); + size_t colLinY=datastore1->addColumn("lin data, y"); + for (double x=-5; x<=10; x++) { + datastore1->appendToColumn(colLinX, x); + datastore1->appendToColumn(colLinY, a0+b0*x+d1(gen)); + } + // we visualize this data with a simple scatter graph: + JKQTPXYLineGraph* graphD; + plot1->addGraph(graphD=new JKQTPXYLineGraph(plot1)); + graphD->setXYColumns(colLinX, colLinY); + graphD->setDrawLine(false); + graphD->setTitle(QString("data $f(x)=%1+%2\\cdot x+\\mathcal{N}(0,1)$").arg(jkqtp_floattolatexqstr(a0,1)).arg(jkqtp_floattolatexqstr(b0,1))); + // 2.2. Now we calculate the regression line and add a plot to the graph: + /*double coeffA=0, coeffB=0; + jkqtpstatLinearRegression(datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY), coeffA, coeffB); + JKQTPXFunctionLineGraph *graphRegLine=new JKQTPXFunctionLineGraph(plot1); + graphRegLine->setSpecialFunction(JKQTPXFunctionLineGraph::SpecialFunction::Line); + graphRegLine->setParamsV(coeffA, coeffB); + graphRegLine->setTitle(QString("regression: $f(x) = %1 + %2 \\cdot x$").arg(jkqtp_floattolatexqstr(coeffA)).arg(jkqtp_floattolatexqstr(coeffB))); + plot1->addGraph(graphRegLine);*/ + // this code can also be written with one function call, using the "adaptor" jkqtpstatAddLinearRegression(): + //jkqtpstatAddLinearRegression(plot1->getPlotter(), datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY)); + // or even shorter: + jkqtpstatAddLinearRegression(graphD); + + + + // 3.1. We extend the example above by + //std::random_device rd; // random number generators: + //std::mt19937 gen{rd()}; + std::uniform_real_distribution<> de{0.5,1.5}; + std::uniform_int_distribution<> ddecide{0,4}; + //double a0=-5; + //double b0=2; + size_t colWLinX=datastore1->addColumn("wlin data, x"); + size_t colWLinY=datastore1->addColumn("wlin data, y"); + size_t colWLinE=datastore1->addColumn("wlin data, errors"); + for (double x=-5; x<=10; x++) { + double factor=1; + if (ddecide(gen)==4) { + factor=4; + } + const double err=de(gen)*factor; + datastore1->appendToColumn(colWLinX, x); + datastore1->appendToColumn(colWLinY, a0+b0*x+err); + datastore1->appendToColumn(colWLinE, err); + } + // we visualize this data with a simple scatter graph: + JKQTPXYLineErrorGraph* graphE; + plot2->addGraph(graphE=new JKQTPXYLineErrorGraph(plot2)); + graphE->setXYColumns(colWLinX, colWLinY); + graphE->setYErrorColumn(static_cast(colWLinE)); + graphE->setDrawLine(false); + graphE->setTitle(QString("data $f(x)=%1+%2\\cdot x+\\mbox{Noise}$").arg(jkqtp_floattolatexqstr(a0,1)).arg(jkqtp_floattolatexqstr(b0,1))); + // 2.2. Now we calculate the regression line and add a plot to the graph: + /*double coeffA=0, coeffB=0; + jkqtpstatLinearWeightedRegression(datastore1->begin(colWLinX), datastore1->end(colWLinX), + datastore1->begin(colWLinY), datastore1->end(colWLinY), + datastore1->begin(colWLinE), datastore1->end(colWLinE), + coeffA, coeffB, false, false, + &jkqtp_inversePropSaveDefault); + // note that in addition to the three data-columns we also provided a C++ functor + // jkqtp_inversePropSaveDefault(), which calculates 1/error. This is done, because the function + // jkqtpstatLinearWeightedRegression() uses the data from the range datastore1->begin(colWLinE) ... datastore1->end(colWLinE) + // directly as weights, but we calculated errors, which are inversely proportional to the + // weight of each data point when solving the least squares problem, as data points with + // larger errors should be weighted less than thos with smaller errors + // + // Now we can plot the resulting linear function: + JKQTPXFunctionLineGraph *graphRegLine=new JKQTPXFunctionLineGraph(plot2); + graphRegLine->setSpecialFunction(JKQTPXFunctionLineGraph::SpecialFunction::Line); + graphRegLine->setParamsV(coeffA, coeffB); + graphRegLine->setTitle(QString("weighted regression: $f(x) = %1 + %2 \\cdot x$").arg(jkqtp_floattolatexqstr(coeffA)).arg(jkqtp_floattolatexqstr(coeffB))); + plot2->addGraph(graphRegLine);*/ + // this code can also be written with one function call, using the "adaptor" jkqtpstatAddLinearRegression(): + //jkqtpstatAddLinearWeightedRegression(plot2->getPlotter(), + // datastore1->begin(colLinX), datastore1->end(colLinX), + // datastore1->begin(colLinY), datastore1->end(colLinY), + // datastore1->begin(colWLinE), datastore1->end(colWLinE), + // &coeffA, &coeffB, false, false, + // &jkqtp_inversePropSaveDefault); + + // or even shorter: + jkqtpstatAddLinearWeightedRegression(graphE); + // to demonstrate the effect of the weighting, we also add a simple linear regression that + // does not take into account the errors: + jkqtpstatAddLinearRegression(graphE); + + + + // 4.1. To demonstrate IRLS linear regression, we create a dataset with a linear dependence between two + // columns and added gaussian noise and some outliers + //std::random_device rd; // random number generators: + //std::mt19937 gen{rd()}; + //std::normal_distribution<> d1{0,1}; + //double a0=-5; + //double b0=2; + size_t colRLinX=datastore1->addColumn("lin data, x"); + size_t colRLinY=datastore1->addColumn("lin data, y"); + for (double x=-5; x<=10; x++) { + datastore1->appendToColumn(colRLinX, x); + if (jkqtp_approximatelyEqual(x, -5)||jkqtp_approximatelyEqual(x, -3)) datastore1->appendToColumn(colRLinY, a0+b0*x+d1(gen)+12); + else datastore1->appendToColumn(colRLinY, a0+b0*x+d1(gen)); + } + // we visualize this data with a simple scatter graph: + //JKQTPXYLineGraph* graphD; + plot3->addGraph(graphD=new JKQTPXYLineGraph(plot3)); + graphD->setXYColumns(colRLinX, colRLinY); + graphD->setDrawLine(false); + graphD->setTitle(QString("data $f(x)=%1+%2\\cdot x+\\mathcal{N}(0,1)$").arg(jkqtp_floattolatexqstr(a0,1)).arg(jkqtp_floattolatexqstr(b0,1))); + // 4.2. Now we calculate the regression line and add a plot to the graph: + double coeffA=0, coeffB=0; + jkqtpstatRobustIRLSLinearRegression(datastore1->begin(colRLinX), datastore1->end(colRLinX), datastore1->begin(colRLinY), datastore1->end(colRLinY), coeffA, coeffB); + JKQTPXFunctionLineGraph *graphRegLine=new JKQTPXFunctionLineGraph(plot3); + graphRegLine->setSpecialFunction(JKQTPXFunctionLineGraph::SpecialFunction::Line); + graphRegLine->setParamsV(coeffA, coeffB); + graphRegLine->setTitle(QString("robust regression: $f(x) = %1 + %2 \\cdot x$, $p=1.1$").arg(jkqtp_floattolatexqstr(coeffA)).arg(jkqtp_floattolatexqstr(coeffB))); + plot3->addGraph(graphRegLine); + // this code can also be written with one function call, using the "adaptor" jkqtpstatAddLinearRegression(): + //jkqtpstatAddRobustIRLSLinearRegression(plot3->getPlotter(), datastore1->begin(colRLinX), datastore1->end(colRLinX), datastore1->begin(colRLinY), datastore1->end(colRLinY)); + // or even shorter: + //jkqtpstatAddRobustIRLSLinearRegression(graphD); + // as a comparison, we also add the result of the normal/non-robust linear regression: + jkqtpstatAddLinearRegression(graphD); + + // the following code demonstrates the influence of the rgularization parameter p: + // - the closer it is to 1, the more robust the fit is (it is closer to the L1-norm) + // - the closer it is to 2, the closer the fit is to the least squares solution (i.e. the normal regression) + double p; + p=1.1; + auto g=jkqtpstatAddRobustIRLSLinearRegression(graphD, nullptr, nullptr, false, false, p); + g->setTitle(g->getTitle()+", $p="+jkqtp_floattolatexqstr(p)+"$"); + p=1.5; + g=jkqtpstatAddRobustIRLSLinearRegression(graphD, nullptr, nullptr, false, false, p); + g->setTitle(g->getTitle()+", $p="+jkqtp_floattolatexqstr(p)+"$"); + p=1.7; + g=jkqtpstatAddRobustIRLSLinearRegression(graphD, nullptr, nullptr, false, false, p); + g->setTitle(g->getTitle()+", $p="+jkqtp_floattolatexqstr(p)+"$"); + p=2; + g=jkqtpstatAddRobustIRLSLinearRegression(graphD, nullptr, nullptr, false, false, p); + g->setTitle(g->getTitle()+", $p="+jkqtp_floattolatexqstr(p)+"$"); + + + + // 5.1. The functions for linear regression can also be used to calculate some non-linear models by transforming the input data. + // This is also supported by the statistics library. the supported models are defined in JKQTPStatRegressionModelType + //std::random_device rd; // random number generators: + //std::mt19937 gen{rd()}; + //std::normal_distribution<> d1{0,1}; + double a0_powerlaw=20; + double b0_powerlaw=0.25; + double a0_exp=5; + double b0_exp=0.5; + size_t colNLLinX=datastore1->addColumn("non-lin data, x"); + size_t colNLLinYExp=datastore1->addColumn("non-lin data, y, exponential model"); + size_t colNLLinYPow=datastore1->addColumn("non-lin data, y, power-law model"); + auto model_powerlaw=jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType::PowerLaw); + auto model_exp=jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType::Exponential); + for (double x=0.1; x<=10; x+=0.5) { + datastore1->appendToColumn(colNLLinX, x); + double ypow=model_powerlaw(x, a0_powerlaw, b0_powerlaw)+d1(gen); + while (ypow<0) { + ypow=model_powerlaw(x, a0_powerlaw, b0_powerlaw)+d1(gen); + } + datastore1->appendToColumn(colNLLinYPow, ypow); + double yexp=model_exp(x, a0_powerlaw, b0_powerlaw)+d1(gen); + while (yexp<0) { + yexp=model_exp(x, a0_powerlaw, b0_powerlaw)+d1(gen); + } + datastore1->appendToColumn(colNLLinYExp, model_exp(x, a0_exp, b0_exp)+d1(gen)); + } + // we visualize this data with a simple scatter graphs: + JKQTPXYLineGraph* graphD_powerlaw; + plot5->addGraph(graphD_powerlaw=new JKQTPXYLineGraph(plot5)); + graphD_powerlaw->setXYColumns(colNLLinX, colNLLinYPow); + graphD_powerlaw->setDrawLine(false); + graphD_powerlaw->setTitle(QString("data $%1+\\mathcal{N}(0,1)$").arg(jkqtpstatRegressionModel2Latex(JKQTPStatRegressionModelType::PowerLaw, a0_powerlaw, b0_powerlaw))); + JKQTPXYLineGraph* graphD_exp; + plot4->addGraph(graphD_exp=new JKQTPXYLineGraph(plot4)); + graphD_exp->setXYColumns(colNLLinX, colNLLinYExp); + graphD_exp->setDrawLine(false); + graphD_exp->setTitle(QString("data $%1+\\mathcal{N}(0,1)$").arg(jkqtpstatRegressionModel2Latex(JKQTPStatRegressionModelType::Exponential, a0_exp, b0_exp))); + // 5.2. Now we calculate the regression models and add a plot to the graph: + double cA=0, cB=0; + JKQTPXFunctionLineGraph* gFunc; + jkqtpstatRegression(JKQTPStatRegressionModelType::Exponential, datastore1->begin(colNLLinX), datastore1->end(colNLLinX), datastore1->begin(colNLLinYExp), datastore1->end(colNLLinYExp), cA, cB); + plot4->addGraph(gFunc=new JKQTPXFunctionLineGraph(plot4)); + gFunc->setPlotFunctionFunctor(jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType::Exponential, cA, cB)); + gFunc->setTitle(QString("regression: $%1$").arg(jkqtpstatRegressionModel2Latex(JKQTPStatRegressionModelType::Exponential, cA, cB))); + cA=0; cB=0; + jkqtpstatRegression(JKQTPStatRegressionModelType::PowerLaw, datastore1->begin(colNLLinX), datastore1->end(colNLLinX), datastore1->begin(colNLLinYPow), datastore1->end(colNLLinYPow), cA, cB); + plot5->addGraph(gFunc=new JKQTPXFunctionLineGraph(plot5)); + gFunc->setPlotFunctionFunctor(jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType::PowerLaw, cA, cB)); + gFunc->setTitle(QString("regression: $%1$").arg(jkqtpstatRegressionModel2Latex(JKQTPStatRegressionModelType::PowerLaw, cA, cB))); + // Note: Here we used the normal linear regression functions, but variants for IRLS and weighted regression are also available! + // 5.3. Of course also adaptors exist: + //jkqtpstatAddRegression(plot4->getPlotter(), JKQTPStatRegressionModelType::Exponential, datastore1->begin(colNLLinX), datastore1->end(colNLLinX), datastore1->begin(colNLLinYExp), datastore1->end(colNLLinYExp)); + //jkqtpstatAddRegression(plot5->getPlotter(), JKQTPStatRegressionModelType::PowerLaw, datastore1->begin(colNLLinX), datastore1->end(colNLLinX), datastore1->begin(colNLLinYPow), datastore1->end(colNLLinYPow)); + //jkqtpstatAddRegression(graphD_exp, JKQTPStatRegressionModelType::Exponential); + //jkqtpstatAddRegression(graphD_powerlaw, JKQTPStatRegressionModelType::PowerLaw); + + + + + // 6.1. To demonstrate polynomial fitting, we generate data for a polynomial model + std::vector pPoly {1,2,-2,0.5}; + size_t colPolyX=datastore1->addColumn("polynomial data, x"); + size_t colPolyY=datastore1->addColumn("polynomial data, y"); + for (double x=-10; x<=10; x++) { + datastore1->appendToColumn(colPolyX, x); + datastore1->appendToColumn(colPolyY, jkqtpstatPolyEval(x, pPoly.begin(), pPoly.end())+d1(gen)*50.0); + } + // we visualize this data with a simple scatter graph: + JKQTPXYLineGraph* graphP; + plot6->addGraph(graphP=new JKQTPXYLineGraph(plot6)); + graphP->setXYColumns(colPolyX, colPolyY); + graphP->setDrawLine(false); + graphP->setTitle(QString("data $%1+\\mathcal{N}(0,50)$").arg(jkqtpstatPolynomialModel2Latex(pPoly.begin(), pPoly.end()))); + // 6.2. now we can fit polynomials with different number of coefficients: + for (size_t p=0; p<=5; p++) { + std::vector pFit; + JKQTPXFunctionLineGraph* gPoly; + jkqtpstatPolyFit(datastore1->begin(colPolyX), datastore1->end(colPolyX), datastore1->begin(colPolyY), datastore1->end(colPolyY), p, std::back_inserter(pFit)); + plot6->addGraph(gPoly=new JKQTPXFunctionLineGraph(plot6)); + gPoly->setPlotFunctionFunctor(jkqtpstatGeneratePolynomialModel(pFit.begin(), pFit.end())); + gPoly->setTitle(QString("regression: $%1$").arg(jkqtpstatPolynomialModel2Latex(pFit.begin(), pFit.end()))); + } + // 6.3. of course also the "adaptor" shortcuts are available: + //for (size_t p=0; p<=5; p++) { + // jkqtpstatAddPolyFit(plot6->getPlotter(), datastore1->begin(colPolyX), datastore1->end(colPolyX), datastore1->begin(colPolyY), datastore1->end(colPolyY), p); + // jkqtpstatAddPolyFit(graphP, p); + //} + + + + + + // autoscale the plot so the graph is contained + plot1->zoomToFit(); + plot1->getXAxis()->setShowZeroAxis(false); + plot1->getYAxis()->setShowZeroAxis(false); + plot1->getPlotter()->setKeyPosition(JKQTPKeyPosition::JKQTPKeyInsideTopLeft); + plot2->zoomToFit(); + plot2->getXAxis()->setShowZeroAxis(false); + plot2->getYAxis()->setShowZeroAxis(false); + plot2->getPlotter()->setKeyPosition(JKQTPKeyPosition::JKQTPKeyInsideTopLeft); + plot3->zoomToFit(); + plot3->getXAxis()->setShowZeroAxis(false); + plot3->getYAxis()->setShowZeroAxis(false); + plot3->getPlotter()->setKeyPosition(JKQTPKeyPosition::JKQTPKeyInsideTopLeft); + plot4->zoomToFit(); + plot4->getXAxis()->setShowZeroAxis(false); + plot4->getYAxis()->setShowZeroAxis(false); + plot4->getPlotter()->setKeyPosition(JKQTPKeyPosition::JKQTPKeyInsideTopLeft); + plot4->setAbsoluteX(0.05, plot4->getXMax()); + plot4->zoomToFit(); + plot5->getXAxis()->setShowZeroAxis(false); + plot5->getYAxis()->setShowZeroAxis(false); + plot5->getPlotter()->setKeyPosition(JKQTPKeyPosition::JKQTPKeyInsideTopLeft); + plot5->setAbsoluteX(0.05, plot5->getXMax()); + plot5->zoomToFit(); + plot6->getXAxis()->setShowZeroAxis(false); + plot6->getYAxis()->setShowZeroAxis(false); + plot6->getPlotter()->setKeyPosition(JKQTPKeyPosition::JKQTPKeyInsideBottomRight); + plot6->zoomToFit(); + + // show plotter and make it a decent size + mainWidget.show(); + mainWidget.resize(1600,800); + + return app.exec(); +} diff --git a/examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression.pro b/examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression.pro new file mode 100644 index 0000000000..c7337b2806 --- /dev/null +++ b/examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression.pro @@ -0,0 +1,27 @@ +# source code for this simple demo +SOURCES = jkqtplotter_simpletest_datastore_regression.cpp + +# configure Qt +CONFIG += link_prl qt +QT += core gui xml svg +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport + +# output executable name +TARGET = jkqtplotter_simpletest_datastore_regression + +# include JKQTPlotter source headers and link against library +DEPENDPATH += ../../lib ../../staticlib/jkqtplotterlib +INCLUDEPATH += ../../lib +CONFIG (debug, debug|release) { + LIBS += -L../../staticlib/jkqtplotterlib/debug -ljkqtplotterlib_debug +} else { + LIBS += -L../../staticlib/jkqtplotterlib/release -ljkqtplotterlib +} +message("LIBS = $$LIBS") + +win32-msvc*: DEFINES += _USE_MATH_DEFINES +win32-msvc*: DEFINES += NOMINMAX + + + + diff --git a/examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression_and_lib.pro b/examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression_and_lib.pro new file mode 100644 index 0000000000..43f256e5fa --- /dev/null +++ b/examples/simpletest_datastore_regression/jkqtplotter_simpletest_datastore_regression_and_lib.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs + +SUBDIRS += jkqtplotterlib jkqtplotter_simpletest_datastore_regression + +jkqtplotterlib.file = ../../staticlib/jkqtplotterlib/jkqtplotterlib.pro + +jkqtplotter_simpletest_datastore_regression.file=$$PWD/jkqtplotter_simpletest_datastore_regression.pro +jkqtplotter_simpletest_datastore_regression.depends = jkqtplotterlib diff --git a/examples/simpletest_datastore_statistics/README.md b/examples/simpletest_datastore_statistics/README.md index 2b64ae3479..273dc56132 100644 --- a/examples/simpletest_datastore_statistics/README.md +++ b/examples/simpletest_datastore_statistics/README.md @@ -1,8 +1,10 @@ # Tutorial (JKQTPDatastore): Advanced 1-Dimensional Statistics with JKQTPDatastore {#JKQTPlotterBasicJKQTPDatastoreStatistics} + [JKQTPlotterBasicJKQTPDatastore]: @ref JKQTPlotterBasicJKQTPDatastore "Basic Usage of JKQTPDatastore" [JKQTPlotterBasicJKQTPDatastoreIterators]: @ref JKQTPlotterBasicJKQTPDatastoreIterators "Iterator-Based usage of JKQTPDatastore" [JKQTPlotterBasicJKQTPDatastoreStatistics]: @ref JKQTPlotterBasicJKQTPDatastoreStatistics "Advanced 1-Dimensional Statistics with JKQTPDatastore" +[JKQTPlotterBasicJKQTPDatastoreRegression]: @ref JKQTPlotterBasicJKQTPDatastoreRegression "Regression Analysis (with the Statistics Library)" [statisticslibrary]: @ref jkqtptools_math_statistics "JKQTPlotter Statistics Library" @@ -12,6 +14,7 @@ This tutorial project (see `./examples/simpletest_datastore_statistics/`) explai - [JKQTPlotterBasicJKQTPDatastore] - [JKQTPlotterBasicJKQTPDatastoreIterators] - [JKQTPlotterBasicJKQTPDatastoreStatistics] + - [JKQTPlotterBasicJKQTPDatastoreRegression] [TOC] diff --git a/lib/jkqtcommon/jkqtplinalgtools.h b/lib/jkqtcommon/jkqtplinalgtools.h index 8ca6287a11..0cf65d8122 100644 --- a/lib/jkqtcommon/jkqtplinalgtools.h +++ b/lib/jkqtcommon/jkqtplinalgtools.h @@ -389,13 +389,13 @@ inline void jkqtplinalgMatrixProduct(const T* M1, long L1, long C1, const T* M2, } } else if (M1==M && M2!=M) { JKQTPArrayScopedPointer MM(jkqtpArrayDuplicate(M1, L1*C1)); - jkqtplinalgMatrixProduct(MM,L1,C1,M2,L2,C2,M); + jkqtplinalgMatrixProduct(MM.data(),L1,C1,M2,L2,C2,M); } else if (M1!=M && M2==M) { JKQTPArrayScopedPointer MM(jkqtpArrayDuplicate(M1, L1*C1)); - jkqtplinalgMatrixProduct(M1,L1,C1,MM,L2,C2,M); + jkqtplinalgMatrixProduct(M1,L1,C1,MM.data(),L2,C2,M); } else if (M1==M && M2==M) { JKQTPArrayScopedPointer MM(jkqtpArrayDuplicate(M1, L1*C1)); - jkqtplinalgMatrixProduct(MM,L1,C1,MM,L2,C2,M); + jkqtplinalgMatrixProduct(MM.data(),L1,C1,MM.data(),L2,C2,M); } } @@ -581,7 +581,7 @@ inline bool jkqtplinalgMatrixInversion(const T* matrix, T* matrix_out, long N) { } - bool ok=linalgGaussJordanV(m, N, 2*N); + bool ok=jkqtplinalgGaussJordan(m.data(), N, 2*N); if (ok) { // finally we copy the result to matrix_out @@ -714,7 +714,7 @@ inline bool jkqtplinalgLinSolve(const T* A, const T* B, long N, long C, T* resul } - bool ok=linalgGaussJordan(m.data(), N, N+C); + bool ok=jkqtplinalgGaussJordan(m.data(), N, N+C); if (ok) { for (long k=0; k=0) \ingroup jkqtptools_math_basic */ template inline T jkqtp_sign(T x) { if (x<0) return -1; - //else if (x==0) return 0; else return 1; } +/** \brief returns the inversely proportional value 1/\a v of \a v + * \ingroup jkqtptools_math_basic */ +template +inline T jkqtp_inverseProp(const T& v) { + return T(1.0)/v; +} + +/** \brief returns the inversely proportional value 1/\a v of \a v and ensures that \f$ |v|\geq \mbox{absMinV} \f$ + * \ingroup jkqtptools_math_basic */ +template +inline T jkqtp_inversePropSave(const T& v, const T& absMinV) { + T vv=v; + if (fabs(vv)::epsilon()*100.0 + * \ingroup jkqtptools_math_basic */ +template +inline T jkqtp_inversePropSaveDefault(const T& v) { + return jkqtp_inversePropSave(v, std::numeric_limits::epsilon()*100.0); +} + + /** \brief calculate the distance between two QPointF points * \ingroup jkqtptools_math_basic * diff --git a/lib/jkqtcommon/jkqtpstatisticstools.cpp b/lib/jkqtcommon/jkqtpstatisticstools.cpp index 956df70b01..d351ba4905 100644 --- a/lib/jkqtcommon/jkqtpstatisticstools.cpp +++ b/lib/jkqtcommon/jkqtpstatisticstools.cpp @@ -104,3 +104,61 @@ double JKQTPStat5NumberStatistics::IQR() const { double JKQTPStat5NumberStatistics::IQRSignificanceEstimate() const { return 2.0*(1.58*(IQR()))/sqrt(static_cast(N)); } + +std::function jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType type) { + switch(type) { + case JKQTPStatRegressionModelType::Linear: return [](double x, double a, double b)->double { return a+b*x; }; + case JKQTPStatRegressionModelType::PowerLaw: return [](double x, double a, double b)->double { return a*pow(x,b); }; + case JKQTPStatRegressionModelType::Exponential: return [](double x, double a, double b)->double { return a*exp(b*x); }; + } + throw std::runtime_error("unknown JKQTPStatRegressionModelType in jkqtpStatGenerateRegressionModel()"); +} + +QString jkqtpstatRegressionModel2Latex(JKQTPStatRegressionModelType type, double a, double b) { + switch(type) { + case JKQTPStatRegressionModelType::Linear: return QString("f(x)=%1+%2{\\cdot}x").arg(jkqtp_floattolatexqstr(a, 3)).arg(jkqtp_floattolatexqstr(b, 3)); + case JKQTPStatRegressionModelType::PowerLaw: return QString("f(x)=%1{\\cdot}x^{%2}").arg(jkqtp_floattolatexqstr(a, 3)).arg(jkqtp_floattolatexqstr(b, 3)); + case JKQTPStatRegressionModelType::Exponential: return QString("f(x)=%1{\\cdot}\\exp(%2{\\cdot}x)").arg(jkqtp_floattolatexqstr(a, 3)).arg(jkqtp_floattolatexqstr(b, 3)); + } + throw std::runtime_error("unknown JKQTPStatRegressionModelType in jkqtpstatRegressionModel2Latex()"); +} + +std::function jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType type, double a, double b) { + auto res=jkqtpStatGenerateRegressionModel(type); + return std::bind(res, std::placeholders::_1, a, b); +} + +std::pair, std::function > jkqtpStatGenerateTransformation(JKQTPStatRegressionModelType type) { + auto logF=[](double x)->double { return log(x); }; + auto idF=&jkqtp_identity; + switch(type) { + case JKQTPStatRegressionModelType::Linear: return std::pair,std::function >(idF, idF); + case JKQTPStatRegressionModelType::PowerLaw: return std::pair,std::function >(logF, logF); + case JKQTPStatRegressionModelType::Exponential: return std::pair,std::function >(idF, logF); + } + throw std::runtime_error("unknown JKQTPStatRegressionModelType in jkqtpStatGenerateTransformation()"); +} + +std::pair, std::function > jkqtpStatGenerateParameterATransformation(JKQTPStatRegressionModelType type) { + auto logF=[](double x)->double { return log(x); }; + auto expF=[](double x)->double { return exp(x); }; + auto idF=&jkqtp_identity; + switch(type) { + case JKQTPStatRegressionModelType::Linear: return std::pair,std::function >(idF, idF); + case JKQTPStatRegressionModelType::PowerLaw: return std::pair,std::function >(logF, expF); + case JKQTPStatRegressionModelType::Exponential: return std::pair,std::function >(logF, expF); + } + throw std::runtime_error("unknown JKQTPStatRegressionModelType in jkqtpStatGenerateTransformation()"); +} + +std::pair, std::function > jkqtpStatGenerateParameterBTransformation(JKQTPStatRegressionModelType type) { + //auto logF=[](double x)->double { return log(x); }; + //auto expF=[](double x)->double { return exp(x); }; + auto idF=&jkqtp_identity; + switch(type) { + case JKQTPStatRegressionModelType::Linear: return std::pair,std::function >(idF, idF); + case JKQTPStatRegressionModelType::PowerLaw: return std::pair,std::function >(idF, idF); + case JKQTPStatRegressionModelType::Exponential: return std::pair,std::function >(idF, idF); + } + throw std::runtime_error("unknown JKQTPStatRegressionModelType in jkqtpStatGenerateTransformation()"); +} diff --git a/lib/jkqtcommon/jkqtpstatisticstools.h b/lib/jkqtcommon/jkqtpstatisticstools.h index 3dc11614d1..4c35b07634 100644 --- a/lib/jkqtcommon/jkqtpstatisticstools.h +++ b/lib/jkqtcommon/jkqtpstatisticstools.h @@ -37,13 +37,7 @@ #include "jkqtcommon/jkqtp_imexport.h" #include "jkqtcommon/jkqtplinalgtools.h" #include "jkqtcommon/jkqtparraytools.h" - - -#ifdef _OPENMP -# include -#endif - - +#include "jkqtcommon/jkqtptoolsdebugging.h" @@ -1801,6 +1795,612 @@ inline void jkqtpstatKDE1D(InputIt first, InputIt last, double binXLeft, double + + + + +/*! \brief calculate the linear regression coefficients for a given data range \a firstX / \a firstY ... \a lastX / \a lastY where the model is \f$ f(x)=a+b\cdot x \f$ + So this function solves the least-squares optimization problem: \f[ (a^\ast, b^\ast)=\argmin\limits_{a,b}\sum\limits_i\left(y_i-(a+b\cdot x_i)\right)^2 \f] + \ingroup jkqtptools_math_statistics_regression + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used + + This function computes internally: + \f[ a=\overline{y}-b\cdot\overline{x} \f] + \f[ b=\frac{\sum x_iy_i-N\cdot\overline{x}\cdot\overline{y}}{\sum x_i^2-N\cdot(\overline{x})^2} \f] + + \image html jkqtplotter_simpletest_datastore_regression_lin.png +*/ +template +inline void jkqtpstatLinearRegression(InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double& coeffA, double& coeffB, bool fixA=false, bool fixB=false) { + if (fixA&&fixB) return; + const int Nx=std::distance(firstX,lastX); + const int Ny=std::distance(firstY,lastY); + + JKQTPASSERT(Nx>1 && Ny>1); + + double sumx=0, sumy=0, sumxy=0, sumx2=0; + size_t N=0; + auto itX=firstX; + auto itY=firstY; + for (; itX!=lastX && itY!=lastY; ++itX, ++itY) { + const double fit_x=jkqtp_todouble(*itX); + const double fit_y=jkqtp_todouble(*itY); + if (JKQTPIsOKFloat(fit_x) && JKQTPIsOKFloat(fit_y)) { + sumx=sumx+fit_x; + sumy=sumy+fit_y; + sumxy=sumxy+fit_x*fit_y; + sumx2=sumx2+fit_x*fit_x; + N++; + } + } + const double NN=static_cast(N); + JKQTPASSERT_M(NN>1, "too few datapoints"); + if (!fixA && !fixB) { + coeffB=(double(sumxy)-double(sumx)*double(sumy)/NN)/(double(sumx2)-double(sumx)*double(sumx)/NN);; + coeffA=double(sumy)/NN-coeffB*double(sumx)/NN; + } else if (fixA && !fixB) { + coeffB=(double(sumy)/NN-coeffA)/(double(sumx)/NN); + } else if (!fixA && fixB) { + coeffA=double(sumy)/NN-coeffB*double(sumx)/NN; + } +} + + +/*! \brief calculate the weighted linear regression coefficients for a given for a given data range \a firstX / \a firstY / \a firstW ... \a lastX / \a lastY / \a lastW where the model is \f$ f(x)=a+b\cdot x \f$ + So this function solves the least-squares optimization problem: \f[ (a^\ast, b^\ast)=\argmin\limits_{a,b}\sum\limits_iw_i^2\cdot\left(y_i-(a+b\cdot x_i)\right)^2 \f] + \ingroup jkqtptools_math_statistics_regression + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \tparam InputItW standard iterator type of \a firstW and \a lastW. + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param firstW iterator pointing to the first item in the weight-dataset to use \f$ w_1 \f$ + \param lastW iterator pointing behind the last item in the weight-dataset to use \f$ w_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used + \param fWeightDataToWi an optional function, which is applied to the data from \a firstW ... \a lastW to convert them to weight, i.e. \c wi=fWeightDataToWi(*itW) + e.g. if you use data used to draw error bars, you can use jkqtp_inversePropSaveDefault(). The default is jkqtp_identity(), which just returns the values. + In the case of jkqtp_inversePropSaveDefault(), a datapoint x,y, has a large weight, if it's error is small and in the case if jkqtp_identity() it's weight + is directly proportional to the given value. + + + This function internally computes: + \f[ a=\frac{\overline{y}-b\cdot\overline{x}}{\overline{w^2}} \f] + \f[ b=\frac{\overline{w^2}\cdot\overline{x\cdot y}-\overline{x}\cdot\overline{y}}{\overline{x^2}\cdot\overline{w^2}-\overline{x}^2} \f] + + Here the averages are defined in terms of a weight vector \f$ w_i\f$: + \f[ \overline{x}=\sum\limits_iw_i^2\cdot x_i \f] + \f[ \overline{y}=\sum\limits_iw_i^2\cdot y_i \f] + \f[ \overline{x\cdot y}=\sum\limits_iw_i^2\cdot x_i\cdot y_i \f] + \f[ \overline{x^2}=\sum\limits_iw_i^2\cdot x_i^2 \f] + \f[ \overline{w^2}=\sum\limits_iw_i^2 \f] + + \image html jkqtplotter_simpletest_datastore_regression_linweight.png + +*/ +template +inline void jkqtpstatLinearWeightedRegression(InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, InputItW firstW, InputItW lastW, double& coeffA, double& coeffB, bool fixA=false, bool fixB=false, std::function fWeightDataToWi=&jkqtp_identity) { + if (fixA&&fixB) return; + const int Nx=std::distance(firstX,lastX); + const int Ny=std::distance(firstY,lastY); + const int Nw=std::distance(firstW,lastW); + + JKQTPASSERT(Nx>1 && Ny>1 && Nw>1); + + double sumx=0, sumy=0, sumxy=0, sumx2=0, sumw2=0; + size_t N=0; + auto itX=firstX; + auto itY=firstY; + auto itW=firstW; + for (; itX!=lastX && itY!=lastY && itW!=lastW; ++itX, ++itY, ++itW) { + const double fit_x=jkqtp_todouble(*itX); + const double fit_y=jkqtp_todouble(*itY); + const double fit_w2=jkqtp_sqr(fWeightDataToWi(jkqtp_todouble(*itW))); + if (JKQTPIsOKFloat(fit_x)&&JKQTPIsOKFloat(fit_y)&&JKQTPIsOKFloat(fit_w2)) { + sumx=sumx+fit_w2*fit_x; + sumy=sumy+fit_w2*fit_y; + sumxy=sumxy+fit_w2*fit_x*fit_y; + sumx2=sumx2+fit_w2*fit_x*fit_x; + sumw2=sumw2+fit_w2; + N++; + } + } + const double NN=static_cast(N); + JKQTPASSERT_M(NN>1, "too few datapoints"); + if (!fixA && !fixB) { + coeffB=(double(sumxy)*double(sumw2)-double(sumx)*double(sumy))/(double(sumx2)*double(sumw2)-double(sumx)*double(sumx)); + coeffA=(double(sumy)-coeffB*double(sumx))/double(sumw2); + } else if (fixA && !fixB) { + coeffB=(double(sumy)-coeffA*double(sumw2))/double(sumx); + } else if (!fixA && fixB) { + coeffA=(double(sumy)-coeffB*double(sumx))/double(sumw2); + } +} + + + +/*! \brief calculate the (robust) iteratively reweighted least-squares (IRLS) estimate for the parameters of the model \f$ f(x)=a+b\cdot x \f$ + for a given data range \a firstX / \a firstY ... \a lastX / \a lastY + So this function finds an outlier-robust solution to the optimization problem: + \f[ (a^\ast,b^\ast)=\argmin\limits_{a,b}\sum\limits_i|a+b\cdot x_i-y_i|^p \f] + \ingroup jkqtptools_math_statistics_regression + + \ingroup jkqtptools_math_statistics_regression + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used + \param p regularization parameter, the optimization problem is formulated in the \f$ L_p \f$ norm, using this \a p (see image below for an example) + \param iterations the number of iterations the IRLS algorithm performs + + This is a simple form of the IRLS algorithm to estimate the parameters a and b in a linear model \f$ f(x)=a+b\cdot x \f$. + This algorithm solves the optimization problem for a \f$ L_p\f$-norm: + \f[ (a^\ast,b^\ast)=\argmin\limits_{a,b}\sum\limits_i|a+b\cdot x_i-y_i|^p \f] + by iteratively optimization weights \f$ \vec{w} \f$ and solving a weighted least squares problem in each iteration: + \f[ (a_n,b_n)=\argmin\limits_{a,b}\sum\limits_i|a+b\cdot x_i-y_i|^{(p-2)}\cdot|a+b\cdot x_i-y_i|^2 \f] + + + The IRLS-algorithm works as follows: + - calculate initial \f$ a_0\f$ and \f$ b_0\f$ with unweighted regression from x and y + - perform a number of iterations (parameter \a iterations ). In each iteration \f$ n\f$: + - calculate the error vector \f$\vec{e}\f$: \f[ e_i = a+b\cdot x_i -y_i \f] + - estimate new weights \f$\vec{w}\f$: \[ w_i=|e_i|^{(p-2)/2} \] + - calculate new estimates \f$ a_n\f$ and \f$ b_n\f$ with weighted regression from \f$ \vec{x}\f$ and \f$ \vec{y}\f$ and \f$ \vec{w}\f$ + . + - return the last estimates \f$ a_n\f$ and \f$ b_n\f$ + . + + \image html irls.png + + \image html jkqtplotter_simpletest_datastore_regression_linrobust_p.png + + \see https://en.wikipedia.org/wiki/Iteratively_reweighted_least_squares, C. Sidney Burrus: "Iterative Reweighted Least Squares", http://cnx.org/content/m45285/latest/ +*/ +template +inline void jkqtpstatRobustIRLSLinearRegression(InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double& coeffA, double& coeffB, bool fixA=false, bool fixB=false, double p=1.1, int iterations=100) { + if (fixA&&fixB) return; + const int Nx=std::distance(firstX,lastX); + const int Ny=std::distance(firstY,lastY); + const int N=std::min(Nx,Ny); + + JKQTPASSERT(Nx>1 && Ny>1); + + std::vector weights; + std::fill_n(std::back_inserter(weights), N, 1.0); + + double alast=coeffA, blast=coeffB; + jkqtpstatLinearWeightedRegression(firstX, lastX, firstY, lastY, weights.begin(), weights.end(), alast, blast, fixA, fixB, &jkqtp_identity); + for (int it=0; it(JKQTP_EPSILON*100.0, fabs(e)), (p-2.0)/2.0); + ++itX; + ++itY; + } + // solve weighted linear least squares + jkqtpstatLinearWeightedRegression(firstX, lastX, firstY, lastY, weights.begin(), weights.end(), alast, blast, fixA, fixB, &jkqtp_identity); + } + coeffA=alast; + coeffB=blast; +} + + + + + + + +/*! \brief when performing linear regression, different target functions can be fitted, if the input data is transformed accordingly. This library provides the options in this enum by default. + \ingroup jkqtptools_math_statistics_regression + */ +enum class JKQTPStatRegressionModelType { + Linear, /*!< \brief linear model \f$ f(x)=a+b\cdot x \f$ */ + PowerLaw, /*!< \brief power law model \f$ f(x)=a\cdot x^b \f$ */ + Exponential, /*!< \brief exponential model \f$ f(x)=a\cdot \exp(b\cdot x) \f$ */ +}; + + +/*! \brief Generates functors \c f(x,a,b) for the models from JKQTPStatRegressionModelType in \a type + \ingroup jkqtptools_math_statistics_regression + */ +JKQTP_LIB_EXPORT std::function jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType type); + +/*! \brief Generates a LaTeX string for the models from JKQTPStatRegressionModelType in \a type + \ingroup jkqtptools_math_statistics_regression + */ +JKQTP_LIB_EXPORT QString jkqtpstatRegressionModel2Latex(JKQTPStatRegressionModelType type, double a, double b); + +/*! \brief Generates functors \c f(x) for the models from JKQTPStatRegressionModelType in \a type and binds the parameter values \a and \a b to the returned function + \ingroup jkqtptools_math_statistics_regression + */ +JKQTP_LIB_EXPORT std::function jkqtpStatGenerateRegressionModel(JKQTPStatRegressionModelType type, double a, double b); + +/*! \brief Generates the transformation function for x-data (\c result.first ) and y-data (\c result.second ) for each regression model in JKQTPStatRegressionModelType in \a type + \ingroup jkqtptools_math_statistics_regression + \internal + */ +JKQTP_LIB_EXPORT std::pair,std::function > jkqtpStatGenerateTransformation(JKQTPStatRegressionModelType type); + + +/*! \brief Generates the transformation function for a-parameter (offset, \c result.first : transform, \c result.second : back-transform) for each regression model in JKQTPStatRegressionModelType in \a type + \ingroup jkqtptools_math_statistics_regression + \internal + */ +JKQTP_LIB_EXPORT std::pair,std::function > jkqtpStatGenerateParameterATransformation(JKQTPStatRegressionModelType type); + + +/*! \brief Generates the transformation function for b-parameter (slope, \c result.first : transform, \c result.second : back-transform) for each regression model in JKQTPStatRegressionModelType in \a type + \ingroup jkqtptools_math_statistics_regression + \internal + */ +JKQTP_LIB_EXPORT std::pair,std::function > jkqtpStatGenerateParameterBTransformation(JKQTPStatRegressionModelType type); + + +/*! \brief calculate the linear regression coefficients for a given data range \a firstX / \a firstY ... \a lastX / \a lastY where the model is defined by \a type + So this function solves the least-squares optimization problem: \f[ (a^\ast, b^\ast)=\argmin\limits_{a,b}\sum\limits_i\left(y_i-f_\mbox{type}(x_i,a,b)\right)^2 \f] + by reducing it to a linear fit by transforming x- and/or y-data + \ingroup jkqtptools_math_statistics_regression + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \param type model to be fitted + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used + + This function computes internally first transforms the data, as appropriate to fit the model defined by \a type and then calls jkqtpstatLinearRegression() + to obtain the parameters. The output parameters are transformed, so they can be used with jkqtpStatGenerateRegressionModel() to generate a functor + that evaluates the model + + \see JKQTPStatRegressionModelType, jkqtpStatGenerateRegressionModel(), jkqtpstatLinearRegression(), jkqtpStatGenerateTransformation() +*/ +template +inline void jkqtpstatRegression(JKQTPStatRegressionModelType type, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double& coeffA, double& coeffB, bool fixA=false, bool fixB=false) { + std::vector x, y; + auto trafo=jkqtpStatGenerateTransformation(type); + auto aTrafo =jkqtpStatGenerateParameterATransformation(type); + auto bTrafo =jkqtpStatGenerateParameterBTransformation(type); + + std::transform(firstX, lastX, std::back_inserter(x), trafo.first); + std::transform(firstY, lastY, std::back_inserter(y), trafo.second); + + double a=aTrafo.first(coeffA); + double b=bTrafo.first(coeffB); + + jkqtpstatLinearRegression(x.begin(), x.end(), y.begin(), y.end(), a, b, fixA, fixB); + + coeffA=aTrafo.second(a); + coeffB=bTrafo.second(b); +} + + + +/*! \brief calculate the robust linear regression coefficients for a given data range \a firstX / \a firstY ... \a lastX / \a lastY where the model is defined by \a type + So this function solves the Lp-norm optimization problem: \f[ (a^\ast, b^\ast)=\argmin\limits_{a,b}\sum\limits_i\left(y_i-f_\mbox{type}(x_i,a,b)\right)^p \f] + by reducing it to a linear fit by transforming x- and/or y-data + \ingroup jkqtptools_math_statistics_regression + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \param type model to be fitted + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used + \param p regularization parameter, the optimization problem is formulated in the \f$ L_p \f$ norm, using this \a p (see image below for an example) + \param iterations the number of iterations the IRLS algorithm performs + + This function computes internally first transforms the data, as appropriate to fit the model defined by \a type and then calls jkqtpstatRobustIRLSLinearRegression() + to obtain the parameters. The output parameters are transformed, so they can be used with jkqtpStatGenerateRegressionModel() to generate a functor + that evaluates the model + + \see JKQTPStatRegressionModelType, jkqtpStatGenerateRegressionModel(), jkqtpstatRobustIRLSLinearRegression(), jkqtpStatGenerateTransformation() +*/ +template +inline void jkqtpstatRobustIRLSRegression(JKQTPStatRegressionModelType type, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double& coeffA, double& coeffB, bool fixA=false, bool fixB=false, double p=1.1, int iterations=100) { + std::vector x, y; + auto trafo=jkqtpStatGenerateTransformation(type); + auto aTrafo =jkqtpStatGenerateParameterATransformation(type); + auto bTrafo =jkqtpStatGenerateParameterBTransformation(type); + + std::transform(firstX, lastX, std::back_inserter(x), trafo.first); + std::transform(firstY, lastY, std::back_inserter(y), trafo.second); + + double a=aTrafo.first(coeffA); + double b=bTrafo.first(coeffB); + + jkqtpstatRobustIRLSLinearRegression(x.begin(), x.end(), y.begin(), y.end(), a, b, fixA, fixB, p, iterations); + + coeffA=aTrafo.second(a); + coeffB=bTrafo.second(b); +} + + + + +/*! \brief calculate the robust linear regression coefficients for a given data range \a firstX / \a firstY ... \a lastX / \a lastY where the model is defined by \a type + So this function solves the Lp-norm optimization problem: \f[ (a^\ast, b^\ast)=\argmin\limits_{a,b}\sum\limits_i\left(y_i-f_\mbox{type}(x_i,a,b)\right)^p \f] + by reducing it to a linear fit by transforming x- and/or y-data + \ingroup jkqtptools_math_statistics_regression + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \tparam InputItW standard iterator type of \a firstW and \a lastW. + \param type model to be fitted + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param firstW iterator pointing to the first item in the weight-dataset to use \f$ w_1 \f$ + \param lastW iterator pointing behind the last item in the weight-dataset to use \f$ w_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used + \param fWeightDataToWi an optional function, which is applied to the data from \a firstW ... \a lastW to convert them to weight, i.e. \c wi=fWeightDataToWi(*itW) + e.g. if you use data used to draw error bars, you can use jkqtp_inversePropSaveDefault(). The default is jkqtp_identity(), which just returns the values. + In the case of jkqtp_inversePropSaveDefault(), a datapoint x,y, has a large weight, if it's error is small and in the case if jkqtp_identity() it's weight + is directly proportional to the given value. + + This function computes internally first transforms the data, as appropriate to fit the model defined by \a type and then calls jkqtpstatLinearWeightedRegression() + to obtain the parameters. The output parameters are transformed, so they can be used with jkqtpStatGenerateRegressionModel() to generate a functor + that evaluates the model + + \see JKQTPStatRegressionModelType, jkqtpStatGenerateRegressionModel(), jkqtpstatLinearWeightedRegression(), jkqtpStatGenerateTransformation() +*/ +template +inline void jkqtpstatWeightedRegression(JKQTPStatRegressionModelType type, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, InputItW firstW, InputItW lastW, double& coeffA, double& coeffB, bool fixA=false, bool fixB=false, std::function fWeightDataToWi=&jkqtp_identity) { + std::vector x, y; + auto trafo=jkqtpStatGenerateTransformation(type); + auto aTrafo =jkqtpStatGenerateParameterATransformation(type); + auto bTrafo =jkqtpStatGenerateParameterBTransformation(type); + + std::transform(firstX, lastX, std::back_inserter(x), trafo.first); + std::transform(firstY, lastY, std::back_inserter(y), trafo.second); + + double a=aTrafo.first(coeffA); + double b=bTrafo.first(coeffB); + + jkqtpstatLinearWeightedRegression(x.begin(), x.end(), y.begin(), y.end(), firstW, lastW, a, b, fixA, fixB, fWeightDataToWi); + + coeffA=aTrafo.second(a); + coeffB=bTrafo.second(b); +} + + + + +/*! \brief fits (in a least-squares sense) a polynomial \f$ f(x)=\sum\limits_{i=0}^Pp_ix^i \f$ of order P to a set of N data pairs \f$ (x_i,y_i) \f$ + \ingroup jkqtptools_math_statistics_poly + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \tparam OutputItP output iterator for the polynomial coefficients + \param type model to be fitted + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param P degree of the polynomial (P>=N !!!) + \param[out] firstRes Iterator (of type \a OutputItP ), which receives the (P+1)-entry vector with the polynomial coefficients \f$ p_i \f$ + + This function uses jkqtpstatLinSolve() to solve the system of equations + \f[ \begin{bmatrix} y_1\\ y_2\\ y_3 \\ \vdots \\ y_n \end{bmatrix}= \begin{bmatrix} 1 & x_1 & x_1^2 & \dots & x_1^P \\ 1 & x_2 & x_2^2 & \dots & x_2^P\\ 1 & x_3 & x_3^2 & \dots & x_3^P \\ \vdots & \vdots & \vdots & & \vdots \\ 1 & x_n & x_n^2 & \dots & x_n^P \end{bmatrix} \begin{bmatrix} p_0\\ p_1\\ p_2\\ \vdots \\ p_P \end{bmatrix} \f] + \f[ \vec{y}=V\vec{p}\ \ \ \ \ \Rightarrow\ \ \ \ \ \vec{p}=(V^TV)^{-1}V^T\vec{y} \] + + \image html jkqtplotter_simpletest_datastore_regression_polynom.png + + \see https://en.wikipedia.org/wiki/Polynomial_regression +*/ +template +inline void jkqtpstatPolyFit(InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, size_t P, OutputItP firstRes) { + { + const int Nx=std::distance(firstX,lastX); + const int Ny=std::distance(firstY,lastY); + JKQTPASSERT(Nx>1 && Ny>1); + } + + size_t N=0; + + std::vector X,Y; + auto itX=firstX; + auto itY=firstY; + for (; itX!=lastX && itY!=lastY; ++itX, ++itY) { + const double fit_x=jkqtp_todouble(*itX); + const double fit_y=jkqtp_todouble(*itY); + if (JKQTPIsOKFloat(fit_x) && JKQTPIsOKFloat(fit_y)) { + X.push_back(fit_x); + Y.push_back(fit_y); + N++; + } + } + + // build Vandermonde matrix V + std::vector V; + V.resize(N*(P+1)); + for (size_t l=0; l VT=V; + jkqtplinalgTransposeMatrix(VT.data(), static_cast(N), static_cast(P+1)); + +#ifdef STATISTICS_TOOLS_DEBUG_statisticsPolyFit + std::cout<<"V^T = \n"; + jkqtplinalgPrintMatrix(VT.data(),P+1,N); + std::cout<<"\n"; +#endif + + // calculate V^T*V + std::vector VTV; + VTV.resize((P+1)*(P+1)); + jkqtplinalgMatrixProduct(VT.data(), static_cast(P+1), static_cast(N), V.data(), static_cast(N), static_cast(P+1), VTV.data()); + +#ifdef STATISTICS_TOOLS_DEBUG_statisticsPolyFit + std::cout<<"V^T*V = \n"; + jkqtplinalgPrintMatrix(VTV.data(),P+1,P+1); + std::cout<<"\n"; +#endif + + // calculate V^T*y + std::vector VTY; + VTY.resize(P+1); + jkqtplinalgMatrixProduct(VT.data(), static_cast(P+1), static_cast(N), Y.data(), static_cast(N), 1, VTY.data()); + +#ifdef STATISTICS_TOOLS_DEBUG_statisticsPolyFit + std::cout<<"V^T*y = \n"; + jkqtplinalgPrintMatrix(VTY.data(),P+1,1); + std::cout<<"\n"; +#endif + + // solve V^T*y = V^T*V*p + const bool ok=jkqtplinalgLinSolve(VTV.data(), VTY.data(), static_cast(P+1)); + + if (ok) { + auto itR=firstRes; + for (size_t p=0; p +inline double jkqtpstatPolyEval(double x, PolyItP firstP, PolyItP lastP) { + double v=0.0; + double xx=1.0; + for (auto itP=firstP; itP!=lastP; ++itP) { + v=v+(*itP)*xx; + xx=xx*x; + } + return v; +} + +/*! \brief a C++-functor, which evaluates a polynomial + \ingroup jkqtptools_math_statistics_poly +*/ +struct JKQTPStatPolynomialFunctor { + std::vector P; + template + inline JKQTPStatPolynomialFunctor(PolyItP firstP, PolyItP lastP) { + for (auto itP=firstP; itP!=lastP; ++itP) { + P.push_back(*itP); + } + } + inline double operator()(double x) const { return jkqtpstatPolyEval(x, P.begin(), P.end()); } + +}; + +/*! \brief returns a C++-functor, which evaluates a polynomial + \ingroup jkqtptools_math_statistics_poly + + \tparam PolyItP iterator for the polynomial coefficients + \param firstP points to the first polynomial coefficient \f$ p_1 \f$ (i.e. the offset with \f$ x^0 \f$ ) + \param lastP points behind the last polynomial coefficient \f$ p_P \f$ +*/ +template +inline std::function jkqtpstatGeneratePolynomialModel(PolyItP firstP, PolyItP lastP) { + return JKQTPStatPolynomialFunctor(firstP, lastP); +} + +/*! \brief Generates a LaTeX string for the polynomial model with the coefficients \a firstP ... \a lastP + \ingroup jkqtptools_math_statistics_regression + + \tparam PolyItP iterator for the polynomial coefficients + \param firstP points to the first polynomial coefficient \f$ p_1 \f$ (i.e. the offset with \f$ x^0 \f$ ) + \param lastP points behind the last polynomial coefficient \f$ p_P \f$ + */ +template +QString jkqtpstatPolynomialModel2Latex(PolyItP firstP, PolyItP lastP) { + QString str="f(x)="; + size_t p=0; + for (auto itP=firstP; itP!=lastP; ++itP) { + if (p==0) str+=jkqtp_floattolatexqstr(*itP, 3); + else { + if (*itP>=0) str+="+"; + str+=QString("%2{\\cdot}x^{%1}").arg(p).arg(jkqtp_floattolatexqstr(*itP, 3)); + } + p++; + } + return str; +} + + + + + + + + + + + #endif // JKQTPSTATISTICSTOOLS_H_INCLUDED diff --git a/lib/jkqtplotter/jkqtpgraphsstatisticsadaptors.cpp b/lib/jkqtplotter/jkqtpgraphsstatisticsadaptors.cpp index 9f28f1e96a..aba155e834 100644 --- a/lib/jkqtplotter/jkqtpgraphsstatisticsadaptors.cpp +++ b/lib/jkqtplotter/jkqtpgraphsstatisticsadaptors.cpp @@ -21,4 +21,58 @@ #include "jkqtplotter/jkqtpgraphsstatisticsadaptors.h" #include "jkqtplotter/jkqtplotter.h" +#include "jkqtplotter/jkqtpgraphsbase.h" + +JKQTPXFunctionLineGraph *jkqtpstatAddLinearRegression(JKQTPXYGraph *datagraph, double *coeffA, double *coeffB, bool fixA, bool fixB) { + JKQTBasePlotter* plt=datagraph->getParent(); + JKQTPDatastore* ds=plt->getDatastore(); + return jkqtpstatAddLinearRegression(plt, ds->begin(datagraph->getXColumn()), ds->end(datagraph->getXColumn()), ds->begin(datagraph->getYColumn()), ds->end(datagraph->getYColumn()), coeffA, coeffB, fixA, fixB); +} + +JKQTPXFunctionLineGraph *jkqtpstatAddLinearWeightedRegression(JKQTPXYGraph *datagraph, double *coeffA, double *coeffB, bool fixA, bool fixB) +{ + JKQTBasePlotter* plt=datagraph->getParent(); + JKQTPDatastore* ds=plt->getDatastore(); + JKQTPYGraphErrorData* ge=dynamic_cast(datagraph); + + JKQTPASSERT_M(ge!=nullptr, "datagraph needs to be convertible to JKQTPYGraphErrorData with a dynamic_cast!"); + return jkqtpstatAddLinearWeightedRegression(plt, ds->begin(datagraph->getXColumn()), ds->end(datagraph->getXColumn()), ds->begin(datagraph->getYColumn()), ds->end(datagraph->getYColumn()), ds->begin(ge->getYErrorColumn()), ds->end(ge->getYErrorColumn()), coeffA, coeffB, fixA, fixB, &jkqtp_inversePropSaveDefault); +} + +JKQTPXFunctionLineGraph *jkqtpstatAddRobustIRLSLinearRegression(JKQTPXYGraph *datagraph, double *coeffA, double *coeffB, bool fixA, bool fixB, double p, int iterations) +{ + JKQTBasePlotter* plt=datagraph->getParent(); + JKQTPDatastore* ds=plt->getDatastore(); + return jkqtpstatAddRobustIRLSLinearRegression(plt, ds->begin(datagraph->getXColumn()), ds->end(datagraph->getXColumn()), ds->begin(datagraph->getYColumn()), ds->end(datagraph->getYColumn()), coeffA, coeffB, fixA, fixB, p, iterations); +} + + +JKQTPXFunctionLineGraph *jkqtpstatAddRegression(JKQTPXYGraph *datagraph, JKQTPStatRegressionModelType type, double *coeffA, double *coeffB, bool fixA, bool fixB) { + JKQTBasePlotter* plt=datagraph->getParent(); + JKQTPDatastore* ds=plt->getDatastore(); + return jkqtpstatAddRegression(plt, type, ds->begin(datagraph->getXColumn()), ds->end(datagraph->getXColumn()), ds->begin(datagraph->getYColumn()), ds->end(datagraph->getYColumn()), coeffA, coeffB, fixA, fixB); +} + +JKQTPXFunctionLineGraph *jkqtpstatAddWeightedRegression(JKQTPXYGraph *datagraph, JKQTPStatRegressionModelType type, double *coeffA, double *coeffB, bool fixA, bool fixB) +{ + JKQTBasePlotter* plt=datagraph->getParent(); + JKQTPDatastore* ds=plt->getDatastore(); + JKQTPYGraphErrorData* ge=dynamic_cast(datagraph); + + JKQTPASSERT_M(ge!=nullptr, "datagraph needs to be convertible to JKQTPYGraphErrorData with a dynamic_cast!"); + return jkqtpstatAddWeightedRegression(plt, type, ds->begin(datagraph->getXColumn()), ds->end(datagraph->getXColumn()), ds->begin(datagraph->getYColumn()), ds->end(datagraph->getYColumn()), ds->begin(ge->getYErrorColumn()), ds->end(ge->getYErrorColumn()), coeffA, coeffB, fixA, fixB, &jkqtp_inversePropSaveDefault); +} + +JKQTPXFunctionLineGraph *jkqtpstatAddRobustIRLSRegression(JKQTPXYGraph *datagraph, JKQTPStatRegressionModelType type, double *coeffA, double *coeffB, bool fixA, bool fixB, double p, int iterations) +{ + JKQTBasePlotter* plt=datagraph->getParent(); + JKQTPDatastore* ds=plt->getDatastore(); + return jkqtpstatAddRobustIRLSRegression(plt, type, ds->begin(datagraph->getXColumn()), ds->end(datagraph->getXColumn()), ds->begin(datagraph->getYColumn()), ds->end(datagraph->getYColumn()), coeffA, coeffB, fixA, fixB, p, iterations); +} + +JKQTPXFunctionLineGraph *jkqtpstatAddPolyFit(JKQTPXYGraph *datagraph, size_t P) { + JKQTBasePlotter* plt=datagraph->getParent(); + JKQTPDatastore* ds=plt->getDatastore(); + return jkqtpstatAddPolyFit(plt, ds->begin(datagraph->getXColumn()), ds->end(datagraph->getXColumn()), ds->begin(datagraph->getYColumn()), ds->end(datagraph->getYColumn()),P); +} diff --git a/lib/jkqtplotter/jkqtpgraphsstatisticsadaptors.h b/lib/jkqtplotter/jkqtpgraphsstatisticsadaptors.h index 95de0d7e10..53356b6567 100644 --- a/lib/jkqtplotter/jkqtpgraphsstatisticsadaptors.h +++ b/lib/jkqtplotter/jkqtpgraphsstatisticsadaptors.h @@ -20,10 +20,14 @@ #include "jkqtcommon/jkqtp_imexport.h" #include "jkqtcommon/jkqtpstatisticstools.h" +#include "jkqtcommon/jkqtptoolsdebugging.h" +#include "jkqtplotter/jkqtpgraphsbase.h" +#include "jkqtplotter/jkqtpgraphsbaseerrors.h" #include "jkqtplotter/jkqtpgraphsboxplot.h" #include "jkqtplotter/jkqtpgraphsscatter.h" #include "jkqtplotter/jkqtpgraphssinglecolumnsymbols.h" #include "jkqtplotter/jkqtpgraphsbarchart.h" +#include "jkqtplotter/jkqtpgraphsevaluatedfunction.h" #ifndef JKQTPGRAPHSSTATISTICSADAPTORS_H_INCLUDED #define JKQTPGRAPHSSTATISTICSADAPTORS_H_INCLUDED @@ -48,6 +52,9 @@ jkqtpstatAddHBoxplot(plot1->getPlotter(), datastore1->begin(randomdatacol1), datastore1->end(randomdatacol1), -0.3); \endcode + \image html jkqtplotter_simpletest_datastore_statistics_boxplots_simple.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreStatistics, jkqtpstat5NumberStatistics() */ template @@ -143,6 +150,8 @@ inline JKQTPBoxplotVerticalElement* jkqtpstatAddVBoxplot(JKQTBasePlotter* plotte 0.05, 0.95 // Quantiles for the boxplot box whiskers' ends \endcode + \image html jkqtplotter_simpletest_datastore_statistics_boxplots_outliers.png + \see \ref JKQTPlotterBasicJKQTPDatastoreStatistics, jkqtpstat5NumberStatistics() */ template @@ -201,7 +210,7 @@ inline std::pair jkqtpstatAddVBoxplotAndOutliers(plot1->getPlotter(), datastore1->begin(randomdatacol1), datastore1->end(randomdatacol1), -0.3, 0.25, 0.75, // 1. and 3. Quartile for the boxplot box 0.05, 0.95 // Quantiles for the boxplot box whiskers' ends - \endcode + \endcode \see \ref JKQTPlotterBasicJKQTPDatastoreStatistics, jkqtpstat5NumberStatistics() */ @@ -257,6 +266,8 @@ inline std::pair jk jkqtpstatAddHHistogram1DAutoranged(plot1->getPlotter(), datastore1->begin(randomdatacol1), datastore1->end(randomdatacol1), 11); \endcode + \image html jkqtplotter_simpletest_datastore_statistics_hist.png + \see \ref JKQTPlotterBasicJKQTPDatastoreStatistics, jkqtpstatHistogram1DAutoranged(), JKQTPBarVerticalGraph */ template @@ -293,6 +304,8 @@ inline JKQTPBarVerticalGraph* jkqtpstatAddHHistogram1DAutoranged(JKQTBasePlotter jkqtpstatAddHHistogram1DAutoranged(plot1->getPlotter(), datastore1->begin(randomdatacol1), datastore1->end(randomdatacol1), 0.5); \endcode + \image html jkqtplotter_simpletest_datastore_statistics_hist.png + \see \ref JKQTPlotterBasicJKQTPDatastoreStatistics, jkqtpstatHistogram1DAutoranged(), JKQTPBarVerticalGraph */ template @@ -331,6 +344,8 @@ inline JKQTPBarVerticalGraph* jkqtpstatAddHHistogram1DAutoranged(JKQTBasePlotter jkqtpstatAddHHistogram1D(plot1->getPlotter(), datastore1->begin(randomdatacol1), datastore1->end(randomdatacol1), bins.begin(), bins.end()); \endcode + \image html jkqtplotter_simpletest_datastore_statistics_hist.png + \see \ref JKQTPlotterBasicJKQTPDatastoreStatistics, jkqtpstatHistogram1D(), JKQTPBarVerticalGraph */ template @@ -486,6 +501,9 @@ inline JKQTPBarHorizontalGraph* jkqtpstatAddVHistogram1D(JKQTBasePlotter* plotte jkqtpstatAddHKDE1DAutoranged(plot1->getPlotter(), datastore1->begin(randomdatacol1), datastore1->end(randomdatacol1), 200); \endcode + \image html jkqtplotter_simpletest_datastore_statistics_kde.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreStatistics, jkqtpstatKDE1DAutoranged(), JKQTPXYLineGraph */ template @@ -525,6 +543,9 @@ inline JKQTPXYLineGraph* jkqtpstatAddHKDE1DAutoranged(JKQTBasePlotter* plotter, jkqtpstatAddHKDE1DAutoranged(plot1->getPlotter(), datastore1->begin(randomdatacol1), datastore1->end(randomdatacol1), 0.01); \endcode + \image html jkqtplotter_simpletest_datastore_statistics_kde.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreStatistics, jkqtpstatKDE1DAutoranged(), JKQTPXYLineGraph */ template @@ -566,6 +587,9 @@ inline JKQTPXYLineGraph* jkqtpstatAddHKDE1DAutoranged(JKQTBasePlotter* plotter, jkqtpstatAddHKDE1D(plot1->getPlotter(), datastore1->begin(randomdatacol1), datastore1->end(randomdatacol1), bins.begin(), bins.end()); \endcode + \image html jkqtplotter_simpletest_datastore_statistics_kde.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreStatistics, jkqtpstatKDE1D(), JKQTPXYLineGraph */ template @@ -606,6 +630,8 @@ inline JKQTPXYLineGraph* jkqtpstatAddHKDE1D(JKQTBasePlotter* plotter, InputIt fi jkqtpstatAddHKDE1D(plot1->getPlotter(), datastore1->begin(randomdatacol1), datastore1->end(randomdatacol1), bins.begin(), bins.end()); \endcode + \image html jkqtplotter_simpletest_datastore_statistics_kde.png + \see \ref JKQTPlotterBasicJKQTPDatastoreStatistics, jkqtpstatKDE1D(), JKQTPXYLineGraph */ template @@ -625,6 +651,617 @@ inline JKQTPXYLineGraph* jkqtpstatAddHKDE1D(JKQTBasePlotter* plotter, InputIt fi +/*! \brief calculate the linear regression coefficients for a given data range \a firstX / \a firstY ... \a lastX / \a lastY where the model is \f$ f(x)=a+b\cdot x \f$ + \ingroup jkqtptools_math_statistics_adaptors + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \param plotter the plotter to which to add the resulting graph + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + + Example: + \code + jkqtpstatAddLinearRegression(plot1->getPlotter(), datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY)); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_lin.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatLinearRegression() +*/ +template +inline JKQTPXFunctionLineGraph* jkqtpstatAddLinearRegression(JKQTBasePlotter* plotter, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false) { + double cA; + if (coeffA) cA=*coeffA; + double cB; + if (coeffB) cB=*coeffB; + + JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided"); + JKQTPASSERT_M(!fixB || (fixB && coeffB!=nullptr), "if fixB=true, coeffB needs to be provided"); + + jkqtpstatLinearRegression(firstX, lastX, firstY, lastY, cA, cB, fixA, fixB); + JKQTPXFunctionLineGraph* g=new JKQTPXFunctionLineGraph(plotter); + g->setSpecialFunction(JKQTPXFunctionLineGraph::SpecialFunction::Line); + g->setParamsV(cA, cB); + g->setTitle(QString("regression: $f(x) = %1 + %2 \\cdot x$").arg(jkqtp_floattolatexqstr(cA)).arg(jkqtp_floattolatexqstr(cB))); + plotter->addGraph(g); + if (coeffA) *coeffA=cA; + if (coeffB) *coeffB=cB; + return g; +} + + +/*! \brief calculate the linear regression coefficients for a given data data used to draw any `JKQTPXYGraph` \a datagraph where the model is \f$ f(x)=a+b\cdot x \f$ + \ingroup jkqtptools_math_statistics_adaptors + + \param datagraph graph representing the (x,y) datapairs to which to fit the regression line + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + + Example: + \code + JKQTPXYLineGraph* graphD; + plot1->addGraph(graphD=new JKQTPXYLineGraph(plot1)); + graphD->setXYColumns(colLinX, colLinY); + jkqtpstatAddLinearRegression(graphD); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_lin.png + + \note The line graph is added to the same plotter that is the parent of \a datagraph ! + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatLinearRegression() +*/ +JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph* jkqtpstatAddLinearRegression(JKQTPXYGraph *datagraph, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false); + + + +/*! \brief calculate the (robust) iteratively reweighted least-squares (IRLS) estimate for the parameters of the model \f$ f(x)=a+b\cdot x \f$ + for a given data range \a firstX / \a firstY ... \a lastX / \a lastY + \ingroup jkqtptools_math_statistics_adaptors + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \param plotter the plotter to which to add the resulting graph + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + \param p regularization parameter, the optimization problem is formulated in the \f$ L_p \f$ norm, using this \a p (see image below for an example) + \param iterations the number of iterations the IRLS algorithm performs + + Example: + \code + jkqtpstatAddRobustIRLSLinearRegression(plot1->getPlotter(), datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY)); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_linrobust.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatRobustIRLSLinearRegression() +*/ +template +inline JKQTPXFunctionLineGraph* jkqtpstatAddRobustIRLSLinearRegression(JKQTBasePlotter* plotter, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false, double p=1.1, int iterations=100) { + double cA; + if (coeffA) cA=*coeffA; + double cB; + if (coeffB) cB=*coeffB; + + JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided"); + JKQTPASSERT_M(!fixB || (fixB && coeffB!=nullptr), "if fixB=true, coeffB needs to be provided"); + + jkqtpstatRobustIRLSLinearRegression(firstX, lastX, firstY, lastY, cA, cB, fixA, fixB, p, iterations); + JKQTPXFunctionLineGraph* g=new JKQTPXFunctionLineGraph(plotter); + g->setSpecialFunction(JKQTPXFunctionLineGraph::SpecialFunction::Line); + g->setParamsV(cA, cB); + g->setTitle(QString("robust regression: $f(x) = %1 + %2 \\cdot x$").arg(jkqtp_floattolatexqstr(cA)).arg(jkqtp_floattolatexqstr(cB))); + plotter->addGraph(g); + if (coeffA) *coeffA=cA; + if (coeffB) *coeffB=cB; + return g; +} + + +/*! \brief calculate the (robust) iteratively reweighted least-squares (IRLS) estimate for the parameters of the model \f$ f(x)=a+b\cdot x \f$ + for a given data range \a firstX / \a firstY ... \a lastX / \a lastY + \ingroup jkqtptools_math_statistics_adaptors + + \param datagraph graph representing the (x,y) datapairs to which to fit the regression line + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + \param p regularization parameter, the optimization problem is formulated in the \f$ L_p \f$ norm, using this \a p (see image below for an example) + \param iterations the number of iterations the IRLS algorithm performs + + Example: + \code + JKQTPXYLineGraph* graphD; + plot1->addGraph(graphD=new JKQTPXYLineGraph(plot1)); + graphD->setXYColumns(colLinX, colLinY); + jkqtpstatAddRobustIRLSLinearRegression(graphD); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_linrobust.png + + \note The line graph is added to the same plotter that is the parent of \a datagraph ! + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatRobustIRLSLinearRegression() +*/ +JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph *jkqtpstatAddRobustIRLSLinearRegression(JKQTPXYGraph *datagraph, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false, double p=1.1, int iterations=100); + + + +/*! \brief calculate the weighted linear regression coefficients for a given for a given data range \a firstX / \a firstY / \a firstW ... \a lastX / \a lastY / \a lastW where the model is \f$ f(x)=a+b\cdot x \f$ + \ingroup jkqtptools_math_statistics_adaptors + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \tparam InputItW standard iterator type of \a firstW and \a lastW. + \param plotter the plotter to which to add the resulting graph + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param firstW iterator pointing to the first item in the weight-dataset to use \f$ w_1 \f$ + \param lastW iterator pointing behind the last item in the weight-dataset to use \f$ w_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + \param fWeightDataToWi an optional function, which is applied to the data from \a firstW ... \a lastW to convert them to weight, i.e. \c wi=fWeightDataToWi(*itW) + e.g. if you use data used to draw error bars, you can use jkqtp_inversePropSaveDefault(). The default is jkqtp_identity(), which just returns the values. + In the case of jkqtp_inversePropSaveDefault(), a datapoint x,y, has a large weight, if it's error is small and in the case if jkqtp_identity() it's weight + is directly proportional to the given value. + + Example: + \code + double coeffA=0, coeffB=0; + jkqtpstatLinearWeightedRegression(datastore1->begin(colWLinX), datastore1->end(colWLinX), + datastore1->begin(colWLinY), datastore1->end(colWLinY), + datastore1->begin(colWLinE), datastore1->end(colWLinE), + coeffA, coeffB, false, false, + &jkqtp_inversePropSaveDefault); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_linweight.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatLinearRegression() +*/ +template +inline JKQTPXFunctionLineGraph* jkqtpstatAddLinearWeightedRegression(JKQTBasePlotter* plotter, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, InputItW firstW, InputItW lastW, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false, std::function fWeightDataToWi=&jkqtp_identity) { + double cA; + if (coeffA) cA=*coeffA; + double cB; + if (coeffB) cB=*coeffB; + + JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided"); + JKQTPASSERT_M(!fixB || (fixB && coeffB!=nullptr), "if fixB=true, coeffB needs to be provided"); + + jkqtpstatLinearWeightedRegression(firstX, lastX, firstY, lastY, firstW, lastW, cA, cB, fixA, fixB, fWeightDataToWi); + JKQTPXFunctionLineGraph* g=new JKQTPXFunctionLineGraph(plotter); + g->setSpecialFunction(JKQTPXFunctionLineGraph::SpecialFunction::Line); + g->setParamsV(cA, cB); + g->setTitle(QString("weighted regression: $f(x) = %1 + %2 \\cdot x$").arg(jkqtp_floattolatexqstr(cA)).arg(jkqtp_floattolatexqstr(cB))); + plotter->addGraph(g); + if (coeffA) *coeffA=cA; + if (coeffB) *coeffB=cB; + return g; +} + +/*! \brief calculate the linear weighted regression coefficients for a given data data used to draw any `JKQTPXYGraph` \a datagraph , which also implements JKQTPYGraphErrorData and where the model is \f$ f(x)=a+b\cdot x \f$ + \ingroup jkqtptools_math_statistics_adaptors + + \param datagraph graph representing the (x,y,error) data triples to which to fit the regression line + The errors are used as iverse weights! + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + + Example: + \code + JKQTPXYLineErrorGraph* graphD; + plot1->addGraph(graphD=new JKQTPXYLineErrorGraph(plot1)); + graphD->setXYColumns(colLinX, colLinY); + graphD->setYErrorColumn(static_cast(colWLinE)); + jkqtpstatAddLinearWeightedRegression(graphD); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_linweight.png + + \note The line graph is added to the same plotter that is the parent of \a datagraph ! + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatLinearRegression() +*/ +JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph* jkqtpstatAddLinearWeightedRegression(JKQTPXYGraph *datagraph, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false); + + + + + + + + + + + + + + +/*! \brief calculate the linear regression coefficients for a given data range \a firstX / \a firstY ... \a lastX / \a lastY where the model is defined by \a type + \ingroup jkqtptools_math_statistics_adaptors + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \param plotter the plotter to which to add the resulting graph + \param type model to be fitted + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + + Example: + \code + jkqtpstatRegression(plot1->getPlotter(), JKQTPStatRegressionModelType::Exponential, datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY)); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_nonlinreg.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatRegression() +*/ +template +inline JKQTPXFunctionLineGraph* jkqtpstatAddRegression(JKQTBasePlotter* plotter, JKQTPStatRegressionModelType type, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false) { + double cA; + if (coeffA) cA=*coeffA; + double cB; + if (coeffB) cB=*coeffB; + + JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided"); + JKQTPASSERT_M(!fixB || (fixB && coeffB!=nullptr), "if fixB=true, coeffB needs to be provided"); + + jkqtpstatRegression(type, firstX, lastX, firstY, lastY, cA, cB, fixA, fixB); + JKQTPXFunctionLineGraph* g=new JKQTPXFunctionLineGraph(plotter); + g->setPlotFunctionFunctor(jkqtpStatGenerateRegressionModel(type, cA, cB)); + g->setTitle(QString("regression: $%1$").arg(jkqtpstatRegressionModel2Latex(type, cA, cB))); + plotter->addGraph(g); + if (coeffA) *coeffA=cA; + if (coeffB) *coeffB=cB; + return g; +} + + +/*! \brief calculate the linear regression coefficients for a given data data used to draw any `JKQTPXYGraph` \a datagraph where the model is defined by \a type + + \param datagraph graph representing the (x,y) datapairs to which to fit the regression line + \param type model to be fitted + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + + Example: + \code + JKQTPXYLineGraph* graphD; + plot1->addGraph(graphD=new JKQTPXYLineGraph(plot1)); + graphD->setXYColumns(colLinX, colLinY); + jkqtpstatRegression(graphD, JKQTPStatRegressionModelType::Exponential); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_nonlinreg.png + + \note The line graph is added to the same plotter that is the parent of \a datagraph ! + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatRegression() +*/ +JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph* jkqtpstatAddRegression(JKQTPXYGraph *datagraph, JKQTPStatRegressionModelType type, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false); + + + +/*! \brief calculate the (robust) iteratively reweighted least-squares (IRLS) estimate for the parameters where the model is defined by \a type + for a given data range \a firstX / \a firstY ... \a lastX / \a lastY + \ingroup jkqtptools_math_statistics_adaptors + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \param plotter the plotter to which to add the resulting graph + \param type model to be fitted + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + \param p regularization parameter, the optimization problem is formulated in the \f$ L_p \f$ norm, using this \a p (see image below for an example) + \param iterations the number of iterations the IRLS algorithm performs + + Example: + \code + jkqtpstatAddRobustIRLSRegression(plot1->getPlotter(), JKQTPStatRegressionModelType::Exponential, datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY)); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_linrobust.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatRobustIRLSRegression() +*/ +template +inline JKQTPXFunctionLineGraph* jkqtpstatAddRobustIRLSRegression(JKQTBasePlotter* plotter, JKQTPStatRegressionModelType type, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false, double p=1.1, int iterations=100) { + double cA; + if (coeffA) cA=*coeffA; + double cB; + if (coeffB) cB=*coeffB; + + JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided"); + JKQTPASSERT_M(!fixB || (fixB && coeffB!=nullptr), "if fixB=true, coeffB needs to be provided"); + + jkqtpstatRobustIRLSRegression(type, firstX, lastX, firstY, lastY, cA, cB, fixA, fixB, p, iterations); + JKQTPXFunctionLineGraph* g=new JKQTPXFunctionLineGraph(plotter); + g->setPlotFunctionFunctor(jkqtpStatGenerateRegressionModel(type, cA, cB)); + g->setTitle(QString("robust regression: $%1$").arg(jkqtpstatRegressionModel2Latex(type, cA, cB))); + plotter->addGraph(g); + if (coeffA) *coeffA=cA; + if (coeffB) *coeffB=cB; + return g; +} + + +/*! \brief calculate the (robust) iteratively reweighted least-squares (IRLS) estimate for the parameters where the model is defined by \a type + for a given data range \a firstX / \a firstY ... \a lastX / \a lastY + \ingroup jkqtptools_math_statistics_adaptors + + \param datagraph graph representing the (x,y) datapairs to which to fit the regression line + \param type model to be fitted + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + \param p regularization parameter, the optimization problem is formulated in the \f$ L_p \f$ norm, using this \a p (see image below for an example) + \param iterations the number of iterations the IRLS algorithm performs + + Example: + \code + JKQTPXYLineGraph* graphD; + plot1->addGraph(graphD=new JKQTPXYLineGraph(plot1)); + graphD->setXYColumns(colLinX, colLinY); + jkqtpstatAddRobustIRLSRegression(graphD, JKQTPStatRegressionModelType::Exponential); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_linrobust.png + + \note The line graph is added to the same plotter that is the parent of \a datagraph ! + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatRobustIRLSRegression() +*/ +JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph *jkqtpstatAddRobustIRLSRegression(JKQTPXYGraph *datagraph, JKQTPStatRegressionModelType type, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false, double p=1.1, int iterations=100); + + + +/*! \brief calculate the weighted linear regression coefficients for a given for a given data range \a firstX / \a firstY / \a firstW ... \a lastX / \a lastY / \a lastW where the model is defined by \a type + \ingroup jkqtptools_math_statistics_adaptors + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \tparam InputItW standard iterator type of \a firstW and \a lastW. + \param plotter the plotter to which to add the resulting graph + \param type model to be fitted + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param firstW iterator pointing to the first item in the weight-dataset to use \f$ w_1 \f$ + \param lastW iterator pointing behind the last item in the weight-dataset to use \f$ w_N \f$ + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + \param fWeightDataToWi an optional function, which is applied to the data from \a firstW ... \a lastW to convert them to weight, i.e. \c wi=fWeightDataToWi(*itW) + e.g. if you use data used to draw error bars, you can use jkqtp_inversePropSaveDefault(). The default is jkqtp_identity(), which just returns the values. + In the case of jkqtp_inversePropSaveDefault(), a datapoint x,y, has a large weight, if it's error is small and in the case if jkqtp_identity() it's weight + is directly proportional to the given value. + + Example: + \code + double coeffA=0, coeffB=0; + jkqtpstatAddWeightedRegression(plotter, JKQTPStatRegressionModelType::Exponential, + datastore1->begin(colWLinX), datastore1->end(colWLinX), + datastore1->begin(colWLinY), datastore1->end(colWLinY), + datastore1->begin(colWLinE), datastore1->end(colWLinE), + coeffA, coeffB, false, false, + &jkqtp_inversePropSaveDefault); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_linweight.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatWeightedRegression() +*/ +template +inline JKQTPXFunctionLineGraph* jkqtpstatAddWeightedRegression(JKQTBasePlotter* plotter, JKQTPStatRegressionModelType type, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, InputItW firstW, InputItW lastW, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false, std::function fWeightDataToWi=&jkqtp_identity) { + double cA; + if (coeffA) cA=*coeffA; + double cB; + if (coeffB) cB=*coeffB; + + JKQTPASSERT_M(!fixA || (fixA && coeffA!=nullptr), "if fixA=true, coeffA needs to be provided"); + JKQTPASSERT_M(!fixB || (fixB && coeffB!=nullptr), "if fixB=true, coeffB needs to be provided"); + + jkqtpstatWeightedRegression(type, firstX, lastX, firstY, lastY, firstW, lastW, cA, cB, fixA, fixB, fWeightDataToWi); + JKQTPXFunctionLineGraph* g=new JKQTPXFunctionLineGraph(plotter); + g->setPlotFunctionFunctor(jkqtpStatGenerateRegressionModel(type, cA, cB)); + g->setTitle(QString("weighted regression: $%1$").arg(jkqtpstatRegressionModel2Latex(type, cA, cB))); + plotter->addGraph(g); + if (coeffA) *coeffA=cA; + if (coeffB) *coeffB=cB; + return g; +} + +/*! \brief calculate the linear weighted regression coefficients for a given data data used to draw any `JKQTPXYGraph` \a datagraph , which also implements JKQTPYGraphErrorData and where the model is defined by \a type + \ingroup jkqtptools_math_statistics_adaptors + + \param datagraph graph representing the (x,y,error) data triples to which to fit the regression line + The errors are used as iverse weights! + \param type model to be fitted + \param[in,out] coeffA returns the offset of the linear model + \param[in,out] coeffB returns the slope of the linear model + \param fixA if \c true, the offset coefficient \f$ a \f$ is not determined by the fit, but the value provided in \a coeffA is used \note If \a fixA \c ==true, You need to provide a value for A in \a coeffA + \param fixB if \c true, the slope coefficient \f$ b \f$ is not determined by the fit, but the value provided in \a coeffB is used \note If \a fixB \c ==true, You need to provide a value for B in \a coeffB + + Example: + \code + JKQTPXYLineErrorGraph* graphD; + plot1->addGraph(graphD=new JKQTPXYLineErrorGraph(plot1)); + graphD->setXYColumns(colLinX, colLinY); + graphD->setYErrorColumn(static_cast(colWLinE)); + jkqtpstatAddWeightedRegression(graphD, JKQTPStatRegressionModelType::Exponential); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_linweight.png + + \note The line graph is added to the same plotter that is the parent of \a datagraph ! + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatWeightedRegression() +*/ +JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph* jkqtpstatAddWeightedRegression(JKQTPXYGraph *datagraph, JKQTPStatRegressionModelType type, double* coeffA=nullptr, double* coeffB=nullptr, bool fixA=false, bool fixB=false); + + + + + + + +/*! \brief fits (in a least-squares sense) a polynomial \f$ f(x)=\sum\limits_{i=0}^Pp_ix^i \f$ of order P to a set of N data pairs \f$ (x_i,y_i) \f$ from a given data range \a firstX / \a firstY ... \a lastX / \a lastY + \ingroup jkqtptools_math_statistics_adaptors + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \tparam OutputItP output iterator for the polynomial coefficients + \param plotter the plotter to which to add the resulting graph + \param type model to be fitted + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param P degree of the polynomial (P>=N !!!) + \param[out] firstRes Iterator (of type \a OutputItP ), which receives the (P+1)-entry vector with the polynomial coefficients \f$ p_i \f$ + + Example: + \code + std::vector pFit; + jkqtpstatAddPolyFit(plot1->getPlotter(), JKQTPStatRegressionModelType::Exponential, datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY), 3, std::back_inserter(pFit)); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_polynom.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatPolyFit() +*/ +template +inline JKQTPXFunctionLineGraph* jkqtpstatAddPolyFit(JKQTBasePlotter* plotter, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, size_t P, OutputItP firstRes) { + std::vector pFit; + JKQTPXFunctionLineGraph* gPoly=new JKQTPXFunctionLineGraph(plotter); + jkqtpstatPolyFit(firstX,lastX,firstY,lastY,P,std::back_inserter(pFit)); + gPoly->setPlotFunctionFunctor(jkqtpstatGeneratePolynomialModel(pFit.begin(), pFit.end())); + gPoly->setTitle(QString("regression: $%1$").arg(jkqtpstatPolynomialModel2Latex(pFit.begin(), pFit.end()))); + std::copy(pFit.begin(), pFit.end(), firstRes); + plotter->addGraph(gPoly); + return gPoly; +} + + +/*! \brief fits (in a least-squares sense) a polynomial \f$ f(x)=\sum\limits_{i=0}^Pp_ix^i \f$ of order P to a set of N data pairs \f$ (x_i,y_i) \f$ from a given data range \a firstX / \a firstY ... \a lastX / \a lastY + \ingroup jkqtptools_math_statistics_adaptors + + \tparam InputItX standard iterator type of \a firstX and \a lastX. + \tparam InputItY standard iterator type of \a firstY and \a lastY. + \param plotter the plotter to which to add the resulting graph + \param type model to be fitted + \param firstX iterator pointing to the first item in the x-dataset to use \f$ x_1 \f$ + \param lastX iterator pointing behind the last item in the x-dataset to use \f$ x_N \f$ + \param firstY iterator pointing to the first item in the y-dataset to use \f$ y_1 \f$ + \param lastY iterator pointing behind the last item in the y-dataset to use \f$ y_N \f$ + \param P degree of the polynomial (P>=N !!!) + + Example: + \code + jkqtpstatAddPolyFit(plot1->getPlotter(), JKQTPStatRegressionModelType::Exponential, datastore1->begin(colLinX), datastore1->end(colLinX), datastore1->begin(colLinY), datastore1->end(colLinY), 3); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_polynom.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatPolyFit() +*/ +template +inline JKQTPXFunctionLineGraph* jkqtpstatAddPolyFit(JKQTBasePlotter* plotter, InputItX firstX, InputItX lastX, InputItY firstY, InputItY lastY, size_t P) { + std::vector pFit; + return jkqtpstatAddPolyFit(plotter, firstX,lastX,firstY,lastY,P,std::back_inserter(pFit)); +} + + +/*! \brief fits (in a least-squares sense) a polynomial \f$ f(x)=\sum\limits_{i=0}^Pp_ix^i \f$ of order P to a set of N data pairs \f$ (x_i,y_i) \f$ from a given JKQTPXYGraph \a datagraph + \ingroup jkqtptools_math_statistics_adaptors + + \tparam OutputItP output iterator for the polynomial coefficients + \param datagraph graph representing the (x,y) datapairs to which to fit the regression line + \param P degree of the polynomial (P>=N !!!) + \param[out] firstRes Iterator (of type \a OutputItP ), which receives the (P+1)-entry vector with the polynomial coefficients \f$ p_i \f$ + + Example: + \code + JKQTPXYLineGraph* graphD; + plot1->addGraph(graphD=new JKQTPXYLineGraph(plot1)); + graphD->setXYColumns(colLinX, colLinY); + std::vector pFit; + jkqtpstatAddPolyFit(graphD, 3,std::back_inserter(pFit)); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_polynom.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatPolyFit() +*/ +template +inline JKQTPXFunctionLineGraph* jkqtpstatAddPolyFit(JKQTPXYGraph *datagraph, size_t P, OutputItP firstRes) { + JKQTBasePlotter* plt=datagraph->getParent(); + JKQTPDatastore* ds=plt->getDatastore(); + return jkqtpstatAddPolyFit(plt, ds->begin(datagraph->getXColumn()), ds->end(datagraph->getXColumn()), ds->begin(datagraph->getYColumn()), ds->end(datagraph->getYColumn()),P,firstRes); +} + + + +/*! \brief fits (in a least-squares sense) a polynomial \f$ f(x)=\sum\limits_{i=0}^Pp_ix^i \f$ of order P to a set of N data pairs \f$ (x_i,y_i) \f$ from a given JKQTPXYGraph \a datagraph + \ingroup jkqtptools_math_statistics_adaptors + + \param datagraph graph representing the (x,y) datapairs to which to fit the regression line + \param P degree of the polynomial (P>=N !!!) + + Example: + \code + JKQTPXYLineGraph* graphD; + plot1->addGraph(graphD=new JKQTPXYLineGraph(plot1)); + graphD->setXYColumns(colLinX, colLinY); + jkqtpstatAddPolyFit(graphD, 3); + \endcode + + \image html jkqtplotter_simpletest_datastore_regression_polynom.png + + \see \ref JKQTPlotterBasicJKQTPDatastoreRegression, jkqtpstatPolyFit() +*/ +JKQTP_LIB_EXPORT JKQTPXFunctionLineGraph* jkqtpstatAddPolyFit(JKQTPXYGraph *datagraph, size_t P); + #endif // JKQTPGRAPHSSTATISTICSADAPTORS_H_INCLUDED diff --git a/screenshots/jkqtplotter_simpletest_datastore_regression.png b/screenshots/jkqtplotter_simpletest_datastore_regression.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0c9f97b035fa9ca515758ae782c9d938278f13 GIT binary patch literal 140376 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�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

mbFhR26b;Elj>kzCL)P<<1Xd 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 B@y7rF literal 0 HcmV?d00001 diff --git a/screenshots/jkqtplotter_simpletest_datastore_regression_lin.png b/screenshots/jkqtplotter_simpletest_datastore_regression_lin.png new file mode 100644 index 0000000000000000000000000000000000000000..409783fe7c75be1c381d71e4ea949aeabedcc4eb GIT binary patch literal 16393 zcmZ|0cRbbq`#*lHtgIqrg(8H8y|>I{3&+Z+Y(kD%86mQgtRy3Q?_+0XB^)DrJ2uDW z`#7h1y}1Og#Zx-X{*fnZBQAXwG} z*x;Sk<9ciG2g^lMQ3jIVL%$4O;95(oNkbq-5yU5Ec;Gdm<9!1c2!ym5{ST|nA?q=C z^OCE)zN?mlm8-j%vn52)+0xS9#m2!EszU(2BI&0jC#~%PT}vYLpwt-(d_}GxKt(Hs ztNl2>kbvOj=bhQ5i=Ss+2D6feW~GsS#tCN)@r#nvrNWofka{O?AZHnAEMQ3}bTffe z#qZj+cT!T7JxTyc?42Q>!>BaQ= zh&@xCPehwNKA~U76h1`XubC2;&!iHUst8{2b)W z%%dzy!C$19h=hhH%;RjR*Y8VT*AZHE&>K%}_&Ni-OiSgh@Tr4~jQh0(;rdNaB7TlD zoqMkd2*X3CanQVxfE?a~+F-qSnHXANQ;@3KsjITq<>RGl5;^ zNf*sLVRth>b4A$L>xcJA)Z&zHzDN^DUDlMX;(jL!{uemCK&UpBMeO%!Y7P6Atd|D` zy-K@MHzZA?p2=I!@6KJHXzVJLd#WURWD&V4-yGr+FFvbKFg9D0BUhH#{dIMX1X2&a znHwZgj!RE{ek~e2C#&P~Q9i`t@d+EAbDY(Ot1C?F?m;n>S*bQl6wQ2&DKFWs|5RQ2 z|NMsS>&f1-h7>0sCYC<;hq4h%QCkU=?ZzL?p57-B{~S7{e>L~XQorl6qNYN`=#8tK z3dR8u{f*w=V8ZDQ9C+$flO^LLG!_*aN-Ys&W3id}24=QsZQT@oybp9EqHgY z7BTGDV&hp{o3cN{GE`a};@CKX{A+${^bpU5JxsVgD%&S!_LGf|8RFkKhNpkQ`%#CZ zt~4o*E5*~BS9c4fuHzkPG!&7p^Mr%dz8+`WP4$~)5z4tH!_RxwGpw5L1rZ*-ieu1^ z8)va}cRRCWgm_+-5G86(#b9TitQlOqCZtP1k4;WfYwV}eU~LjS6@a}C*|3->)U$9{BKeqMrWDqF}fJ0+)uf$n%vJw|)vs*qbQRB$4N% zxL;%fi1>1qqS@#ZdgkLypm5LUq^gcXUlm|6 zkgD?F=vNBPK`G2SzV=tJp#!B)v_wvw=R2KjMYyJyEzsHU2KWzO(!w=*CRqgLa@ku(5U& zmVX4{41Cp0CrXm=_H(us*;VO|)q{5UQ}r!hrq{W+oinK2n%+b@D1;6!z7}6%Q zG2JV19ESdZgQC(t=nxBXu=a&ZI9w5|YniGL^UmHbeBasD?;EOkvw{wyObQROFyq}e zPY|$^I6rX#u9GYdTiS)~E;SbIdu(^GFH;>XXQlvm*|F}iy-Y2L>|hrbfS|CiIh#K& zD6#I1Y7pAIUSidKGQ|ip*qn|KY6UX%Ve}+u@?3CFW*gl&`^eNq59U5E^w4V#QiI{+%9v`Y$_$yZwFzpJJtbKPMLO+Gn7x5wE{07;+FFJlUP1{ktuzE>JQQoT@_x!K^NrOpryq29F#r;RE=L* zR7>Kv=K`1lW=!~HZAOnY0!2frmneVMo9jlu9_8tn6zUTFIkjKKchLPTDix`CW688$ zR4@9etatz1mOqn<{=x7}sx1CRuwj-mg~Jicl2G5_y|k zzwW))Y-t-muCe2jTrGv|+mpK1uq+W-EPRirzo}7h(fYKJl~PFObz=WM(a8dThX#t3 zwUy@WZjB57SAn0@YK#Rha;4N)OqA$k@WVRIZb{9P$I7O4PEX$pIn(>S_R(n^0H#6$IKgcn}(W=x*FGI&8G(ydgo_#ZfhPnMk9JPsBfFE$UIb~ zYaDP~UT{j|w9lV*UC*o7+i@%WGH_Fq2@FQRgN?P^(7 zOAt9H#atX#NR3Z)bZ5OMjP_n2E}ONS;ndN0r9;t8`T)& z{1`@`y#}#pYTD?*!>ZQ)%&#ENKt41f$13%oooN!B^m6g0VCnFec}#1@OG>$GF`h&# zXg?lj;=}QKPA7*uZQ%@D*4koGv?8uc4)v!B@y}O>Z}>(UxyW@_HaZ0uCRA!#s(d@= zIs2i)OC`V@TWH)F$39QINATH{m$u8=E{m2wX6&hge01vORO749%y+T*zd%pbWr7&F zru0Wk+Ap(QghX)3sAZG*6TI!aNFWAX=N>OxFPf3RZ0AovnC3=kqU7?4wI!DXV&1ZX zlVkY6wtM0#z58-P9O}IKe0fKVPWZ@$^zA72j`erNxL-ByWLNouaeOrjj+97n{Z05h z>41BOd)!!_GUJ7O?&;Z0+V^oTSjp3Tr6MkT-qCDL>QW(NYyI8j7DYL{HH>hphG#&( z$~j$ZO(SsoXBXDH+n)VP;thE-Li4d-X4`V#>iZecB`1|hhp;@1%-4SY{NPJ7YSw4H z%<8yaxBP|zs!2x=5(ed~2jgGE&2f?Q(y&v{v*BUgI^Fed=j@6{YBptTb|mhrfYk@n zBe)bApvlF<0kyl2KoxTYx1{vE_vM1A-K)ibi!`m<&!k3y&Y zG3x{)^8)>aKjD)XQrqyclwVM-QfcqKm9m+JDKCTtAB0wHH~Pt~hVS^=4#rU)9nm`} zV!Nx%>!cvJ@N0h)2|}6Nd|zIytS04~Y{%Fp7R-vkHjNwO3KPc4Ld*$}RIH}F38T-B zQB8)5jH0b(LWvT-o(-K?+c8Z;mkkRf3P09_;=tnZlZY#nA#2w;j|nO2dvApMPw7j8 z^nrBkq5qw$xyUl|aH=_t-E5mEmg_mgQaCjb@h{bKvEl^D+&)(4|zC z7e>OTzfNW6&Gx8o!n8mi0;_6<&SeTq_Iwqs&R^knMto4SXtx$?f^3Ycc*(r+m6yFH zBSW%x9ug?^8n>;Lwu-s$_3MumB(!(@$eH09MK$DJ$i*irgWZ%pY`fz z?yIkDf|3a>zfd@DeA1u5i6+O{ZH@`Lo2dCt*1N{hm4b!0@AXv~+FR_vj_b+T#O z_Li6|ao_sG{elR(p`zg%OPfmggNBi692Y~lk$V#v`^m-!wzy-tNhK{$Y~D$_XK}OM z{T#ZP5E&W$nY-_?oM=p#2_NA7sgJ`xMPB_`Ym?PZnaPzOVLZWz;VC`W*7Dm(IUF^KUU;_M7M|28F?hau2COTAZTvA` z`t6(HMS9)tA?spS7KU8C26kR7ev5B!XA(au|Ck!cCc8A2YAr*%Osy6-sfb5&nf6Hh zz#GcqC>j&#$p`nr53002wZOU9M>h0{lt3iv(;WS!MQzd@;%)2o4@&u(aH^S@rcXkx&?}dAXFD#r%`$!(NIdov9%*Y)u#txR=##0P&Id@F0~9Wt$5Ke#Dx^xE^IlPBGr0eNhtj}pq? z*Qm7(p=K5ZukrIgKiXZU_lN=%{q!j3g>RX?VBO&Y9q+lk01^)tZ&g72g1XiAs+O(t z^iuT=5Gv;yprjX2FX3R`g>i(akYAhuH`*FeKnx=n)n(H69(bLg?GOtq8E??R>Ha+) z0-0hiXPUHcdK;kziIq)w*~!cqMDKA)o7Cc=@X6tD3cnVSk_8AlQ}&|MQ=QD>{I;;DGi9>AP&J4sVse4M|79--~P%(c_zg|Zp^&Yn43*{s7K zPJa>njMJ2oX+hMOiYiC$PKro&MN3Rm;t4&YnFYNqFGv+B(yF$$(jB0q!2NqZf{=rj zyvCcuXGM1fB_zBSZoAhIXp`CzaRz14J5MQT2#0-gzNyO*ffT22jS$Ev$-!ZCSJIi4_&bepxfjF#mZ?kqWYoy?uE8w&$_>Mx>Rdud1nBE);C z`P*`6XnlwC;ALlOowLW%ufMmvb`>*w;FP*6~UqhS2MzIlGa%imp=K(gX10@pc zy%I}R(5^+~knFJ|h+jW#FK8YJf1MH*c4KsBp<9J>W+A~LV@{S#oUb^T$>+d7LLU2{ z)!slpm)JPTdYhI{@07m6t(dE+?;M6KGyg^;(AFLa%$sXuuI_lUx?Oh#DUToNMVJj4Pt*$PE{@_gW zmF$X6G7d@8dB072uUgB{jk4hoyZv8_T!y*{^kN^{YADctqiTMsyM$%)OAkx)}M{LKp%9+$fW5IJrs8R z*PY%ZAfIy{Yu8hq`ox`x4jNXdR^Qm<3@D^V&YS)=Ve=^X_BK()2Pa^LqI47esvH;R zTigD30Ha64FkG}EE#!md%>qsR=Z^>X1>kYfDb1|d*f3!PSS7iOxkZ5vzHW!01dpVU zkLmE$X*G^8i2Dc^C7`r^dT+|%<&0z5@tOzUo2n^K+DA>ovW@WjO-0+qdLS-$txPd_5nDNO_V8_~E_lJup8-U`(Icr9N`IGM$|tg06Ms9Rd949#O2MUtedtFz zra1Lmr^qJjvK-3w(RsttEW}V%Nr8{Io%1gdMlu$>{{-`z?opxL)zr3nFR>;%rde3Q z=6^!t8*gN6eA0-6yd;QYJ>QXCTWwJ>GX1DZU|Y5=6>y>GI{0;^G5+ z5MI4BHFxh_)I%Dkg7ZFF8SXU_YW_t*UI&*lZP$7H4yduwYNHhn53E2Ie=|X$>0>7| z1oGi~xy9IevQx!M-j6rwDFz3s*99ep3ZGG1(X?WFZCL)bcXQ48LV{Dy0J0vh+dnx1 z?f@)=d2ihCgUjIl2GooZm0V4lAv8>aH~u1+YT@u~;8KgVfjXqj;yY-)-aOo!$03*r7v#A)4 z0BQ6b|1JT7x+Ey^K9f=xmh-U$a6mkib0NT7sR)qX1~5}i=$~H5p!B>9g54AZkX~NE z?3VE!SSY8)f#+v@at`if#!r^Zr_V@IA5i7+vKf*MPX?qyo0L0;{s*IukPa@Aisg4C zpg?tg??G04PO(y+uE4LKmtMz175{*a|M)l7XY?kXb=K-}k`?57=A3;vN;%)H62;7_ zxE1R8d~bEQz>R{6OZN*FP*7fw1UxH%yN#AUnN$gG28Du=N~c*gVAj5)y<^^Tw6{7R z*1#G+QesUE!0{8UY$ZP{h)6Ge!VK>L-{VxG&TP_SFxWfo-f);Gj#q5i90qISzz0qylm99{>JB{rHmg^-i#9YSpD(_{Kgp8V4M$tdx8aEbpeJ8o$vx!7X1e zh}^P;b@Z(-O_r9HCdrGT5Ee12>gp2ua(!L05Wm&K=_N9EwR)93-R0rgWVNSn>6max z;^X6O!(ZV8%~x80R><+%nB`&*t7168Z%N2&gNo%~f_M@zLATu;N(sKzRBn=-jQzDP z)>{0!{o*qiFM`V)6G`@2?7eP1;IO^-wfiWAxPDz+EA0Y0Xcx6Yan~L;6#a8}biyg_ zXKN%5U0OtRwZl@$ngqZlhY(zlLOp=S09)5t{zT?l*xQx7rw%%F=W8{>>;vAJ>R-nk z26L=;S8iAnRUmCALdO761yt1USijEU#SYoWoC!|JFDI)xCcJ<;OXHXr8Ex9NlTT1U z(B6Uja{R#K)N?X~>Rb7vGOq^`U)30e8fLM8vzGt1K2r8I*GCb&Fq;g@b&;ab8j^;6 zXcqkpj5iZQ4usxEFRDMa_wrg*tjIrp!QhUM4m_rRKYfQBM>c@G3q7_lP7C9{^a1+m z8p)dar+F*0^>j?@ZzIfj5yUQ}Sde~J$w|G6e20;{q&JqTpBk*(1+evvGr(-%6P6Xt z%LV`=e(yTExDu<*zERU(DcVB}xebhdow%e$6pO`0>1^rFvdfgT&eBLDsNt}M1Z{FM_VNxF>lRY2d`C7Mx3Ng{ojzPuROY3YH#AoC6K<^U-|1^o3s0Oj7sgbF|UnTOK2Y;_KwPCqZK~q6I?6k zsUZJ+G|*q5c@VUJ2E>4?CuPn*(Z@hHvI^)iF*OgeFBM1JBt^m-mMd%KA!;m4Y9}{irlJ zS&2_b2>ZD50@vx`f|wFlyRlq1(U zINp4h(X+6t#(m-Gsj4J>R#a)C1|#e@A)FQO&9S65;QQkr_inrFt1P zQ>9%FK`+ETC}ApE&N~15ARN>}^Y?lS3B$I#bo8(ZvK(k8pGF+XE%A{lq zQws(j^S>Xf`beMs%+o4(v43^Y5RKi9zLM?Tz4H`cQZM1R7s(;}vco!E<=>yY*O$c{ z$fe=y$=$+TtPn>A5C(b{j?*U3Ek{j2nytjSGyZw;b~G#F~{2K3mH86Lw z2i4E^2?cMZhN4sMgNd%Mm;iMq^kRKZr3(tCc;;jqx>q*qC3)JyN>7T(yw&m0sDCqj znlnJuopRy@a5Fr#d16@iE0&fR834RYXZy0rnw2i>$oZ?kNyoL4Th9$JAuM~->hQ~4 z{fU5Up~I5K#L+HCsorEA^*wV@rIw5Qu#M6$T{k=iR( z2GJ$o0Cg)GZhcE}vZucnfVVSl=K!q|h z=GR$aYlxy(-CKit`@h_oM&`a|CY#rMPgaA2RQD!A1=LTZhs~Jo2g}Y$VbPLOqJfSf zzDb8jD{j!MBx5BnM3##!Ux{AahcAM_OtQqp*BB9Mf!9rg{bw-6UsNPQeeMdb39VfC z`0Qr)bo1zAUFtHbd5ZO(x7%PRXPxr;?5ZP=0_eUE<(bCr;5 zX$kB0g)xH}peI5fNh|47>xlob#?7u+36N?8kNc#!bq{?iqckP*#;XlLNMmJ(^+@*w zC42yjF;_MVUZt<5L2FW=G6Jxq3IS#BNjexV_U*`_Je!<5AM>zbb#F#Tu>jhg9zdMZ z;k#Nyms{DE&aX#zsnJ%RVj*#!H<{lL?Yz894x6zT+r*6<62A; zM*(F_$PN{*VV1^kr2~QXnVw=jsB|(&F!bQwgRi+S6J=8NBpFr)UPe-pqSq`O1ZjDX zZPEyWOn0lG7F@^4=G&JtC2NIOGAW0LbN3|fAm%8}dwrzGgr_Z#G z`9Y{hTlQ@)bY@IGi4J*P&^KsN;opHRSacoKnfHD8| z*Wy%o&wMf+YOSy<&^W_0r~mlv6(m%{Hns@|-z%DpYRq$wvvj!S&1mg^zZ44xzI@o) z#y^qY2w?wZr`f?DOw`bPk2L=A*y!@0;V2-eX&c){%R?zujS?I8#WmM-b^e3I5#D#{1 zckuRWfPJ$k@HtE*e!pZ0Bh(PSNCCvmN5W!`D}Eq{3bK~0J#MjIFTaX*nZGB>rGNrf z9s29QW1C3@lo>8yP#=SDTq~$cIh371*NM@$n=pAA>#A&a@!!?!QLe@6y%RhP>Ht~| zaGN;>#EV5FUg=+L5u5u@puKndw!cw(q5D z_|9686vi2&X$;1fQpZ&4m8Sn>ZGLbe7{6$&$30qd-(`08wk}5tkkIIf zk$8zAZpx`ZXZ6$-aSy@<7HIK1)uQ?2oRy+^(4MG>N*?d}m3q%1nZb%?1%uw&q+4(_ zdp#NL+K6e2Y33MTyYjEMrxy)Zjk^G813yJ`N&oNrA#H1WE)k6QOfTe00fz-22l1u% z6=6;Ycy~j*>)OgHA`)XyUd@$s+754Yh)SG`J!l{eIbf6DyRIEg)}JZ?-#Gl%JKNd@ zdO|sa1ip2}Hhae(i|o}Y12m>k=WxA+W_G6o4gaZAspCEP(nDw7D`(|N;i$#Yxv zR~IBkq27C{8xt!F2?E_4KL3;U1z9b1DptPAGALmixel7S)_&wOoc?J3Z?>2gf0H@< z113={lo;`P|2sW5aRItSd=0sy(Q64bP`1RPI@>#!O1?zYDw~aQ*awo%I1(4S^yr$Gk%3M4=2MZfdRlzSS%W~bwQzKe#Z7Z>QLmLQ` zTWSO`?sf5B?gx%VYk_oLy^;lLD?FD4nMO`BBhJ5ga!GJ7=74bcIaqBipwsMnY_r{% zSA6_~Uam9o{k7e71)$WH($=}r_5)Q8T*!wDz_)IA%sY+=Op-}b zj`6^M#wF&eDZs9L_EDZTkvx7@iNQ0#c`=0>dUOu?ax4^xoW6IF?x7QdAHX;Urpamd z*rq6SA?fc58rNb!u8h@GAawH+9p>)aZGWd_G{G)*E)Fc9;{oD;Q2DeTtS;o&pY#%( z2zqU7E~KZReB;#B0+P1(^nYbDP{s*UI&{NZQ)du`luZ7 z%^GE9V}G+)8HitZM@I+qE3vJX%a5Z4Cp=z#cV79)fyo%lZ2DO|+2VIyznhf=b}I@@ zZf!ASSIk7unCPEiqXC(|@gx5;1dIHajEv$Z*FReor1+k_=!m+pKj|weJ`l=VchD_3 z`A+gs-}RF-O$zSvObijsL)y234OQ;tn6(BH4w8UA~AM8nXwUdBw~TY$>Y{5nAVrlP-1iOm(3)GeH2kX{HVoVh2a>IX0i zQ?C>Lpn*(J(Y(JFQFq>c_E)DtmvVr}@1MGw9Z*9J950L`00P;7z=X-VfgTgn6qb8& z{Q?9+hR$xc426F_;P}!Ph&I#T+yoR1XV5j*^dda~vc{$$r%dzg0up}0Z+eBU!*(@h zp+pi~1YXz`=lzqGqid_Y__C-@u_WQ;VH?bcZ~5r=w6=v@jmu2;Un*<}YQh81 z6T5~38wm%PY?oQ81E)%%oU~SALc27C79_B8Ppwvf_vWl{kJ49z;_4qb7v8)MiYT7l zP~alGw|u0b>4i{dco}TixnlpHGC(rihI(A{6KD{}MW!=zv3G5725f|RvbQ`ZH73Lm zMX-`+WV*-7%*pF!B}c7LjV;uLp(^Oo!rxLTXge5t zBp1hHd^7&ThxG&3kE`7` z)CHC&>m|o5SBGSSND21{ULsV;5zraWE`n;(V;LEG7JMT0-dm@evL;4}4ldKxG?d{V z?tJbTqjo@;csed0w@wJ|m3;kqLsHrAB0f>OfM z&yNy4UmZ%iW6>%==+wfcn@b~TpO{Et=U;O7+^||3@eCNJyIQRZ;3L354NA=-X%yNc zuHG@1Q&tX1r0}?Y4$Wh z-<~f3b#hUOy4f1m$t{TQ6pYtv1NdR%J`~6lFNK2&<5Yov;_>RO_-=XTbX2mX0xtv5 ziS9eVWSQ?H6H;>GHT9oq=W$4?5;}oI9s`je2*xR)h?2jiTqR;G@`7zBgk zWNFAiIh)Tr_I8LTExPK$<;N_TO2_v1tm}Fud0hv;DAnz)hT35jgrccFrv46a2Vka1 z7usOq)O+ti-QQN(?9n4!y+>f~m}mo>nyWmRj!BRH(ZfC6XeTw0sC@qg%JaVyBTO{7 zb6rrW8@P;E`q-sPAbdUHAHbB4K7f$?~qUkX+ zPKXX!reqqzkAaL(^L?$D*M-SFf%Ffa|H+c^77s>dKk5)|Bzi6`uwFTTaRoda6PCan ziCRX=xF)9DLGu()QKMY{g2TBfk9>=(x2UxG&cY&Cx5cAFtd3t?x>`dZ7P2LoLAy zR5gp1f<5Q^K;SxFP~$L?+y~_2F*|y(f2|7S6qDZj476WB>(b-stNc&j831~$+{hN*}J2Ix}uGVw{*C{|65e4ab<&O@qfOv zxIlm9fM{XkBku!_S}(+WpcavxkuV5`V2;01zVHD*s% zG)2dMLq7)F8=>K)diFl+S6;C6wPq&65)?EHj0Cam1kP5y-XIk3`EiQv# zcIPA{a#hi4(P{_KNl1e(>c{v&C2}<#%}*eHCZOR^oPA$R?AUD3F#STD=iDBfq_I1m zI}Eg4VTco&+^7EH3IbeYV^4<{Fl=AOU(Q{6mmj!qBzuoo)|EXAwd3HJc?d-pqko58 zOB2|s+jK<>{~M}6Z4LNfsor>$rxRZK4AC&-Zp~o!H^nuqe;u7|B-E{u8;=N7K3^9O zPeM-<0NAd%KUF(jfY(~oAA~bek9E{}_Zm9|T-|;j+4w(SwnC^x#teaqC^M33*dPA< z+a{MnE?p|H?nSNw+gx4lrT&`O-QC@{bb{++6%iI2MNbCUJn@K##I`EDJxS?>q%wVx zh&$op3cy2?&H#c7qZmcqke~GYeBMkWEa)YD#A3)AqDEDMm4{--uc)R-Bqb|2f}2)- zewC}U%9FZBtwHu)>nXi?CiQ2vuZ402hK&`|hVqSbtmFzB_Tt}MX8*Cgztk_=o#k;| ztK8PW6VDm&0kqCK{xLO$QslHhP0@wEYq8kO3Uf6FwEk(`L-*mAJ{=5!`U8~yN=wE2 zxHW?5LFR)vk)u0k>YKvyQNT{Q*}neNjhWhfq}cL*E(!z|R9y4`w}*n1Ze~tBGpf4# z95gnlbO%ELCMSuyXAFRzhV+jBl`~wIf9w*yga4V%i-maWrClbkP3drpLnDFj1hB!Z zhqB#EZIz;0IlA1QcuTYTU>VE#BL(S>n=v0Qq^!U}JXW|_|KH={3;m3Q@}x|VVNWZg`=;pyi$ zYl@0u=F->(S9(TD<<+hA_p!-t9kM^Dw z_-SwmX*eImUfgZV7^r=*qsaK;HO>H<_$B#(_7Wihsh?RB9~L~ z%X-MFjJ`p9BZ%i7f=8sOoSNB9+3^;rKOBR8Q_y=_|6I!EqIjZq+wTiygV{P@chL%^ z$SLTF0r#+g0debOQ{wAN^{N+0flF0F0u0r=xmuZ|;Nls$;wIuDN{i@>;b``!3Kk9m z1Q>HyEu2C0J?Iv`oP@247tY@+c`kOk0&bw?8dij>p9j*}gXw_|K~WJu5;_4eA8y0) zFF5*TPpR56TvqccB#x0K;HKM$I~KrpeNUXiS-+*BK7!kQ;GziT`l7rf9NZq9Z6LZ; zF$`LMwKO$>U3IOMd2G#q%YII#;Jz6bH@DqVUn*emvj|r(4BW4~!ei9#zl_e?onZ#y z^Qhu0U2B%y@5j2FZ&k#V35`L~jkUk3_dq>J7)9f<@I7^a3D`{AM4DQHz%Egu*o!EO zh{(i5)l5n6BUfH&YtUXQ_=p?P#zr|8?^P#AS}TBy=ZmGhR03hpoIXOw3HIM zgY*AhtPWkHVsGTAXtrM6@T!va*IEzg9k_SCftymec)p6~RZf)X%6>NdH7x-mR}kUc%(G3br^%a3WH9>16oX<`f6b8^Q{ zc>Cf~z|P<&;rXWXZ5E+pz3%xpbOj-ES&buYA?RIp4d>=*7Qz;oa8H95dHqip0uq1(Xa$eimT63}1iL zro*PFrjyV)8K&mPW!c5{YGM?%w5Lk7iqZQ_PEk$MEgVw9CPa$AUk_TlAmjK*Jb;rg l(CuxI#Q*;nt;+-FWC9410J6uX*T7JSlDxWHzKrS1{|7N${44+f literal 0 HcmV?d00001 diff --git a/screenshots/jkqtplotter_simpletest_datastore_regression_linrobust.png b/screenshots/jkqtplotter_simpletest_datastore_regression_linrobust.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae0643b33065532d1a13d2e83633fde214fd8a8 GIT binary patch literal 23291 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 literal 0 HcmV?d00001 diff --git a/screenshots/jkqtplotter_simpletest_datastore_regression_linweight.png b/screenshots/jkqtplotter_simpletest_datastore_regression_linweight.png new file mode 100644 index 0000000000000000000000000000000000000000..3fff18dbef1f94b9d7daa16f9fe01a5869b9998d GIT binary patch literal 24799 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 H%>DllID0f= literal 0 HcmV?d00001 diff --git a/screenshots/jkqtplotter_simpletest_datastore_regression_polynom.png b/screenshots/jkqtplotter_simpletest_datastore_regression_polynom.png new file mode 100644 index 0000000000000000000000000000000000000000..be807eddc52ca149f3078b228900d47c16176593 GIT binary patch literal 33695 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�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

t_k_vYwwdC*|{~!svFrZ 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