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) * $self->{sx}) / $self->{n}; |
---|
82 | } |
---|
83 | |
---|
84 | sub Y($$) |
---|
85 | { |
---|
86 | my $self = shift; |
---|
87 | |
---|
88 | return A($self) + B($self) * $_[$[]; |
---|
89 | } |
---|
90 | |
---|
91 | sub X($$) |
---|
92 | { |
---|
93 | my $self = shift; |
---|
94 | |
---|
95 | return ($_[$[] - A($self)) / B($self); |
---|
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; |
---|