-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvector.rb
113 lines (94 loc) · 1.67 KB
/
vector.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
require './table'
class Vector
include Enumerable
def initialize(*args)
@vector = [*args]
end
def each(&block)
@vector.each(&block)
end
def size
@vector.size
end
def empty?
@vector.empty?
end
def [](index)
@vector[index]
end
def sum
sum = 0.0
self.each do |x|
sum += x
end
sum
end
def mean
s = self.sum / self.size
end
def trim(perc)
raise "trim mean only accepts a range of 0 to 0.2" if not (0..0.2).include? perc
num = (perc * self.size).round
self.slice(num, self.size - (num * 2)).mean
end
def geo
prod = 1.0
self.each do |f|
prod *= f
end
prod**(1.0/self.size)
end
def median
a = self.sort
len = self.size
if len % 2 == 0
(a[len/2] + a[(len/2) - 1]) / 2.0
else
a[len/2]
end
end
def range
n = self.sort
n[n.size] - n[0]
end
def iqr
arr = self.sort
d = {}
d[:min] = arr.first
q1 = (arr.median * 0.25).round
d[:q1] = arr[q1]
q3 = (arr.median * 0.75).round
d[:q3] = arr[q3]
d[:max] = arr.last
d[:irq] = d[:q3] - d[:q1]
d[:ll] = d[:q1] - 1.5 * d[:irq]
d[:ul] = d[:q3] + 1.5 * d[:irq]
d
end
def deviation
xbar = self.mean
total = 0
self.each do |xi|
total += (xi - xbar)**2
end
Math.sqrt(total/(self.size - 1))
end
def standardize
xbar = self.mean
s = self.deviation
n = self.collect do |z|
(z-mean)/s
end
Vector.new(n)
end
def freq
n = Vector.new
self.uniq.each do |i|
n.push(self.count(i))
end
Table.new(self.uniq, n)
end
def to_s
@vector
end
end