File Coverage

blib/lib/Statistics/Basic/Correlation.pm
Criterion Covered Total %
statement 49 57 85.9
branch 11 24 45.8
condition 5 9 55.5
subroutine 8 11 72.7
pod 6 6 100.0
total 79 107 73.8


line stmt bran cond sub pod time code
1              
2             package Statistics::Basic::Correlation;
3              
4 33     33   156 use strict;
  33         71  
  33         1189  
5 33     33   165 use warnings;
  33         44  
  33         833  
6 33     33   143 use Carp;
  33         153  
  33         2367  
7              
8 33     33   251 use base 'Statistics::Basic::_TwoVectorBase';
  33         51  
  33         21764  
9              
10             # new {{{
11             sub new {
12 10     10 1 52622 my $this = shift;
13 10   66     56 my @var1 = (shift || ());
14 10   66     46 my @var2 = (shift || ());
15 10 50       19 my $v1 = eval { Statistics::Basic::Vector->new( @var1 ) } or croak $@;
  10         56  
16 10 50       20 my $v2 = eval { Statistics::Basic::Vector->new( @var2 ) } or croak $@;
  10         38  
17              
18 10         36 $this = bless {}, $this;
19              
20 10         56 my $c = $v1->_get_linked_computer( correlation => $v2 );
21 10 50       63 return $c if $c;
22              
23 10 50       17 $this->{sd1} = eval { Statistics::Basic::StdDev->new($v1) } or croak $@;
  10         65  
24 10 50       22 $this->{sd2} = eval { Statistics::Basic::StdDev->new($v2) } or croak $@;
  10         36  
25 10 50       21 $this->{cov} = eval { Statistics::Basic::Covariance->new( $v1, $v2 ) } or croak $@;
  10         86  
26              
27 10         32 $this->{_vectors} = [ $v1, $v2 ];
28              
29 10         44 $v1->_set_linked_computer( correlation => $this, $v2 );
30 10         30 $v2->_set_linked_computer( correlation => $this, $v1 );
31              
32 10         50 return $this;
33             }
34             # }}}
35             # _recalc {{{
36             sub _recalc {
37 15     15   22 my $this = shift;
38              
39 15         45 delete $this->{recalc_needed};
40 15         24 delete $this->{_value};
41              
42 15 50       85 my $c = $this->{cov}->query; return unless defined $c;
  15         51  
43 15 50       98 my $s1 = $this->{sd1}->query; return unless defined $s1;
  15         51  
44 15 50       57 my $s2 = $this->{sd2}->query; return unless defined $s2;
  15         60  
45              
46 15 50 33     104 if( $s1 == 0 or $s2 == 0 ) {
47 0 0       0 warn "[recalc " . ref($this) . "] Standard deviation of 0. Crazy infinite correlation detected.\n" if $Statistics::Basic::DEBUG;
48              
49 0         0 return;
50             }
51              
52 15         581 $this->{_value} = ( $c / ($s1*$s2) );
53              
54 15 50       2001 warn "[recalc " . ref($this) . "] ( $c / ($s1*$s2) ) = $this->{_value}\n" if $Statistics::Basic::DEBUG;
55              
56 15         48 return 1;
57             }
58             # }}}
59              
60             # query_vector1 {{{
61             sub query_vector1 {
62 2     2 1 293 my $this = shift;
63              
64 2         17 return $this->{cov}->query_vector1;
65             }
66             # }}}
67             # query_vector2 {{{
68             sub query_vector2 {
69 2     2 1 8 my $this = shift;
70              
71 2         11 return $this->{cov}->query_vector2;
72             }
73             # }}}
74             # query_mean1 {{{
75             sub query_mean1 {
76 0     0 1   my $this = shift;
77              
78 0           return $this->{cov}->query_mean1;
79             }
80             # }}}
81             # query_mean2 {{{
82             sub query_mean2 {
83 0     0 1   my $this = shift;
84              
85 0           return $this->{cov}->query_mean2;
86             }
87             # }}}
88             # query_covariance {{{
89             sub query_covariance {
90 0     0 1   my $this = shift;
91              
92 0           return $this->{cov};
93             }
94             # }}}
95              
96             1;