freebsd-dev/contrib/ntp/scripts/monitoring/lr.pl

152 lines
2.6 KiB
Perl
Raw Normal View History

1999-12-09 13:01:21 +00:00
;#
;# lr.pl,v 3.1 1993/07/06 01:09:08 jbj Exp
;#
;#
;# Linear Regression Package for perl
;# to be 'required' from perl
;#
;# Copyright (c) 1992
;# Frank Kardel, Rainer Pruy
;# Friedrich-Alexander Universitaet Erlangen-Nuernberg
;#
2001-08-29 14:35:15 +00:00
;# Copyright (c) 1997 by
;# Ulrich Windl <Ulrich.Windl@rz.uni-regensburg.de>
;# (Converted to a PERL 5.004 package)
1999-12-09 13:01:21 +00:00
;#
;#############################################################
2001-08-29 14:35:15 +00:00
package lr;
1999-12-09 13:01:21 +00:00
##
## y = A + Bx
##
## B = (n * Sum(xy) - Sum(x) * Sum(y)) / (n * Sum(x^2) - Sum(x)^2)
##
## A = (Sum(y) - B * Sum(x)) / n
##
##
## interface
##
2001-08-29 14:35:15 +00:00
;# init(tag); initialize data set for tag
;# sample(x, y, tag); enter sample
;# Y(x, tag); compute y for given x
;# X(y, tag); compute x for given y
;# r(tag); regression coefficient
;# cov(tag); covariance
;# A(tag);
;# B(tag);
;# sigma(tag); standard deviation
;# mean(tag);
1999-12-09 13:01:21 +00:00
#########################
2001-08-29 14:35:15 +00:00
sub init
1999-12-09 13:01:21 +00:00
{
2001-08-29 14:35:15 +00:00
my $self = shift;
$self->{n} = 0;
$self->{sx} = 0.0;
$self->{sx2} = 0.0;
$self->{sxy} = 0.0;
$self->{sy} = 0.0;
$self->{sy2} = 0.0;
1999-12-09 13:01:21 +00:00
}
2001-08-29 14:35:15 +00:00
sub sample($$$)
1999-12-09 13:01:21 +00:00
{
2001-08-29 14:35:15 +00:00
my $self = shift;
my($_x, $_y) = @_;
++($self->{n});
$self->{sx} += $_x;
$self->{sy} += $_y;
$self->{sxy} += $_x * $_y;
$self->{sx2} += $_x**2;
$self->{sy2} += $_y**2;
1999-12-09 13:01:21 +00:00
}
2001-08-29 14:35:15 +00:00
sub B($)
1999-12-09 13:01:21 +00:00
{
2001-08-29 14:35:15 +00:00
my $self = shift;
1999-12-09 13:01:21 +00:00
2001-08-29 14:35:15 +00:00
return 1 unless ($self->{n} * $self->{sx2} - $self->{sx}**2);
return ($self->{n} * $self->{sxy} - $self->{sx} * $self->{sy})
/ ($self->{n} * $self->{sx2} - $self->{sx}**2);
1999-12-09 13:01:21 +00:00
}
2001-08-29 14:35:15 +00:00
sub A($)
1999-12-09 13:01:21 +00:00
{
2001-08-29 14:35:15 +00:00
my $self = shift;
1999-12-09 13:01:21 +00:00
2001-08-29 14:35:15 +00:00
return ($self->{sy} - B($self) * $self->{sx}) / $self->{n};
1999-12-09 13:01:21 +00:00
}
2001-08-29 14:35:15 +00:00
sub Y($$)
1999-12-09 13:01:21 +00:00
{
2001-08-29 14:35:15 +00:00
my $self = shift;
1999-12-09 13:01:21 +00:00
2001-08-29 14:35:15 +00:00
return A($self) + B($self) * $_[$[];
1999-12-09 13:01:21 +00:00
}
2001-08-29 14:35:15 +00:00
sub X($$)
1999-12-09 13:01:21 +00:00
{
2001-08-29 14:35:15 +00:00
my $self = shift;
1999-12-09 13:01:21 +00:00
2001-08-29 14:35:15 +00:00
return ($_[$[] - A($self)) / B($self);
1999-12-09 13:01:21 +00:00
}
2001-08-29 14:35:15 +00:00
sub r($)
1999-12-09 13:01:21 +00:00
{
2001-08-29 14:35:15 +00:00
my $self = shift;
1999-12-09 13:01:21 +00:00
2001-08-29 14:35:15 +00:00
my $s = ($self->{n} * $self->{sx2} - $self->{sx}**2)
* ($self->{n} * $self->{sy2} - $self->{sy}**2);
1999-12-09 13:01:21 +00:00
return 1 unless $s;
2001-08-29 14:35:15 +00:00
return ($self->{n} * $self->{sxy} - $self->{sx} * $self->{sy}) / sqrt($s);
1999-12-09 13:01:21 +00:00
}
2001-08-29 14:35:15 +00:00
sub cov($)
1999-12-09 13:01:21 +00:00
{
2001-08-29 14:35:15 +00:00
my $self = shift;
1999-12-09 13:01:21 +00:00
2001-08-29 14:35:15 +00:00
return ($self->{sxy} - $self->{sx} * $self->{sy} / $self->{n})
/ ($self->{n} - 1);
1999-12-09 13:01:21 +00:00
}
2001-08-29 14:35:15 +00:00
sub sigma($)
1999-12-09 13:01:21 +00:00
{
2001-08-29 14:35:15 +00:00
my $self = shift;
1999-12-09 13:01:21 +00:00
2001-08-29 14:35:15 +00:00
return 0 if $self->{n} <= 1;
return sqrt(($self->{sy2} - ($self->{sy} * $self->{sy}) / $self->{n})
/ ($self->{n}));
1999-12-09 13:01:21 +00:00
}
2001-08-29 14:35:15 +00:00
sub mean($)
1999-12-09 13:01:21 +00:00
{
2001-08-29 14:35:15 +00:00
my $self = shift;
1999-12-09 13:01:21 +00:00
2001-08-29 14:35:15 +00:00
return 0 if $self->{n} <= 0;
return $self->{sy} / $self->{n};
1999-12-09 13:01:21 +00:00
}
2001-08-29 14:35:15 +00:00
sub new
{
my $class = shift;
my $self = {
(n => undef,
sx => undef,
sx2 => undef,
sxy => undef,
sy => undef,
sy2 => undef)
};
bless $self, $class;
init($self);
return $self;
}
1999-12-09 13:01:21 +00:00
1;