File Coverage

blib/lib/Statistics/Autocorrelation.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1             package Statistics::Autocorrelation;
2 1     1   17057 use 5.006;
  1         4  
  1         30  
3 1     1   4 use strict;
  1         1  
  1         26  
4 1     1   3 use warnings FATAL => 'all';
  1         5  
  1         41  
5 1     1   206 use Statistics::Data 0.08;
  0            
  0            
6             use base qw(Statistics::Data);
7             use Carp qw(croak);
8             use Statistics::Lite qw(mean);
9             use List::AllUtils qw(mesh);
10             $Statistics::Autocorrelation::VERSION = '0.06';
11            
12             =head1 NAME
13            
14             Statistics::Autocorrelation - Coefficients for any lag, as correlogram, with significance tests
15            
16             =head1 VERSION
17            
18             Version 0.06
19            
20             =head1 SYNOPSIS
21            
22             use Statistics::Autocorrelation 0.06;
23             $acorr = Statistics::Autocorrelation->new();
24             $coeff = $acorr->coefficient(data => \@data, lag => integer (from 1 to N-1), exact => 0, unbias => 1);
25             # or load one or more data, optionally update, and test each discretely:
26             $acorr->load(\@data1, \@data2);
27             $coeff = $acorr->coeff(index => 0, lag => 1); # default lag => 0
28            
29             =head1 DESCRIPTION
30            
31             Calculates autocorrelation coefficients for a single series of numerical data, for any valid length of I.
32            
33             =head1 SUBROUTINES/METHODS
34            
35             =head2 new
36            
37             $acorr = Statistics::Autocorrelation->new();
38            
39             Return a new class object for accessing its methods. This ISA L object, so all the methods for loading, adding, saving, dumping, etc., data in that package are available here.
40            
41             =head2 coefficient
42            
43             $coeff = $autocorr->coefficient(data => \@data, lag => integer (from 1 to N-1), exact => 0|1, unbias => 1|0, circular => 1|0);
44             $coeff = $autocorr->coefficient(lag => 1); # using loaded data, and default args (exact = 0, unbias = 1, circular = 0)
45            
46             I: C, C
47            
48             Returns the autocorrelation coefficient, the ratio of the autocovariance to variance of a sequence at any particular lag, ranging from -1 to +1, as in Chatfield (1975) and Kendall (1973). Specifically,
49            
50             =for html
ρk =
γk
σ²k
51            
52             where I is the lag (see below).
53            
54             Data can be previously loaded or sent directly here (see L). There must be at least two elements in the data array. A croak will be heard if no data have been loaded or given here.
55            
56             Options are:
57            
58             =over 4
59            
60             =item B
61            
62             An integer to define how many indices ahead or behind to start correlating the data to itself, as in how many time-intervals separate one value from another. If lag is greater than or equal to number of observations, returns empty string. If the value of B is less than zero, the calculation is made with its absolute value, given that
63            
64             =for html
ρk = ρk
65            
66             for all I (so that a coefficient for a lag of -I is equal in magnitude I to that for +I). If a value is not given for lag, it is set to the default value of 0.
67            
68             =item B
69            
70             Boolean value, default = 0. In calculating the autocorrelation coefficient, the convention -- as in corporate stats programs (e.g., SPSS/PASW), and published examples of autocorrelation (e.g., L), and texts such as Chatfield (1975), and Box and Jenkins (1976) -- is to calculate the sum-of-squares for the autocovariance (the numerator term in the autocorrelation coefficient) from the residuals for each observation I from trial I = 1 (index = 0) to I - I (the lag) relative to the mean of the whole sequence:
71            
72             =for html
γk
1
N
 
Nk
Σ
t=1
(xtx)(xt+kx)
73            
74             rather than the means for each sub-sequence as lagged, and (2) the sum-of-squares for the variance in the denominator as that of the whole sequence:
75            
76             =for html
σ²k
1
N
 
