]> mj.ucw.cz Git - netgrind.git/blob - post/linear-fit
TODO: A note on IPv6
[netgrind.git] / post / linear-fit
1 #!/usr/bin/perl
2 # Simple linear fitting using the Least Squares method
3 # (c) 2003 Martin Mares <mj@ucw.cz>, GPL'ed
4
5 use strict;
6 use warnings;
7
8 my $n = 0;
9 my $sx = 0;
10 my $sy = 0;
11 my $sxy = 0;
12 my $sxx = 0;
13 my $syy = 0;
14 while (<STDIN>) {
15         chomp;
16         my ($x, $y) = split /\s+/;
17         $n++;
18         $sx += $x;
19         $sy += $y;
20         $sxy += $x * $y;
21         $sxx += $x * $x;
22         $syy += $y * $y;
23 }
24 $n || die "No data found";
25
26 my $b = ($n*$sxy - $sx*$sy) / ($n*$sxx - $sx*$sx);
27 my $a = ($sy - $sx*$b) / $n;
28 my $d = $syy - 2*$sy*$a - 2*$sxy*$b + $a*$a*$n + 2*$sx*$a*$b + $sxx*$b*$b;
29 my $var = $d / $n;
30 my $stdd = sqrt($var);
31
32 printf "Number of records:      %d\n", $n;
33 printf "a:                      %.9f\n", $a;
34 printf "b:                      %.9f\n", $b;
35 printf "1/b:                    %.3f\n", 1/$b;
36 printf "Variance:               %.3f\n", $var;
37 printf "Std. deviation:         %.3f\n", $stdd;