Polynomial Regression in F# QuickStart Sample

Illustrates how to fit data to polynomials using the PolynomialRegressionModel class in F#.

View this sample in: C# Visual Basic IronPython

#light

open System

open Numerics.NET
open Numerics.NET.Statistics

// The license is verified at runtime. We're using a 30 day trial key here.
// For more information, see:
//     https://numerics.net/trial-key
let licensed = Numerics.NET.License.Verify("64542-18980-57619-62268")

// Illustrates the use of the PolynomialRegressionModel class
// to perform polynomial regression.

// Polynomial regression can be performed using 
// the PolynomialRegressionModel class.
//
// This QuickStart sample uses data from the National Institute
// for Standards and Technology's Statistical Reference Datasets
// library at http://www.itl.nist.gov/div898/strd/.

// Note that, due to round-off error, the results here will not be exactly
// the same as the NIST results, which were calculated using 500 digits
// of precision!

// We use the 'Pontius' dataset, which contains measurement data
// from the calibration of load cells. The independent variable is the load.
// The dependent variable is the deflection.
let deflection = 
  Vector.Create(
    [|
        0.11019; 0.21956; 0.32949; 0.43899; 0.54803; 0.65694; 0.76562; 
        0.87487; 0.98292; 1.09146; 1.20001; 1.30822; 1.41599; 1.52399;
        1.63194; 1.73947; 1.84646; 1.95392; 2.06128; 2.16844; 0.11052;
        0.22018; 0.32939; 0.43886; 0.54798; 0.65739; 0.76596; 0.87474;
        0.98300; 1.09150; 1.20004; 1.30818; 1.41613; 1.52408; 1.63159;
        1.73965; 1.84696; 1.95445; 2.06177; 2.16829
    |])
let load =
  Vector.Create(
    [|
         150000.0;  300000.0;  450000.0;  600000.0;  750000.0;  900000.0; 
        1050000.0; 1200000.0; 1350000.0; 1500000.0; 1650000.0; 1800000.0;
        1950000.0; 2100000.0; 2250000.0; 2400000.0; 2550000.0; 2700000.0;
        2850000.0; 3000000.0;  150000.0;  300000.0;  450000.0;  600000.0; 
         750000.0;  900000.0; 1050000.0; 1200000.0; 1350000.0; 1500000.0;
        1650000.0; 1800000.0; 1950000.0; 2100000.0; 2250000.0; 2400000.0;
        2550000.0; 2700000.0; 2850000.0; 3000000.0
    |])

// Now create the regression model. We supply the dependent and independent
// variable, and the degree of the polynomial:
let model = PolynomialRegressionModel(deflection, load, 2)

// The Fit method performs the actual regression analysis.
model.Fit()

// The Parameters collection contains information about the regression 
// parameters.
printfn "Variable      Value    Std.Error  t-stat  p-Value"
for parameter in model.Parameters do
    // Parameter objects have the following properties:
    printfn "%-19s%12.4e%12.2e%8.2f %7.4f"
        // Name, usually the name of the variable:
        parameter.Name
        // Estimated value of the parameter:
        parameter.Value
        // Standard error:
        parameter.StandardError
        // The value of the t statistic for the hypothesis that the parameter
        // is zero.
        parameter.Statistic
        // Probability corresponding to the t statistic.
        parameter.PValue
printfn ""

// In addition to these properties, Parameter objects have a GetConfidenceInterval
// method that returns a confidence interval at a specified confidence level.
// Notice that individual parameters can be accessed using their numeric index.
// Parameter 0 is the intercept, if it was included.
let confidenceInterval = model.Parameters.[0].GetConfidenceInterval(0.95)
printfn "95%% confidence interval for constant term: %.4e - %.4e"
    confidenceInterval.LowerBound confidenceInterval.UpperBound
printfn ""

// There is also a wealth of information about the analysis available
// through various properties of the LinearRegressionModel object:
printfn "Residual standard error: %.3e" model.StandardError
printfn "R-Squared:   %.4f" model.RSquared
printfn "Adjusted R-Squared:      %.4f" model.AdjustedRSquared
printfn "F-statistic: %.4f" model.FStatistic
printfn "Corresponding p-value:   %.5e" model.PValue
printfn ""

// Much of this data can be summarized in the form of an ANOVA table:
printfn "%O" model.AnovaTable

printf "Press any key to exit."
Console.ReadLine() |> ignore