;;;;;;;;;;;;;;;;
package lr;
;;;;;;;;;;
sub init
{
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;
}
sub sample($$$)
{
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;
}
sub B($)
{
my $self = shift;
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);
}
sub A($)
{
my $self = shift;
return ($self->{sy} - B($self) * $self->{sx}) / $self->{n};
}
sub Y($$)
{
my $self = shift;
return A($self) + B($self) * $_[$[];
}
sub X($$)
{
my $self = shift;
return ($_[$[] - A($self)) / B($self);
}
sub r($)
{
my $self = shift;
my $s = ($self->{n} * $self->{sx2} - $self->{sx}**2)
* ($self->{n} * $self->{sy2} - $self->{sy}**2);
return 1 unless $s;
return ($self->{n} * $self->{sxy} - $self->{sx} * $self->{sy}) / sqrt($s);
}
sub cov($)
{
my $self = shift;
return ($self->{sxy} - $self->{sx} * $self->{sy} / $self->{n})
/ ($self->{n} - 1);
}
sub sigma($)
{
my $self = shift;
return 0 if $self->{n} <= 1;
return sqrt(($self->{sy2} - ($self->{sy} * $self->{sy}) / $self->{n})
/ ($self->{n}));
}
sub mean($)
{
my $self = shift;
return 0 if $self->{n} <= 0;
return $self->{sy} / $self->{n};
}
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;
}
1;