Nk
Σ
t=1
(xtx
77            
78             instead of using completely pairwise products. This convention assumes that the series is stationary (has no linear or curvilinear trend, no periodicity), and that the number of observations, I, in the sample is "reasonably large". You get the autocorrelation coefficient with these assumptions, with the above formulations, by default; but if you specify B => 1, then you get the coefficient as calculated by Kendall (1973) Eq. 3.35, where the sums use not the overall sample mean, but the mean for the first to the I - I elements, and the mean from the I to I elements:
79            
80             =for html
xk
1
Nk
 
Nk
Σ
t=1
xt
, and
xk´
1
Nk
 
Nk
Σ
t=1
xt+k
81            
82             Taking each observation relative to these means, the autocovariance in the numerator, and variance in the denominator, are calculated as follows to give the autocorrelation coefficient:
83            
84             =for html
ρk
Nk
Σ
t=1
(xtxk)(xt+kxk´)
[
Nk
Σ
t=1
(xtxk]½ [
Nk
Σ
t=1
(xt+kxk´]½
85            
86             =item B
87            
88             Boolean, default = 1. In calculating the approximate autocovariance, it is conventional to divide the sum-product of residuals (as given above) by I, but some sources divide by I - I for less biased estimation, so that
89            
90             =for html
γk
1
Nk
 
Nk
Σ
t=1
(xtx)(xt+kx)
91            
92             For the latter, set B => 0. This is only effective where B => 0 and B => 0.
93            
94             =item B
95            
96             Boolean value, default = 0: For circularized lagging, set B => 1.
97            
98             =back
99            
100             =cut
101            
102             sub coefficient {
103             my ( $self, $args, $data, $n, $k ) = _get_args(@_);
104             return q{} if !$self;
105             $args->{'unbias'} = defined $args->{'unbias'} ? $args->{'unbias'} : 0;
106             $args->{'varp'} = 1 if !defined $args->{'varp'};
107            
108             #croak "Can\'t autocorrelate with a lag of < $k > for only < $n > data" if $n - $k == 1 && !$args->{'circular'};
109             return $args->{'exact'}
110             ? _coeff_exact( $data, $n, abs($k), $args->{'circular'},
111             $args->{'unbias'} )
112             : _coeff_approx( $data, $n, abs($k), $args->{'circular'},
113             $args->{'unbias'} );
114             }
115             *coeff = \&coefficient;
116             *acf = \&coefficient;
117            
118             =head2 autocovariance
119            
120             $covar = $autocorr->autocovariance(data => \@data, lag => integer (from 1 to N-1), exact => 0|1, unbias => 1|0, circular => 1|0);
121             $covar = $autocorr->autocovariance(lag => 1); # using loaded data, and default args (exact = 0, unbias = 1, circular = 0)
122            
123             I: C, C
124            
125             Returns the autocovariance; see L for definition and options.
126            
127             =cut
128            
129             sub autocovariance {
130             my ( $self, $args, $data, $n, $k ) = _get_args(@_);
131             return q{} if !$self;
132             my ( $circ, $m1, $m2, $sumprod, $div ) = ( $args->{'circular'} );
133             if ( $args->{'exact'} )
134             { # use mean of the original and lagged sequences separately
135             ( $m1, $m2 ) =
136             $circ
137             ? _comean_circ( $data, $n, $k )
138             : _comean_uncirc( $data, $n, $k );
139             $div = $circ ? $n : ( $n - $k );
140             }
141             else { # use mean of the whole sequence
142             $m1 = mean( @{$data} );
143             $m2 = $m1;
144             $div =
145             $circ ? $n : $args->{'unbias'} ? ( $n - $k ) : $n; #variancep(@$data);
146             }
147             $sumprod =
148             $circ
149             ? _covarsum_circ( $data, $n, abs($k), $m1, $m2 )
150             : _covarsum_uncirc( $data, $n, abs($k), $m1, $m2 );
151             $sumprod /= $div;
152             return $sumprod;
153             }
154             *autocov = \&autocovariance;
155             *acvf = \&autocovariance;
156            
157             =head2 correlogram
158            
159             $href = $autocorr->correlogram(nlags => integer, exact => 1|0, unbias => 1|0, circular => 1|0); # assuming data are loaded
160             $href = $autocorr->correlogram(nlags => integer, exact => 1|0, unbias => 1|0, circular => 1|0); # assuming data are loaded
161             $href = $autocorr->correlogram(); # use defaults, with loaded data
162             $href = $autocorr->correlogram(data => \@data); # same as either of above, but give data here
163             ($lags, $coeffs) = $autocorr->correlogram(); # with args as for either of the above
164            
165             I: C
166            
167             Returns the autocorrelation coefficients for lags from 0 to a limit, or (by default) over all possible lags, from 0 to I - 1. If called in array context, returns two references: to an array of the lags, and an array of their respsective coefficients. Otherwise, returns a hash-reference of the coefficients keyed by their respective lags. The limit is given by argument B giving the number of lags to return, including the zero lag, as permitted by the data to be referenced. Options are B, B and B, as defined above for L. The autocorrelation function being symmetric about lag zero, the correlogram is based only on positive lags.
168            
169             =cut
170            
171             sub correlogram {
172             my ( $self, $args, $data, $n ) = _get_args(@_);
173             return q{} if !$self;
174             my $m = $args->{'nlags'} ? $args->{'nlags'} : $n;
175             $m--;
176             croak
177             'Value given for argument \'nlags\' is not valid - should be no more than the number of data elements less 1'
178             if $m > $n - 1;
179             my @range = ( 0 .. $m );
180             my @coeffs = ();
181             foreach (@range) {
182             push @coeffs,
183             $self->coefficient(
184             data => $data,
185             lag => $_,
186             circular => $args->{'circular'},
187             unbias => $args->{'unbias'},
188             exact => $args->{'exact'}
189             );
190             }
191             return wantarray ? ( \@range, \@coeffs ) : { mesh( @range, @coeffs ) };
192             }
193             *coeff_list = \&correlogram;
194            
195             =head2 correlogram_chart
196            
197             Experimental method to print a .png file of the correlogram.
198            
199             =cut
200            
201             sub correlogram_chart {
202             my ( $lags, $coeffs ) = correlogram(@_);
203             require GD::Graph::mixed;
204             my $graph = GD::Graph::mixed->new( 400, 300 );
205             $graph->set(
206             types => [qw(points bars lines)],
207             markers => [7], # 7 = filled circle
208             #line_types => [3], # 1 = solid, 2 = dashed, 3 = dotted, 4 = dot-dashed
209             marker_size => 2,
210            
211             # bar_width => .9,
212             # bar_spacing => 2,
213             x_label => 'Lags',
214             x_label_position => 1 / 2,
215             y_label => 'Coeffs',
216             title => 'Correlogram',
217            
218             #y_max_value => 8,
219             #y_tick_number => 8,
220             y_label_skip => 2,
221             dclrs => [ 'white', 'white', 'white' ],
222            
223             #bgclr => 'lgray',
224             #fgclr => 'black',
225             #boxclr => 'lgray',
226             #labelclr => 'black',
227             #axislabelclr => 'black',
228             #textclr => 'black',
229             ) or croak $graph->error;
230             $graph->set();
231             my @zeroes = map { 0 } ( 1 .. scalar @{$coeffs} );
232             my $gd = $graph->plot( [ $lags, $coeffs, $coeffs, \@zeroes ] )
233             or croak $graph->error;
234             open my $IMG, '>', 'file.png' or croak 'Cannot open file';
235             binmode $IMG;
236             print {$IMG} $gd->png or croak 'Cannot print image to file';
237             close $IMG or warn;
238             return;
239             }
240            
241             =head2 ctest_bartlett
242            
243             $bool = $acorr->ctest_bartlett(lag => integer, tails => 1|2); # assuming data are loaded, or see above for alternative and extra options
244             ($crit, $coeff, $bool) = $acorr->ctest_bartlett(lag => integer, tails => 1|2);
245            
246             Performs a 95% confidence test of the null hypothesis of no autocorrelation, assuming that the series was generated by a Gaussian white noise process. Following Bartlett (1946), it compares the value of a single correlation coefficient for a given B with the critical values given B => 2 (default) or 1:
247            
248             =for html
rk,.95
s
N½
249            
250             where I is a constant equalling 1.96 for a two-tailed, or 1.645 for a one-tailed test. If the absolute value of the sample correlation coefficient falls beyond this critical value, the null hypothesis is rejected at the 95% level.
251            
252             Returns, if called in array context, a list comprising the critical value, the sample coefficient, and a boolean as to whether the null hypothesis is rejected; otherwise, just the latter boolean.
253            
254             Accepts all the options as given for L. Note that the critical value is not calculated with respect to the particular value of B - see L for this.
255            
256             =cut
257            
258             sub ctest_bartlett {
259             my ( $self, $args, $data, $n ) = _get_args(@_);
260             my $coeff = $self->acf(
261             data => $data,
262             lag => $args->{'lag'},
263             circular => $args->{'circular'},
264             unbias => $args->{'unbias'},
265             exact => $args->{'exact'}
266             );
267             my $tails = ( defined $args->{'tails'} and $args->{'tails'} == 1 ) ? 1 : 2;
268            
269             #my $c = _set_criterion($tails, $n - 1, $args->{'criteria'});
270             my $c = $tails == 2 ? 1.95996398454005 : 1.64485362695147;
271             my $crit = $c / sqrt $n;
272             my $bool = abs($coeff) > $crit ? 1 : 0;
273             return wantarray ? ( $crit, $coeff, $bool ) : $bool;
274             }
275            
276             =head2 ctest_anderson
277            
278             $bool = $acorr->ctest_bartlett(lag => integer, tails => 1|2); # assuming data are loaded, or see above for alternative and extra options
279             ($crit, $coeff, $bool) = $acorr->ctest_b(lag => integer, tails => 1|2);
280            
281             Performs a 95% confidence test of the null hypothesis of no autocorrelation, assuming that the series was generated by a Gaussian white noise process. Following Anderson (1941), it compares the value of a single correlation coefficient for a given B with the critical values given B => 2 (default) or 1:
282            
283             =for html
rk,.95(2-tailed) = 
–1 ±1.96(Nk – 1)½
Nk
284            
285             =for html
rk,.95(1-tailed) = 
–1 + 1.645(Nk – 1)½
Nk
286            
287             If the sample correlation coefficient falls outside these bounds, the null hypothesis is rejected at the 95% level.
288            
289             Returns, if called in array context, a list comprising the critical value, the sample coefficient, and a boolean as to whether the null hypothesis is rejected; otherwise, just the latter boolean.
290            
291             Accepts all the options as given for L. Note that the critical value I calculated with respect to the particular value of B - unlike L.
292            
293             =cut
294            
295             sub ctest_anderson {
296             my ( $self, $args, $data, $n ) = _get_args(@_);
297             my $coeff = $self->acf(
298             data => $data,
299             lag => $args->{'lag'},
300             circular => $args->{'circular'},
301             unbias => $args->{'unbias'},
302             exact => $args->{'exact'}
303             );
304             my $tails = ( defined $args->{'tails'} and $args->{'tails'} == 1 ) ? 1 : 2;
305             my $c = $tails == 2 ? 1.96 : 1.645;
306             my $crit =
307             ( -1 + ( $c * sqrt( $n - $args->{'lag'} - 1 ) ) ) /
308             ( $n - $args->{'lag'} );
309             my $bool = abs $coeff > $crit ? 1 : 0;
310             return wantarray ? ( $crit, $coeff, $bool ) : $bool;
311             }
312            
313             =head2 ztest_bartlett
314            
315             $p_value = $acorr->ztest_bartlett(lag => integer, tails => 1|2); # assuming data are loaded, or see above for alternative and extra options
316             ($z_value, $p_value) = $acorr->ztest_bartlett(lag => integer, tails => 1|2);
317            
318             Returns the 2- or 1-tailed probability, given B => 2 (default) or 1, respectively, for the deviation of the observed autocorrelation coefficient at the given B from the expected value of zero, relative to the variance 1 / I, assuming that the series was generated by a Gaussian white noise process. If called in array context, returns both the actual I-value and then the I

-value. Other options, and methods of assigning the data to test, are as for L.

319            
320             =cut
321            
322             sub ztest_bartlett {
323             my ( $self, $args, $data, $n ) = _get_args(@_);
324             my $coeff = $self->acf(
325             data => $data,
326             lag => $args->{'lag'},
327             circular => $args->{'circular'},
328             unbias => $args->{'unbias'},
329             exact => $args->{'exact'}
330             );
331             my $tails = ( defined $args->{'tails'} and $args->{'tails'} == 1 ) ? 1 : 2;
332             require Statistics::Zed;
333             my $zed = Statistics::Zed->new();
334             my ( $zval, $pval ) = $zed->score(
335             observed => $coeff,
336             expected => 0,
337             variance => 1 / $n,
338             tails => $tails,
339             ccorr => 0
340             );
341             return wantarray ? ( $zval, $pval ) : $pval;
342             }
343            
344             =head2 qtest, boxpierce
345            
346             $p_value = $acorr->qtest(nlags => integer); # assuming data are loaded, or see above for alternative and extra options
347             ($q_value, $df, $p_value) = $acorr->qtest(nlags => integer);
348            
349             Returns the I statistic for testing whether a range of autocorrelation coefficients differs from zero, and so if the series was produced by a random process (Box & Pierce, 1970). If called in array context, returns a list giving the value of I, and, assuming I-square distribtution, its degrees of freedom (= B) and I

-value; returns the I

-value only if called in scalar context. Other options, and methods of assigning the data to test, are as for L. The range is (by default) over all possible lags from 1 to I - 1. The statistic is defined as follows:

350            
351             =for html
QN 
M
Σ
k=1
ρk²
352            
353             where I is the largest lag-value to test (= B).
354            
355             =cut
356            
357             sub qtest {
358             my ( $self, $args, $data, $n ) = _get_args(@_);
359             my ( $lags, $coeffs ) = $self->correlogram(
360             data => $data,
361             nlags => $args->{'nlags'},
362             circular => $args->{'circular'},
363             unbias => $args->{'unbias'},
364             exact => $args->{'exact'}
365             );
366             my $df = scalar @{$lags};
367             my $sum = 0;
368             foreach my $i ( 1 .. $df - 1 ) {
369             $sum += $coeffs->[$i]**2;
370             }
371             my $q = $n * $sum;
372             require Math::Cephes;
373             my $pval = Math::Cephes::igamc( $df / 2, $q / 2 );
374             return wantarray ? ( $q, $df, $pval ) : $pval;
375             }
376             *boxpierce = \&qtest;
377            
378             sub _get_args {
379             my $self = shift;
380             my $args = ref $_[0] ? shift : {@_};
381             my $data = ref $args->{'data'} ? $args->{'data'} : $self->access($args);
382             my $n = scalar @{$data} or croak 'No data are available';
383            
384             #croak __PACKAGE__, ': Can\'t handle dataset less than two elements' if $n < 2;
385             $args->{'lag'} ||= 0;
386             return $n <= abs $args->{'lag'}
387             ? q{}
388             : ( $self, $args, $data, $n, $args->{'lag'} );
389             }
390            
391             # Kendall's (1973) Eq. 3.35., p. 40
392             sub _coeff_exact {
393             my ( $data, $n, $k, $circ, $unbias ) = @_;
394             my ( $m1, $m2 ) =
395             $circ
396             ? _comean_circ( $data, $n, $k )
397             : _comean_uncirc( $data, $n, $k )
398             ; # means for original and lagged sub-sequence
399             my $covar =
400             $circ
401             ? _covarsum_circ( $data, $n, $k, $m1, $m2 )
402             : _covarsum_uncirc( $data, $n, $k, $m1, $m2 )
403             ; # numerator (autocovariance)
404             # calc denominator (variance):
405             my ( $sum_sq_ui, $sum_sq_uik ) = ( 0, 0 );
406             for my $i ( 0 .. $n - $k - 1 ) {
407             $sum_sq_ui += ( $data->[$i] - $m1 )**2;
408             $sum_sq_uik += ( $data->[ $i + $k ] - $m2 )**2;
409             }
410             my $var = sqrt($sum_sq_ui) * sqrt($sum_sq_uik); # * 2 * ($n - $k);
411             return $var ? $covar / $var : undef;
412             }
413            
414             # Kendall (1973) Eq. 3.36
415             sub _coeff_approx {
416             my ( $data, $n, $k, $circ, $unbias ) = @_;
417             my ( $mean, $covar, $var ) = ();
418             $mean = mean( @{$data} )
419             ; # uses mean of the whole sequence, regardless of lag, in calculating autocovariance and variance
420             $covar =
421             $circ
422             ? _covarsum_circ( $data, $n, $k, $mean )
423             : _covarsum_uncirc( $data, $n, $k, $mean, undef );
424             $var = _sumsq( $data, $n, $mean );
425             if ($unbias) {
426             $covar /= $n - $k;
427             $var /= $n; #variancep(@$data);
428             }
429             return $var ? $covar / $var : undef;
430             }
431            
432             sub _comean_circ {
433             my ( $data, $n, $k ) = @_;
434             my ( $sum1, $sum2 ) = (0);
435             for my $i ( 0 .. $n - 1 ) {
436             $sum1 += $data->[$i];
437             $sum2 += $data->[ $i + $k >= $n ? abs( $n - $i - $k ) : $i + $k ];
438             }
439             return ( $sum1 / $n, $sum2 / $n );
440             }
441            
442             sub _comean_uncirc {
443             my ( $data, $n, $k ) = @_;
444             $n -= $k;
445             my ( $sum1, $sum2 ) = (0);
446             for my $i ( 0 .. $n - 1 ) {
447             $sum1 += $data->[$i];
448             $sum2 += $data->[ $i + $k ];
449             }
450             return ( $sum1 / $n, $sum2 / $n );
451             }
452            
453             sub _covarsum_circ {
454             my ( $data, $n, $k, $m1, $m2 ) = @_;
455             $m2 = $m1 if !defined $m2;
456             my $sum = 0;
457             for my $i ( 0 .. $n - 1 ) {
458             $sum +=
459             ( $data->[$i] - $m1 ) *
460             ( $data->[ $i + $k >= $n ? abs( $n - $i - $k ) : $i + $k ] - $m2 );
461             }
462             return $sum;
463             }
464            
465             sub _covarsum_uncirc {
466             my ( $data, $n, $k, $m1, $m2 ) = @_;
467             $m2 = $m1 if !defined $m2;
468             my $sum = 0;
469             for my $i ( 0 .. $n - $k - 1 ) {
470             $sum += ( $data->[$i] - $m1 ) * ( $data->[ $i + $k ] - $m2 );
471             }
472             return $sum;
473             }
474            
475             sub _sumsq {
476             my ( $data, $n, $mean ) = @_;
477             my $sum = 0;
478             for my $i ( 0 .. $n - 1 ) {
479             $sum += ( $data->[$i] - $mean )**2;
480             }
481             return $sum;
482             }
483            
484             =head1 REFERENCES
485            
486             Anderson, R.L. (1941). Distribution of the serial correlation coefficients. I, I<8>, 1-13.
487            
488             Bartlett M.S. (1946). On the theoretical specification of sampling properties of autocorrelated time series. I, I<27>.
489            
490             Box, G.E, & Jenkins, G. (1976). I
491            
492             Box, G.E., & Pierce D. (1970). Distribution of residual autocorrelations in ARIMA time series models. I, I<65>, 1509-1526.
493            
494             Chatfield, C. (1975). I. London, UK: Chapman and Hall.
495            
496             Kendall, M. G. (1973). I. London, UK: Griffin.
497            
498             =head1 SEE ALSO
499            
500             L (L). Returns single autocorrelation coefficient which, with the present modules, would be given by L given B => 1, B => 1 (and the defaults B => 0, B => 0).
501            
502             =head1 AUTHOR
503            
504             Roderick Garton, C<< >>
505            
506             =head1 DIAGNOSTICS
507            
508             =over 4
509            
510             =item No data are available
511            
512             Croaked by most methods if they do not receive data as given in the call by an array ref, or as pre-loaded as per L.
513            
514             =item Value given for argument 'nlags' is not valid
515            
516             Croaked by L when the nlags is not valid: should be no more than the number of data elements less 1.
517            
518             =item file opening/printing errors
519            
520             Croaked by L when it tries to print the chart.
521            
522             =back
523            
524             =head1 DEPENDENCIES
525            
526             L - used: base
527            
528             L - used: mean
529            
530             L - used: mesh
531            
532             L - required if calling L
533            
534             L - required for igamc method is calling L
535            
536             =head1 BUGS AND LIMITATIONS
537            
538             Report to C or L.
539            
540             To do: rho_ctest, rho_ztest
541            
542             =head1 SUPPORT
543            
544             Find documentation for this module with the perldoc command:
545            
546             perldoc Statistics::Autocorrelation
547            
548             Also look for information at:
549            
550             =over 4
551            
552             =item * RT: CPAN's request tracker
553            
554             L
555            
556             =item * AnnoCPAN: Annotated CPAN documentation
557            
558             L
559            
560             =item * CPAN Ratings
561            
562             L
563            
564             =item * Search CPAN
565            
566             L
567            
568             =back
569            
570             =head1 LICENSE AND COPYRIGHT
571            
572             Copyright 2011-2014 Roderick Garton.
573            
574             This program is free software; you can redistribute it and/or modify it
575             under the terms of either: the GNU General Public License as published
576             by the Free Software Foundation; or the Artistic License.
577            
578             See http://dev.perl.org/licenses/ for more information.
579            
580             =cut
581            
582             1; # End of Statistics::Autocorrelation