1# -*- perl -*-
2
3# Test unweighted line fit, three points (an equilateral triangle), 1-D arrays
4
5use strict;
6
7use Test::More tests => 19;
8
9my $epsilon = 1.0e-12;
10my @x = (1, 1.5, 2);
11my @y = (1, 1.866025403784438, 1);
12
13eval {
14    use Statistics::LineFit;
15    my $lineFit = Statistics::LineFit->new();
16    is($lineFit->setData(\@x, \@y), 1, 'setData(\@x, \@y)');
17    my @coefficients = $lineFit->coefficients();
18    cmp_ok(abs($coefficients[0] - 1.28867513459481), "<", $epsilon,
19        'coefficients[0]');
20    is($coefficients[1], 0, 'coefficients[1]');
21    is($lineFit->durbinWatson(), 3, 'durbinWatson()');
22    cmp_ok(abs($lineFit->meanSqError() - 0.166666666666666), "<", $epsilon,
23        'meanSqError()');
24    my @predictedY = $lineFit->predictedYs();
25    my @results = (1.28867513459481, 1.28867513459481, 1.28867513459481);
26    for (my $i = 0; $i < @predictedY; ++$i) {
27        cmp_ok(abs($predictedY[$i] - $results[$i]), "<", $epsilon,
28            'predictedY()');
29    }
30    my @residuals = $lineFit->residuals();
31    @results = (-0.288675134594813, 0.577350269189625, -0.288675134594813);
32    for (my $i = 0; $i < @residuals; ++$i) {
33        cmp_ok(abs($residuals[$i] - $results[$i]), "<", $epsilon,
34            'residuals()');
35    }
36    is($lineFit->rSquared(), 0, 'rSquared()');
37    cmp_ok(abs($lineFit->sigma() - 0.707106781186547), "<", $epsilon,
38        'sigma()');
39    my @tStatistics = $lineFit->tStatistics();
40    cmp_ok(abs($tStatistics[0] - 0.828962859079729), "<", $epsilon,
41        'tStatistics[0]');
42    is($tStatistics[1], 0, 'tStatistics[1]');
43    my @varianceOfEstimates = $lineFit->varianceOfEstimates();
44    cmp_ok(abs($varianceOfEstimates[0] - 0.412037037037036), "<", $epsilon,
45        'varianceOfEstimates[0]');
46    cmp_ok(abs($varianceOfEstimates[1] - 0.166666666666666), "<", $epsilon,
47        'varianceOfEstimates[1]');
48    my $sumSqErrors = 0;
49    foreach my $residual (@residuals) { $sumSqErrors += $residual ** 2 }
50    cmp_ok(abs($sumSqErrors - $lineFit->sumSqErrors()), "<", $epsilon,
51        'sumSqErrors()');
52};
53is($@, '', 'eval error trap');
54