correlation_x_y 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0b9cbf347b4349d85cfe1395bde3b5fae9a11d6e1cb4ad564be9839f74d081f1
4
+ data.tar.gz: ef5d8798a215ad54b5487463fafcdf6035b2fb6049f0d955eb7a35899c19f949
5
+ SHA512:
6
+ metadata.gz: 39abdb6a8b10b2631241eba464f3e2ad89125e832ed224315b14fbe3190bdedc74cc1cde8af57cca753b52b235d1dcb40d3764b70dbe6b694993a55d96b4b0cb
7
+ data.tar.gz: de2e20e8c4e9f460fb8626d32f8b1113783524c658b6dc81b90dea4256405aa3f6468d124db7c3d53dc16af3774268175fa1b7234da104a6a60d03aea70ebdcd
data/lib/check.rb ADDED
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # check the data input
4
+ module Check
5
+ def self.valid?(data)
6
+ raise ArgumentError, 'Data class must be array' unless data.is_a?(Array)
7
+ raise ArgumentError, 'Must be array of integers or floats' if data.any?(String)
8
+
9
+ true
10
+ end
11
+
12
+ def self.series_sizes_valid?(serie_a, serie_b)
13
+ raise ArgumentError, 'Array sizes must be equal' unless serie_a.size == serie_b.size
14
+
15
+ true
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'serie'
4
+ require_relative 'parameters'
5
+ require_relative 'equation'
6
+
7
+ # class
8
+ class Correlation
9
+ attr_accessor :serie_a, :serie_b, :coefficient, :equation
10
+
11
+ def initialize(serie_a, serie_b)
12
+ @serie_a = Serie.new(serie_a)
13
+ @serie_b = Serie.new(serie_b)
14
+ @parameters = Parameters.new(@serie_a, @serie_b) if Check.series_sizes_valid?(serie_a, serie_b)
15
+ @dependance = dependance
16
+ @equation = Equation.new(@parameters) if @dependance == 'true'
17
+ end
18
+
19
+ def dependance
20
+ (-0.8..0.8).include?(@coefficient) ? 'false' : 'true'
21
+ end
22
+ end
data/lib/equation.rb ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'correlation_x_y'
4
+
5
+ # object linear Equation to get a and b
6
+ class Equation
7
+ attr_accessor :definition
8
+
9
+ def initialize(parameters)
10
+ if (-1...-0.8).include?(parameters.coefficient)
11
+ @definition = "y = #{parameters.a}x + #{parameters.b}"
12
+ elsif (0.8...1).include?(parameters.coefficient)
13
+ @definition = "y = -#{parameters.a}x + #{parameters.b}"
14
+ end
15
+ end
16
+ end
data/lib/parameters.rb ADDED
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'correlation_x_y'
4
+ require_relative 'serie'
5
+
6
+ # object Coefficient
7
+ class Parameters
8
+ attr_accessor :coefficient, :a, :b
9
+
10
+ def initialize(serie_a, serie_b)
11
+ @coefficient = calculate_coefficient(serie_a, serie_b)
12
+ @a = calculate_a(serie_a, serie_b)
13
+ @b = calculate_b(serie_a, serie_b)
14
+ end
15
+
16
+ # calculation of the slope between the 2 series
17
+ # sigma(xi - moy_x)(yi - moy y) / squared_root(sigma(xi - moy_x)^2) x squared_root(sigma(yi - moy_y)^2))
18
+ def calculate_coefficient(serie_a, serie_b)
19
+ sum_prod_variances = prod_variances(serie_a, serie_b).reduce(:+)
20
+ squared_root_sum_variances_x = serie_a.squared_variances.reduce(:+)**0.5
21
+ squared_root_sum_variances_y = serie_b.squared_variances.reduce(:+)**0.5
22
+ sum_prod_variances / (squared_root_sum_variances_x * squared_root_sum_variances_y)
23
+ end
24
+
25
+ # array of (xi - moy_x)(yi - moy_y) i periods
26
+ # i periods
27
+ def prod_variances(serie_a, serie_b)
28
+ prod_variances = serie_a.variances.zip(serie_b.variances)
29
+ prod_variances.map! { |couple| couple.reduce(:*) }
30
+ prod_variances
31
+ end
32
+
33
+ def calculate_a(serie_a, serie_b)
34
+ prod_variances(serie_a, serie_b).reduce(:+) / serie_a.squared_variances.reduce(:+)
35
+ end
36
+
37
+ def calculate_b(serie_a, serie_b)
38
+ serie_b.average - (@a * serie_a.average)
39
+ end
40
+ end
data/lib/serie.rb ADDED
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'check'
4
+
5
+ # object Serie to be used in Correlation class
6
+ class Serie
7
+ attr_accessor :data, :size
8
+
9
+ def initialize(data)
10
+ @data = data if Check.valid?(data)
11
+ @size = data.size
12
+ end
13
+
14
+ # moy_x
15
+ def average
16
+ @data.reduce(:+) / @data.size.to_f
17
+ end
18
+
19
+ # array of xi - moy_x
20
+ # i periods
21
+ def variances
22
+ variances = []
23
+ @data.each { |number| variances << number - average }
24
+ variances
25
+ end
26
+
27
+ # array of (xi - moy_x)^2 i periods
28
+ # i periods
29
+ def squared_variances
30
+ squared_variances = []
31
+ @data.each { |number| squared_variances << (number - average)**2 }
32
+ squared_variances
33
+ end
34
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: correlation_x_y
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Raphael Aubry
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-07-22 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: 'Correlation object creation needs 2 arguments: data series x and y as
14
+ arrays'
15
+ email: raphael.aubry@hotmail.fr
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/check.rb
21
+ - lib/correlation_x_y.rb
22
+ - lib/equation.rb
23
+ - lib/parameters.rb
24
+ - lib/serie.rb
25
+ homepage: https://rubygems.org/gems/correlation_x_y
26
+ licenses:
27
+ - Nonstandard
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubygems_version: 3.1.6
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: correlation analysis between variables x and y
48
+ test_files: []