diff options
author | Peter Palfrader <peter@palfrader.org> | 2003-06-06 11:27:59 +0000 |
---|---|---|
committer | Peter Palfrader <peter@palfrader.org> | 2003-06-06 11:27:59 +0000 |
commit | ec8e6ce0a114a35f13c019b4fcc6a22d5b429a95 (patch) | |
tree | 49ad0f257d58d4b75a0f3c25a7b6612538fb5dd0 /lib/Statistics/Distrib/Normal.pm | |
parent | ef0f8116e7f1039887ac185c79254f374ce51371 (diff) |
We no longer assume a normal distribution of latencies but instead use
percentiles when calculating a life probability of an outstanding ping. Also
we do not show the mean of latency but the median as this seems to be 'more
correct'.
This also means we no longer need the normal distribution libraries from lib/
Diffstat (limited to 'lib/Statistics/Distrib/Normal.pm')
-rw-r--r-- | lib/Statistics/Distrib/Normal.pm | 438 |
1 files changed, 0 insertions, 438 deletions
diff --git a/lib/Statistics/Distrib/Normal.pm b/lib/Statistics/Distrib/Normal.pm deleted file mode 100644 index 58cf737..0000000 --- a/lib/Statistics/Distrib/Normal.pm +++ /dev/null @@ -1,438 +0,0 @@ -# -# Author: Peter J. Acklam -# Time-stamp: 2000-06-02 23:42:57 -# E-mail: pjacklam@online.no -# URL: http://home.online.no/~pjacklam - -=head1 NAME - -Statistics::Distrib::Normal - the normal distribution - -=head1 SYNOPSIS - - use Statistics::Distrib::Normal; - - $dist = new Statistics::Distrib::Normal; - - $dist->mu(3); # set the location parameter - $dist->sigma(5); # set the scale parameter - @x = $dist->rand(10); # generate random numbers - - # or - - @x = Statistics::Distrib::Normal->new(Mu => 3, Sigma => 5)->rand(10); - -=head1 DESCRIPTION - -This module contains miscellaneous functions related to the normal -distribution. - -=cut - -package Statistics::Distrib::Normal; -require 5.000; - -use strict; -use vars qw($VERSION); -use Carp; - -$VERSION = '0.01'; - -use constant PI => 4 * atan2 1, 1; -use constant TWOPI => 2 * PI; - -# the smallest positive floating-point number such that 1+EPS > 1 -use constant EPS => 2.220446049250313080847263336181640625e-016; - -## -## Constructor -## - -=head1 CONSTRUCTOR - -=over 4 - -=item new ( [ OPTIONS ] ) - -C<OPTIONS> is a list of options given in the form of key-value -pairs, just like a hash table. Valid options are - -=over 8 - -=item B<Mu> - -Sets the mu parameter (the mean) of the distribution to the specified -value. - -=item B<Sigma> - -Sets the sigma parameter (the standard deviation) of the distribution -to the specified value. - -=back - -=back - -=cut - -sub new { - my $self = shift; - my $class = ref($self) || $self; - my %arg = @_; - - my %hash = ( mu => 0, - sigma => 1, - ); - - my $me = bless \%hash, $class; - - foreach my $key ( keys %arg ) { - $me->mu($arg{Mu}), next if $key eq 'Mu'; - $me->sigma($arg{Sigma}), next if $key eq 'Sigma'; - carp "Unknown option $arg{$key} ignored"; - } - - return $me; -} - -## -## Methods -## - -=pod - -=head1 METHODS - -=over 4 - -=item mean ( [ MEAN ] ) - -Set the mu parameter (the mean) of the distribution to C<MU>. If -C<MU> is omitted, the current value of mu is returned. - -=cut - -sub mu { - my $me = shift; - croak 'Too many arguments' if @_ > 1; - if ( @_ ) { - $me->{mu} = shift; - return 1; - } - return $me->{mu}; -} - -=pod - -=item sigma ( [ SDEV ] ) - -Set the sigma parameter (the standard deviation) of the distribution -to C<SIGMA>. If C<SIGMA> is omitted, the current value of sigma is -returned. - -=cut - -sub sigma { - my $me = shift; - croak 'Too many arguments' if @_ > 1; - if ( @_ ) { - my $sigma = shift; - croak 'Standard deviation most be positive' unless $sigma > 0; - $me->{sigma} = $sigma; - return 1; - } - return $me->{sigma}; -} - -=pod - -=item pdf ( X1 [, X2 [, X3 ... ] ] ) - -Evaluate the probability density function at C<X1>, C<X2>, C<X3>, ... - -=cut - -sub pdf { - my $me = shift; - croak 'Not enough arguments' unless @_; - my $mu = $me->{mu}; - my $sigma = $me->{sigma}; - my $const = log(TWOPI * $sigma * $sigma); - my @f; - foreach my $x ( @_ ) { - my $z = ( $x - $mu ) / $sigma; - push @f, exp( -0.5 * ( $const + $z*$z ) ); - } - return @f; -} - -=pod - -=item ltp ( X1 [, X2 [, ... ] ] ) - -Evaluate the lower tail probability function at C<X1>, C<X2>, C<X3>, -... - -=cut - -sub ltp { - my $me = shift; - croak 'Not enough arguments' unless @_; - my $mu = $me->{mu}; - my $sigma = $me->{sigma}; - - require Math::SpecFun::Erf; - import Math::SpecFun::Erf qw(erfc); - - my @p; - foreach my $x ( @_ ) { - my $z = ( $x - $mu ) / $sigma; - push @p, erfc( - $_[0] / sqrt(2) )/2; - } - return @p; -} - -=pod - -=item utp ( X1 [, X2 [, ... ] ] ) - -Evaluate the upper tail probability function at C<X1>, C<X2>, C<X3>, -... - -=cut - -sub utp { - my $me = shift; - croak 'Not enough arguments' unless @_; - my $mu = $me->{mu}; - my $sigma = $me->{sigma}; - - require Math::SpecFun::Erf; - import Math::SpecFun::Erf qw(erfc); - - my @p; - foreach my $x ( @_ ) { - my $z = ( $x - $mu ) / $sigma; - push @p, erfc( $_[0] / sqrt(2) )/2; - } - return @p; -} - -=pod - -=item ltq ( P1 [, P2 [, ... ] ] ) - -Returns the lower tail quantile for the probabilities C<P1>, C<P2>, -C<P3>, ... - -=cut - -sub ltq { - croak 'Method not implemented yet'; -} - -=pod - -=item utq ( P1 [, P2 [, P3 ... ] ] ) - -Returns the upper tail quantile for the probabilities C<P1>, C<P2>, -C<P3>, ... - -=cut - -sub utq { - croak 'Method not implemented yet'; -} - -=pod - -=item intprob( XLOW, XHIGH ) - -Interval probability. Returns the probability of an outcome in the -interval from XLOW to XHIGH. - -=cut - -sub intprob { - my $me = shift; - croak 'Bad number of arguments' unless @_ == 2; - my ($xlow, $xhigh) = @_; - return 0 unless $xlow < $xhigh; - my $mu = $me->{mu}; - my $sigma = $me->{sigma}; - - if ( $mu < $xlow ) { - return $me->utp($xlow) - $me->utp($xhigh); - } else { - return $me->ltp($xhigh) - $me->ltp($xlow); - } -} - -=pod - -=item rand( [ NUM ] ) - -Generate random variables. If C<NUM> is omitted, a single variable is -returned. - -=cut - -sub rand { - my $me = shift; - my $num; - if ( @_ ) { - $num = shift; - croak 'Too many arguments' if @_; - croak 'Argument must be positive integer' - unless ($num == int $num) && ($num > 0); - } else { - $num = 1; - } - - # Generate the random variables by the Box-Muller method. - my @z; - my $mu = $me->{mu}; - my $sigma = $me->{sigma}; - my $const = -2 * $sigma * $sigma; - my $i; - for ( $i = 0 ; $i < $num ; $i += 2 ) { - my $r = sqrt $const * log rand; - my $t = TWOPI * rand; - push @z, $mu + $r * sin $t, $mu + $r * cos $t; - } - pop @z if $i > $num; - return @z; -} - -=pod - -=item expectation () - -Return the expectation of the distribution. - -=cut - -sub expectation { - my $me = shift; - croak 'Too many arguments' if @_; - return $me->{mu}; -} - -=pod - -=item variance () - -Return the variance of the distribution. - -=cut - -sub variance { - my $me = shift; - croak 'Too many arguments' if @_; - return $me->{sigma}**2; -} - -=pod - -=item skewness () - -Return the skewness of the distribution. - -=cut - -sub skewness { - my $me = shift; - croak 'Too many arguments' if @_; - return 0; -} - -=pod - -=item kurtosis () - -Return the kurtosis (normalized) of the distribution. - -=cut - -sub kurtosis { - my $me = shift; - croak 'Too many arguments' if @_; - return 0; -} - -=item dmo - -Direct moments for the distribution. - -Not implemented yet. - -=cut - -sub dmo { - croak 'Method not implemented yet'; -} - -=pod - -=item cmo - -Central moments for the distribution. - -=cut - -sub cmo { - croak 'Method not implemented yet'; -} - -=pod - -=item mode () - -Returns the mode of the distribution. - -=cut - -sub mode { - my $me = shift; - croak 'Too many input arguments' if @_; - return $me->{mu}; -} - -=back - -=head1 BUGS - -None known. - -=head1 LIMITATIONS - -Degenerate cases are not allowed for most methods; e.g., a -distribution with zero variance. - -=head1 HISTORY - -=over 4 - -=item Version 0.02 - -Code formatting changes. - -=item Version 0.01 - -First release. - -=back - -=head1 AUTHOR - -Peter J. Acklam E<lt>pjacklam@online.noE<gt>. - -=head1 COPYRIGHT/LICENSE - -Copyright (c) 1999-2000 Peter J. Acklam. All rights reserved. -This program is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -=cut - -1; # Modules must return true. |