public void prediction_test()
{
// Example from http://www.real-statistics.com/multiple-regression/confidence-and-prediction-intervals/
var dt = Accord.IO.CsvReader.FromText(Resources.linreg, true).ToTable();
double[][] y = dt.ToArray("Poverty");
double[][] x = dt.ToArray("Infant Mort", "White", "Crime");
// Use Ordinary Least Squares to learn the regression
OrdinaryLeastSquares ols = new OrdinaryLeastSquares();
// Use OLS to learn the multiple linear regression
MultivariateLinearRegression regression = ols.Learn(x, y);
Assert.AreEqual(3, regression.NumberOfInputs);
Assert.AreEqual(1, regression.NumberOfOutputs);
Assert.AreEqual(0.443650703716698, regression.Intercepts[0], 1e-5);
Assert.AreEqual(1.2791842411083394, regression.Weights[0][0], 1e-5);
Assert.AreEqual(0.036259242392669415, regression.Weights[1][0], 1e-5);
Assert.AreEqual(0.0014225014835705938, regression.Weights[2][0], 1e-5);
double rse = regression.GetStandardError(x, y)[0];
Assert.AreEqual(rse, 2.4703520840798507, 1e-5);
double[][] im = ols.GetInformationMatrix();
double[] mse = regression.GetStandardError(x, y);
double[][] se = regression.GetStandardErrors(mse, im);
Assert.AreEqual(0.30063086032754965, se[0][0], 1e-10);
Assert.AreEqual(0.033603448179240082, se[0][1], 1e-10);
Assert.AreEqual(0.0022414548866296342, se[0][2], 1e-10);
Assert.AreEqual(3.9879881671805824, se[0][3], 1e-10);
double[] x0 = new double[] { 7, 80, 400 };
double y0 = regression.Transform(x0)[0];
Assert.AreEqual(y0, 12.867680376316864, 1e-5);
double actual = regression.GetStandardError(x0, mse, im)[0];
Assert.AreEqual(0.35902764658470271, actual, 1e-10);
DoubleRange ci = regression.GetConfidenceInterval(x0, mse, x.Length, im)[0];
Assert.AreEqual(ci.Min, 12.144995206616116, 1e-5);
Assert.AreEqual(ci.Max, 13.590365546017612, 1e-5);
actual = regression.GetPredictionStandardError(x0, mse, im)[0];
Assert.AreEqual(2.4963053239397244, actual, 1e-10);
DoubleRange pi = regression.GetPredictionInterval(x0, mse, x.Length, im)[0];
Assert.AreEqual(pi.Min, 7.8428783761994554, 1e-5);
Assert.AreEqual(pi.Max, 17.892482376434273, 1e-5);
}