Annotation of embedaddon/ntp/scripts/monitoring/lr.pl, revision 1.1.1.1
1.1 misho 1: ;#
2: ;# lr.pl,v 3.1 1993/07/06 01:09:08 jbj Exp
3: ;#
4: ;#
5: ;# Linear Regression Package for perl
6: ;# to be 'required' from perl
7: ;#
8: ;# Copyright (c) 1992
9: ;# Frank Kardel, Rainer Pruy
10: ;# Friedrich-Alexander Universitaet Erlangen-Nuernberg
11: ;#
12: ;# Copyright (c) 1997 by
13: ;# Ulrich Windl <Ulrich.Windl@rz.uni-regensburg.de>
14: ;# (Converted to a PERL 5.004 package)
15: ;#
16: ;#############################################################
17:
18: package lr;
19:
20: ##
21: ## y = A + Bx
22: ##
23: ## B = (n * Sum(xy) - Sum(x) * Sum(y)) / (n * Sum(x^2) - Sum(x)^2)
24: ##
25: ## A = (Sum(y) - B * Sum(x)) / n
26: ##
27:
28: ##
29: ## interface
30: ##
31: ;# init(tag); initialize data set for tag
32: ;# sample(x, y, tag); enter sample
33: ;# Y(x, tag); compute y for given x
34: ;# X(y, tag); compute x for given y
35: ;# r(tag); regression coefficient
36: ;# cov(tag); covariance
37: ;# A(tag);
38: ;# B(tag);
39: ;# sigma(tag); standard deviation
40: ;# mean(tag);
41: #########################
42:
43: sub init
44: {
45: my $self = shift;
46:
47: $self->{n} = 0;
48: $self->{sx} = 0.0;
49: $self->{sx2} = 0.0;
50: $self->{sxy} = 0.0;
51: $self->{sy} = 0.0;
52: $self->{sy2} = 0.0;
53: }
54:
55: sub sample($$)
56: {
57: my $self = shift;
58: my($_x, $_y) = @_;
59:
60: ++($self->{n});
61: $self->{sx} += $_x;
62: $self->{sy} += $_y;
63: $self->{sxy} += $_x * $_y;
64: $self->{sx2} += $_x**2;
65: $self->{sy2} += $_y**2;
66: }
67:
68: sub B()
69: {
70: my $self = shift;
71:
72: return 1 unless ($self->{n} * $self->{sx2} - $self->{sx}**2);
73: return ($self->{n} * $self->{sxy} - $self->{sx} * $self->{sy})
74: / ($self->{n} * $self->{sx2} - $self->{sx}**2);
75: }
76:
77: sub A()
78: {
79: my $self = shift;
80:
81: return ($self->{sy} - B() * $self->{sx}) / $self->{n};
82: }
83:
84: sub Y()
85: {
86: my $self = shift;
87:
88: return A() + B() * $_[$[];
89: }
90:
91: sub X()
92: {
93: my $self = shift;
94:
95: return ($_[$[] - A()) / B();
96: }
97:
98: sub r()
99: {
100: my $self = shift;
101:
102: my $s = ($self->{n} * $self->{sx2} - $self->{sx}**2)
103: * ($self->{n} * $self->{sy2} - $self->{sy}**2);
104:
105: return 1 unless $s;
106:
107: return ($self->{n} * $self->{sxy} - $self->{sx} * $self->{sy}) / sqrt($s);
108: }
109:
110: sub cov()
111: {
112: my $self = shift;
113:
114: return ($self->{sxy} - $self->{sx} * $self->{sy} / $self->{n})
115: / ($self->{n} - 1);
116: }
117:
118: sub sigma()
119: {
120: my $self = shift;
121:
122: return 0 if $self->{n} <= 1;
123: return sqrt(($self->{sy2} - ($self->{sy} * $self->{sy}) / $self->{n})
124: / ($self->{n}));
125: }
126:
127: sub mean()
128: {
129: my $self = shift;
130:
131: return 0 if $self->{n} <= 0;
132: return $self->{sy} / $self->{n};
133: }
134:
135: sub new
136: {
137: my $class = shift;
138: my $self = {
139: (n => undef,
140: sx => undef,
141: sx2 => undef,
142: sxy => undef,
143: sy => undef,
144: sy2 => undef)
145: };
146: bless $self, $class;
147: init($self);
148: return $self;
149: }
150:
151: 1;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>