Skip to content

Commit d14931c

Browse files
committed
Merge pull request #43 from michaelphines/chi-square-vector
Add missing test and implementation for doing a chi-squared test with vectors
2 parents ecb29e6 + 547a8c8 commit d14931c

File tree

2 files changed

+61
-17
lines changed

2 files changed

+61
-17
lines changed

lib/statsample/test/chisquare.rb

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,73 @@
11
module Statsample
22
module Test
33
module ChiSquare
4-
class WithMatrix
4+
module Shared
55
attr_reader :df
66
attr_reader :value
7+
8+
def to_f
9+
@value
10+
end
11+
12+
def chi_square
13+
@value
14+
end
15+
16+
def probability
17+
1-Distribution::ChiSquare.cdf(@value.to_f,@df)
18+
end
19+
end
20+
21+
class WithMatrix
22+
include Statsample::Test::ChiSquare::Shared
23+
724
def initialize(observed, expected=nil)
825
@observed=observed
926
@expected=expected or calculate_expected
1027
raise "Observed size!=expected size" if @observed.row_size!=@expected.row_size or @observed.column_size!=@expected.column_size
1128
@df=(@observed.row_size-1)*(@observed.column_size-1)
1229
@value=compute_chi
1330
end
31+
1432
def calculate_expected
1533
sum=@observed.total_sum
1634
@expected=Matrix.rows( @observed.row_size.times.map {|i|
1735
@observed.column_size.times.map {|j|
1836
(@observed.row_sum[i].quo(sum) * @observed.column_sum[j].quo(sum))*sum
1937
}
20-
})
21-
end
22-
def to_f
23-
@value
24-
end
25-
def chi_square
26-
@value
27-
end
28-
def probability
29-
1-Distribution::ChiSquare.cdf(@value.to_f,@df)
38+
})
3039
end
40+
3141
def compute_chi
32-
sum=0
33-
(0...@observed.row_size).each {|i|
34-
(0...@observed.column_size).each {|j|
42+
sum=0
43+
(0...@observed.row_size).each {|i|
44+
(0...@observed.column_size).each {|j|
3545
sum+=((@observed[i, j] - @expected[i,j])**2).quo(@expected[i,j])
36-
}
3746
}
38-
sum
47+
}
48+
sum
49+
end
50+
end
51+
52+
class WithVector
53+
include Statsample::Test::ChiSquare::Shared
54+
55+
def initialize(observed, expected)
56+
@observed = observed
57+
@expected = expected
58+
raise "Observed size!=expected size" if @observed.size!=@expected.size
59+
@df = @observed.size - 1
60+
@value = compute_chi
61+
end
62+
63+
def compute_chi
64+
sum=0
65+
(0...@observed.size).each {|i|
66+
sum+=((@observed[i] - @expected[i])**2).quo(@expected[i])
67+
}
68+
sum
3969
end
4070
end
4171
end
4272
end
43-
end
73+
end

test/test_stest.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,20 @@ def test_chi_square_matrix_only_observed
2323
assert_equal(6, chi.df)
2424
end
2525

26+
def test_chi_square_vector
27+
observed = Vector[20,30,15]
28+
expected = Vector[20,20,20]
29+
assert_nothing_raised do
30+
Statsample::Test.chi_square(observed, expected)
31+
end
32+
chi = Statsample::Test.chi_square(observed, expected)
33+
34+
assert_in_delta(6.25, chi.chi_square, 0.0001)
35+
assert_in_delta(0.04393, chi.probability, 0.00001)
36+
37+
assert_equal(2, chi.df)
38+
end
39+
2640
def test_u_mannwhitney
2741
a = Daru::Vector.new([1, 2, 3, 4, 5, 6])
2842
b = Daru::Vector.new([0, 5, 7, 9, 10, 11])

0 commit comments

Comments
 (0)