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 +7 -0
- data/lib/check.rb +17 -0
- data/lib/correlation_x_y.rb +22 -0
- data/lib/equation.rb +16 -0
- data/lib/parameters.rb +40 -0
- data/lib/serie.rb +34 -0
- metadata +48 -0
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: []
|