statsample-ekatena 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +23 -0
  4. data/CONTRIBUTING.md +17 -0
  5. data/Gemfile +2 -0
  6. data/History.txt +457 -0
  7. data/LICENSE.txt +12 -0
  8. data/README.md +175 -0
  9. data/Rakefile +44 -0
  10. data/benchmarks/correlation_matrix_15_variables.rb +32 -0
  11. data/benchmarks/correlation_matrix_5_variables.rb +33 -0
  12. data/benchmarks/correlation_matrix_methods/correlation_matrix.ds +0 -0
  13. data/benchmarks/correlation_matrix_methods/correlation_matrix.html +93 -0
  14. data/benchmarks/correlation_matrix_methods/correlation_matrix.rb +71 -0
  15. data/benchmarks/correlation_matrix_methods/correlation_matrix.xls +0 -0
  16. data/benchmarks/correlation_matrix_methods/correlation_matrix_gsl_ruby.ods +0 -0
  17. data/benchmarks/correlation_matrix_methods/correlation_matrix_with_graphics.ods +0 -0
  18. data/benchmarks/correlation_matrix_methods/results.ds +0 -0
  19. data/benchmarks/factor_map.rb +37 -0
  20. data/benchmarks/helpers_benchmark.rb +5 -0
  21. data/data/locale/es/LC_MESSAGES/statsample.mo +0 -0
  22. data/doc_latex/manual/equations.tex +78 -0
  23. data/examples/boxplot.rb +28 -0
  24. data/examples/chisquare_test.rb +23 -0
  25. data/examples/correlation_matrix.rb +32 -0
  26. data/examples/dataset.rb +30 -0
  27. data/examples/dominance_analysis.rb +33 -0
  28. data/examples/dominance_analysis_bootstrap.rb +32 -0
  29. data/examples/histogram.rb +26 -0
  30. data/examples/icc.rb +24 -0
  31. data/examples/levene.rb +29 -0
  32. data/examples/multiple_regression.rb +20 -0
  33. data/examples/multivariate_correlation.rb +33 -0
  34. data/examples/parallel_analysis.rb +40 -0
  35. data/examples/polychoric.rb +40 -0
  36. data/examples/principal_axis.rb +26 -0
  37. data/examples/reliability.rb +31 -0
  38. data/examples/scatterplot.rb +25 -0
  39. data/examples/t_test.rb +27 -0
  40. data/examples/tetrachoric.rb +17 -0
  41. data/examples/u_test.rb +24 -0
  42. data/examples/vector.rb +20 -0
  43. data/examples/velicer_map_test.rb +46 -0
  44. data/grab_references.rb +29 -0
  45. data/lib/spss.rb +134 -0
  46. data/lib/statsample-ekatena/analysis.rb +100 -0
  47. data/lib/statsample-ekatena/analysis/suite.rb +89 -0
  48. data/lib/statsample-ekatena/analysis/suitereportbuilder.rb +44 -0
  49. data/lib/statsample-ekatena/anova.rb +24 -0
  50. data/lib/statsample-ekatena/anova/contrast.rb +79 -0
  51. data/lib/statsample-ekatena/anova/oneway.rb +187 -0
  52. data/lib/statsample-ekatena/anova/twoway.rb +207 -0
  53. data/lib/statsample-ekatena/bivariate.rb +406 -0
  54. data/lib/statsample-ekatena/bivariate/pearson.rb +54 -0
  55. data/lib/statsample-ekatena/codification.rb +182 -0
  56. data/lib/statsample-ekatena/converter/csv.rb +28 -0
  57. data/lib/statsample-ekatena/converter/spss.rb +48 -0
  58. data/lib/statsample-ekatena/converters.rb +211 -0
  59. data/lib/statsample-ekatena/crosstab.rb +188 -0
  60. data/lib/statsample-ekatena/daru.rb +115 -0
  61. data/lib/statsample-ekatena/dataset.rb +10 -0
  62. data/lib/statsample-ekatena/dominanceanalysis.rb +425 -0
  63. data/lib/statsample-ekatena/dominanceanalysis/bootstrap.rb +232 -0
  64. data/lib/statsample-ekatena/factor.rb +104 -0
  65. data/lib/statsample-ekatena/factor/map.rb +124 -0
  66. data/lib/statsample-ekatena/factor/parallelanalysis.rb +166 -0
  67. data/lib/statsample-ekatena/factor/pca.rb +242 -0
  68. data/lib/statsample-ekatena/factor/principalaxis.rb +243 -0
  69. data/lib/statsample-ekatena/factor/rotation.rb +198 -0
  70. data/lib/statsample-ekatena/formula/fit_model.rb +46 -0
  71. data/lib/statsample-ekatena/formula/formula.rb +306 -0
  72. data/lib/statsample-ekatena/graph.rb +11 -0
  73. data/lib/statsample-ekatena/graph/boxplot.rb +236 -0
  74. data/lib/statsample-ekatena/graph/histogram.rb +198 -0
  75. data/lib/statsample-ekatena/graph/scatterplot.rb +213 -0
  76. data/lib/statsample-ekatena/histogram.rb +180 -0
  77. data/lib/statsample-ekatena/matrix.rb +329 -0
  78. data/lib/statsample-ekatena/multiset.rb +310 -0
  79. data/lib/statsample-ekatena/regression.rb +65 -0
  80. data/lib/statsample-ekatena/regression/multiple.rb +89 -0
  81. data/lib/statsample-ekatena/regression/multiple/alglibengine.rb +128 -0
  82. data/lib/statsample-ekatena/regression/multiple/baseengine.rb +251 -0
  83. data/lib/statsample-ekatena/regression/multiple/gslengine.rb +129 -0
  84. data/lib/statsample-ekatena/regression/multiple/matrixengine.rb +205 -0
  85. data/lib/statsample-ekatena/regression/multiple/rubyengine.rb +86 -0
  86. data/lib/statsample-ekatena/regression/simple.rb +121 -0
  87. data/lib/statsample-ekatena/reliability.rb +150 -0
  88. data/lib/statsample-ekatena/reliability/icc.rb +415 -0
  89. data/lib/statsample-ekatena/reliability/multiscaleanalysis.rb +181 -0
  90. data/lib/statsample-ekatena/reliability/scaleanalysis.rb +233 -0
  91. data/lib/statsample-ekatena/reliability/skillscaleanalysis.rb +114 -0
  92. data/lib/statsample-ekatena/resample.rb +15 -0
  93. data/lib/statsample-ekatena/shorthand.rb +125 -0
  94. data/lib/statsample-ekatena/srs.rb +169 -0
  95. data/lib/statsample-ekatena/test.rb +82 -0
  96. data/lib/statsample-ekatena/test/bartlettsphericity.rb +45 -0
  97. data/lib/statsample-ekatena/test/chisquare.rb +73 -0
  98. data/lib/statsample-ekatena/test/f.rb +52 -0
  99. data/lib/statsample-ekatena/test/kolmogorovsmirnov.rb +63 -0
  100. data/lib/statsample-ekatena/test/levene.rb +88 -0
  101. data/lib/statsample-ekatena/test/t.rb +309 -0
  102. data/lib/statsample-ekatena/test/umannwhitney.rb +208 -0
  103. data/lib/statsample-ekatena/test/wilcoxonsignedrank.rb +90 -0
  104. data/lib/statsample-ekatena/vector.rb +19 -0
  105. data/lib/statsample-ekatena/version.rb +3 -0
  106. data/lib/statsample.rb +282 -0
  107. data/po/es/statsample.mo +0 -0
  108. data/po/es/statsample.po +959 -0
  109. data/po/statsample.pot +947 -0
  110. data/references.txt +24 -0
  111. data/statsample-ekatena.gemspec +49 -0
  112. data/test/fixtures/bank2.dat +200 -0
  113. data/test/fixtures/correlation_matrix.rb +17 -0
  114. data/test/fixtures/df.csv +15 -0
  115. data/test/fixtures/hartman_23.matrix +9 -0
  116. data/test/fixtures/stock_data.csv +500 -0
  117. data/test/fixtures/tetmat_matrix.txt +5 -0
  118. data/test/fixtures/tetmat_test.txt +1001 -0
  119. data/test/helpers_tests.rb +83 -0
  120. data/test/test_analysis.rb +176 -0
  121. data/test/test_anova_contrast.rb +36 -0
  122. data/test/test_anovaoneway.rb +26 -0
  123. data/test/test_anovatwoway.rb +37 -0
  124. data/test/test_anovatwowaywithdataset.rb +47 -0
  125. data/test/test_anovawithvectors.rb +102 -0
  126. data/test/test_awesome_print_bug.rb +16 -0
  127. data/test/test_bartlettsphericity.rb +25 -0
  128. data/test/test_bivariate.rb +164 -0
  129. data/test/test_codification.rb +78 -0
  130. data/test/test_crosstab.rb +67 -0
  131. data/test/test_dominance_analysis.rb +39 -0
  132. data/test/test_factor.rb +228 -0
  133. data/test/test_factor_map.rb +38 -0
  134. data/test/test_factor_pa.rb +56 -0
  135. data/test/test_fit_model.rb +88 -0
  136. data/test/test_ggobi.rb +35 -0
  137. data/test/test_gsl.rb +15 -0
  138. data/test/test_histogram.rb +109 -0
  139. data/test/test_matrix.rb +48 -0
  140. data/test/test_multiset.rb +176 -0
  141. data/test/test_regression.rb +231 -0
  142. data/test/test_reliability.rb +223 -0
  143. data/test/test_reliability_icc.rb +198 -0
  144. data/test/test_reliability_skillscale.rb +57 -0
  145. data/test/test_resample.rb +24 -0
  146. data/test/test_srs.rb +9 -0
  147. data/test/test_statistics.rb +69 -0
  148. data/test/test_stest.rb +69 -0
  149. data/test/test_stratified.rb +17 -0
  150. data/test/test_test_f.rb +33 -0
  151. data/test/test_test_kolmogorovsmirnov.rb +34 -0
  152. data/test/test_test_t.rb +62 -0
  153. data/test/test_umannwhitney.rb +27 -0
  154. data/test/test_vector.rb +12 -0
  155. data/test/test_wilcoxonsignedrank.rb +64 -0
  156. metadata +570 -0
@@ -0,0 +1,83 @@
1
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib/'))
2
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/'))
3
+
4
+ require 'minitest'
5
+ require 'minitest/unit'
6
+ require 'mocha/setup'
7
+ require 'tempfile'
8
+ require 'tmpdir'
9
+ require 'shoulda'
10
+ require 'shoulda-context'
11
+ require 'fixtures/correlation_matrix'
12
+
13
+ require 'statsample'
14
+
15
+ module Minitest
16
+ class Test
17
+ include Shoulda::Context::Assertions
18
+ include Shoulda::Context::InstanceMethods
19
+ extend Shoulda::Context::ClassMethods
20
+
21
+ def self.should_with_gsl(name, &block)
22
+ should(name) do
23
+ if Statsample.has_gsl?
24
+ instance_eval(&block)
25
+ else
26
+ skip('Requires GSL')
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ module Assertions
33
+ def assert_vectors_from_formula(formula, names)
34
+ model = Statsample::FitModel.new formula, @df
35
+
36
+ model.df_for_regression.vectors.to_a.sort
37
+ .must_equal names.sort
38
+ end
39
+
40
+ def assert_similar_vector(exp, obs, delta = 1e-10, msg = nil)
41
+ msg ||= "Different vectors #{exp} - #{obs}"
42
+ assert_equal(exp.size, obs.size)
43
+ exp.to_a.each_with_index {|v, i|
44
+ assert_in_delta(v, obs[i], delta)
45
+ }
46
+ end
47
+
48
+ def assert_equal_vector(exp, obs, delta = 1e-10, msg = nil)
49
+ assert_equal(exp.size, obs.size, "Different size.#{msg}")
50
+ exp.size.times {|i|
51
+ assert_in_delta(exp[i], obs[i], delta, "Different element #{i}. \nExpected:\n#{exp}\nObserved:\n#{obs}.#{msg}")
52
+ }
53
+ end
54
+
55
+ def assert_equal_matrix(exp, obs, delta = 1e-10, msg = nil)
56
+ assert_equal(exp.row_size, obs.row_size, "Different row size.#{msg}")
57
+ assert_equal(exp.column_size, obs.column_size, "Different column size.#{msg}")
58
+ exp.row_size.times {|i|
59
+ exp.column_size.times {|j|
60
+ assert_in_delta(exp[i, j], obs[i, j], delta, "Different element #{i},#{j}\nExpected:\n#{exp}\nObserved:\n#{obs}.#{msg}")
61
+ }
62
+ }
63
+ end
64
+ alias_method :assert_raise, :assert_raises unless method_defined? :assert_raise
65
+ alias_method :assert_not_equal, :refute_equal unless method_defined? :assert_not_equal
66
+ alias_method :assert_not_same, :refute_same unless method_defined? :assert_not_same
67
+ unless method_defined? :assert_nothing_raised
68
+ def assert_nothing_raised(msg = nil)
69
+ msg ||= 'Nothing should be raised, but raised %s'
70
+ begin
71
+ yield
72
+ not_raised = true
73
+ rescue Exception => e
74
+ not_raised = false
75
+ msg = sprintf(msg, e)
76
+ end
77
+ assert(not_raised, msg)
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ MiniTest.autorun
@@ -0,0 +1,176 @@
1
+ require(File.expand_path(File.dirname(__FILE__) + '/helpers_tests.rb'))
2
+
3
+ class StatsampleAnalysisTestCase < Minitest::Test
4
+ context(Statsample::Analysis) do
5
+ setup do
6
+ Statsample::Analysis.clear_analysis
7
+ end
8
+ should 'store() should create and store Statsample::Analysis::Suite' do
9
+ Statsample::Analysis.store(:first) do
10
+ a = 1
11
+ end
12
+ assert(Statsample::Analysis.stored_analysis[:first])
13
+ assert(Statsample::Analysis.stored_analysis[:first].is_a? Statsample::Analysis::Suite)
14
+ end
15
+
16
+ should 'ss_analysis should create an Statsample::Analysis' do
17
+ ss_analysis(:first) { a = 1 }
18
+ end
19
+ should 'store last created analysis' do
20
+ an = Statsample::Analysis.store(:first) do
21
+ a = 1
22
+ end
23
+ assert_equal(an, Statsample::Analysis.last)
24
+ end
25
+
26
+ should 'add_to_reportbuilder() add sections to reportbuilder object' do
27
+ rb = mock
28
+ rb.expects(:add).with { |value| value.is_a? ReportBuilder::Section and value.name == :first }
29
+ rb.expects(:add).with { |value| value.is_a? ReportBuilder::Section and value.name == :second }
30
+
31
+ Statsample::Analysis.store(:first) do
32
+ echo 'first', 'second'
33
+ end
34
+ Statsample::Analysis.store(:second) do
35
+ echo 'third'
36
+ end
37
+ Statsample::Analysis.add_to_reportbuilder(rb, :first, :second)
38
+ end
39
+ should 'to_text returns the same as a normal ReportBuilder object' do
40
+ rb = ReportBuilder.new(name: :test)
41
+ section = ReportBuilder::Section.new(name: 'first')
42
+ a = Daru::Vector.new([1, 2, 3])
43
+ section.add('first')
44
+ section.add(a)
45
+ rb.add(section)
46
+ exp = rb.to_text
47
+ an = ss_analysis(:first) {
48
+ echo 'first'
49
+ summary(a)
50
+ }
51
+ obs = Statsample::Analysis.to_text(:first)
52
+
53
+ assert_equal(exp.split("\n")[1, exp.size], obs.split("\n")[1, obs.size])
54
+ end
55
+
56
+ should 'run() execute all analysis by default' do
57
+ m1 = mock
58
+ m1.expects(:run).once
59
+ m1.expects(:hide).once
60
+
61
+ Statsample::Analysis.store(:first) do
62
+ m1.run
63
+ end
64
+ Statsample::Analysis.store(:second) do
65
+ m1.hide
66
+ end
67
+
68
+ # Should run all test
69
+ Statsample::Analysis.run
70
+ end
71
+
72
+ should 'run() execute blocks specificed on parameters' do
73
+ m1 = mock
74
+ m1.expects(:run).once
75
+ m1.expects(:hide).never
76
+ Statsample::Analysis.store(:first) do
77
+ m1.run
78
+ end
79
+ Statsample::Analysis.store(:second) do
80
+ m1.hide
81
+ end
82
+ # Should run all test
83
+ Statsample::Analysis.run(:first)
84
+ end
85
+
86
+ context(Statsample::Analysis::Suite) do
87
+ should 'echo() uses output#puts with same arguments' do
88
+ an = Statsample::Analysis::Suite.new(:output)
89
+ obj = mock
90
+ obj.expects(:puts).with(:first, :second).once
91
+ an.output = obj
92
+ an.echo(:first, :second)
93
+ end
94
+ should 'summary() should call object.summary' do
95
+ an = Statsample::Analysis::Suite.new(:summary)
96
+ obj = stub('summarizable', summary: 'summary')
97
+ assert_equal(obj.summary, an.summary(obj))
98
+ end
99
+ should 'attach() allows to call objects on objects which respond to fields' do
100
+ an = Statsample::Analysis::Suite.new(:summary)
101
+ ds = { :x => stub(mean: 10), :y => stub(mean: 12) }
102
+ ds.expects(:vectors).returns([:x, :y]).at_least_once
103
+ an.attach(ds)
104
+ assert_equal(10, an.x.mean)
105
+ assert_equal(12, an.y.mean)
106
+ assert_raise(RuntimeError) {
107
+ an.z
108
+ }
109
+ end
110
+ should 'attached objects should be called LIFO' do
111
+ an = Statsample::Analysis::Suite.new(:summary)
112
+ ds1 = { :x => stub(mean: 100), :y => stub(mean: 120), :z => stub(mean: 13) }
113
+ ds1.expects(:vectors).returns([:x, :y, :z]).at_least_once
114
+ ds2 = { :x => stub(mean: 10), :y => stub(mean: 12) }
115
+ ds2.expects(:vectors).returns([:x, :y]).at_least_once
116
+ an.attach(ds1)
117
+ an.attach(ds2)
118
+ assert_equal(10, an.x.mean)
119
+ assert_equal(12, an.y.mean)
120
+ assert_equal(13, an.z.mean)
121
+ end
122
+
123
+ should 'detach() without arguments drop latest object' do
124
+ an = Statsample::Analysis::Suite.new(:summary)
125
+ ds1 = { :x => stub(mean: 100), :y => stub(mean: 120), :z => stub(mean: 13) }
126
+ ds1.expects(:vectors).returns([:x, :y, :z]).at_least_once
127
+ ds2 = { :x => stub(mean: 10), :y => stub(mean: 12) }
128
+ ds2.expects(:vectors).returns([:x, :y]).at_least_once
129
+ an.attach(ds1)
130
+ an.attach(ds2)
131
+ assert_equal(10, an.x.mean)
132
+ an.detach
133
+ assert_equal(100, an.x.mean)
134
+ end
135
+ should 'detach() with argument drop select object' do
136
+ an = Statsample::Analysis::Suite.new(:summary)
137
+ ds1 = { :x => 1 }
138
+ ds1.expects(:vectors).returns([:x]).at_least_once
139
+ ds2 = { :x => 2, :y => 3 }
140
+ ds2.expects(:vectors).returns([:x, :y]).at_least_once
141
+ ds3 = { :y => 4 }
142
+ ds3.expects(:vectors).returns([:y]).at_least_once
143
+
144
+ an.attach(ds3)
145
+ an.attach(ds2)
146
+ an.attach(ds1)
147
+ assert_equal(1, an.x)
148
+ assert_equal(3, an.y)
149
+ an.detach(ds2)
150
+ assert_equal(4, an.y)
151
+ end
152
+ should 'perform a simple analysis' do
153
+ output = mock
154
+ output.expects(:puts).with(5.5)
155
+ an = Statsample::Analysis.store(:simple, output: output) do
156
+ ds = data_frame(x: vector(1..10), y: vector(1..10))
157
+ attach(ds)
158
+ echo x.mean
159
+ end
160
+ an.run
161
+ end
162
+ end
163
+ context(Statsample::Analysis::SuiteReportBuilder) do
164
+ should 'echo() use add on rb object' do
165
+ an = Statsample::Analysis::SuiteReportBuilder.new(:puts_to_add)
166
+ an.rb.expects(:add).with(:first).twice
167
+ an.echo(:first, :first)
168
+ end
169
+ should 'summary() uses add on rb object' do
170
+ an = Statsample::Analysis::SuiteReportBuilder.new(:summary_to_add)
171
+ an.rb.expects(:add).with(:first).once
172
+ an.summary(:first)
173
+ end
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,36 @@
1
+ require(File.expand_path(File.dirname(__FILE__) + '/helpers_tests.rb'))
2
+ class StatsampleAnovaContrastTestCase < Minitest::Test
3
+ context(Statsample::Anova::Contrast) do
4
+ setup do
5
+ constant = Daru::Vector.new([12, 13, 11, 12, 12])
6
+ frequent = Daru::Vector.new([9, 10, 9, 13, 14])
7
+ infrequent = Daru::Vector.new([15, 16, 17, 16, 16])
8
+ never = Daru::Vector.new([17, 18, 12, 18, 20])
9
+ @vectors = [constant, frequent, infrequent, never]
10
+ @c = Statsample::Anova::Contrast.new(vectors: @vectors)
11
+ end
12
+ should 'return correct value using c' do
13
+ @c.c([1, -1.quo(3), -1.quo(3), -1.quo(3)])
14
+ # @c.c([1,-0.333,-0.333,-0.333])
15
+ assert_in_delta(-2.6667, @c.psi, 0.0001)
16
+ assert_in_delta(1.0165, @c.se, 0.0001)
17
+ assert_in_delta(-2.623, @c.t, 0.001)
18
+ assert_in_delta(-4.82, @c.confidence_interval[0], 0.01)
19
+ assert_in_delta(-0.51, @c.confidence_interval[1], 0.01)
20
+ assert(@c.summary.size > 0)
21
+ end
22
+ should 'return correct values using c_by_index' do
23
+ @c.c_by_index([0], [1, 2, 3])
24
+ assert_in_delta(-2.6667, @c.psi, 0.0001)
25
+ assert_in_delta(1.0165, @c.se, 0.0001)
26
+ assert_in_delta(-2.623, @c.t, 0.001)
27
+ end
28
+ should 'return correct values using incomplete c_by_index' do
29
+ c1 = Statsample::Anova::Contrast.new(vectors: @vectors, c: [0.5, 0.5, -1, 0])
30
+ c2 = Statsample::Anova::Contrast.new(vectors: @vectors, c1: [0, 1], c2: [2])
31
+ assert_equal(c1.psi, c2.psi)
32
+ assert_equal(c1.se, c2.se)
33
+ assert_equal(c1.t, c2.t)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ require(File.expand_path(File.dirname(__FILE__) + '/helpers_tests.rb'))
2
+ class StatsampleAnovaOneWayTestCase < Minitest::Test
3
+ context(Statsample::Anova::OneWay) do
4
+ setup do
5
+ @ss_num = 30.08
6
+ @ss_den = 87.88
7
+ @df_num = 2
8
+ @df_den = 21
9
+ @anova = Statsample::Anova::OneWay.new(ss_num: @ss_num, ss_den: @ss_den, df_num: @df_num, df_den: @df_den)
10
+ end
11
+ should 'Statsample::Anova.oneway respond to #oneway' do
12
+ assert(Statsample::Anova.respond_to? :oneway)
13
+ end
14
+ should 'return correct value for ms_num and ms_den' do
15
+ assert_in_delta(15.04, @anova.ms_num, 0.01)
16
+ assert_in_delta(4.18, @anova.ms_den, 0.01)
17
+ end
18
+ should 'return correct value for f' do
19
+ assert_in_delta(3.59, @anova.f, 0.01)
20
+ end
21
+ should 'respond to summary' do
22
+ assert(@anova.respond_to? :summary)
23
+ assert(@anova.summary.size > 0)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ require(File.expand_path(File.dirname(__FILE__) + '/helpers_tests.rb'))
2
+ class StatsampleAnovaTwoWayTestCase < Minitest::Test
3
+ context(Statsample::Anova::TwoWay) do
4
+ setup do
5
+ @ss_a = 192.2
6
+ @ss_b = 57.8
7
+ @ss_axb = 168.2
8
+ @ss_within = 75.6
9
+ @df_a = @df_b = 1
10
+ @df_within = 16
11
+ @anova = Statsample::Anova::TwoWay.new(ss_a: @ss_a, ss_b: @ss_b, ss_axb: @ss_axb, ss_within: @ss_within, df_a: @df_a, df_b: @df_b, df_within: @df_within)
12
+ end
13
+ should 'Statsample::Anova.twoway respond to #twoway' do
14
+ assert(Statsample::Anova.respond_to? :twoway)
15
+ end
16
+ should 'return correct value for ms_a, ms_b and ms_axb' do
17
+ assert_in_delta(192.2, @anova.ms_a, 0.01)
18
+ assert_in_delta(57.8, @anova.ms_b, 0.01)
19
+ assert_in_delta(168.2, @anova.ms_axb, 0.01)
20
+ end
21
+ should 'return correct value for f ' do
22
+ assert_in_delta(40.68, @anova.f_a, 0.01)
23
+ assert_in_delta(12.23, @anova.f_b, 0.01)
24
+ assert_in_delta(35.60, @anova.f_axb, 0.01)
25
+ end
26
+ should 'return correct value for probability for f ' do
27
+ assert(@anova.f_a_probability < 0.05)
28
+ assert(@anova.f_b_probability < 0.05)
29
+ assert(@anova.f_axb_probability < 0.05)
30
+ end
31
+
32
+ should 'respond to summary' do
33
+ assert(@anova.respond_to? :summary)
34
+ assert(@anova.summary.size > 0)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ require(File.expand_path(File.dirname(__FILE__) + '/helpers_tests.rb'))
2
+ # Reference:
3
+ # * http://www.uwsp.edu/psych/Stat/13/anova-2w.htm#III
4
+ class StatsampleAnovaTwoWayWithVectorsTestCase < Minitest::Test
5
+ context(Statsample::Anova::TwoWayWithVectors) do
6
+ setup do
7
+ @pa = Daru::Vector.new [5, 4, 3, 4, 2, 18, 19, 14, 12, 15, 6, 7, 5, 8, 4, 6, 9, 5, 9, 3]
8
+ @pa.rename 'Passive Avoidance'
9
+ @a = Daru::Vector.new [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
10
+ # @a.labels = { 0 => '0%', 1 => '35%' }
11
+ @a.rename 'Diet'
12
+ @b = Daru::Vector.new [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
13
+ # @b.labels = { 0 => 'Young', 1 => 'Older' }
14
+ @b.rename 'Age'
15
+ @anova = Statsample::Anova::TwoWayWithVectors.new(a: @a, b: @b, dependent: @pa)
16
+ end
17
+ should 'Statsample::Anova respond to #twoway_with_vectors' do
18
+ assert(Statsample::Anova.respond_to? :twoway_with_vectors)
19
+ end
20
+ should '#new returns the same as Statsample::Anova.twoway_with_vectors' do
21
+ @anova2 = Statsample::Anova.twoway_with_vectors(a: @a, b: @b, dependent: @pa)
22
+ assert_equal(@anova.summary, @anova2.summary)
23
+ end
24
+ should 'return correct value for ms_a, ms_b and ms_axb' do
25
+ assert_in_delta(192.2, @anova.ms_a, 0.01)
26
+ assert_in_delta(57.8, @anova.ms_b, 0.01)
27
+ assert_in_delta(168.2, @anova.ms_axb, 0.01)
28
+ end
29
+ should 'return correct value for f ' do
30
+ assert_in_delta(40.68, @anova.f_a, 0.01)
31
+ assert_in_delta(12.23, @anova.f_b, 0.01)
32
+ assert_in_delta(35.60, @anova.f_axb, 0.01)
33
+ end
34
+ should 'return correct value for probability for f ' do
35
+ assert(@anova.f_a_probability < 0.05)
36
+ assert(@anova.f_b_probability < 0.05)
37
+ assert(@anova.f_axb_probability < 0.05)
38
+ end
39
+
40
+ should 'respond to summary' do
41
+ @anova.summary_descriptives = true
42
+ @anova.summary_levene = true
43
+ assert(@anova.respond_to? :summary)
44
+ assert(@anova.summary.size > 0)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,102 @@
1
+ require(File.expand_path(File.dirname(__FILE__) + '/helpers_tests.rb'))
2
+ class StatsampleAnovaOneWayWithVectorsTestCase < Minitest::Test
3
+ context(Statsample::Anova::OneWayWithVectors) do
4
+ context('when initializing') do
5
+ setup do
6
+ @v1 = Daru::Vector.new(10.times.map { rand(100) })
7
+ @v2 = Daru::Vector.new(10.times.map { rand(100) })
8
+ @v3 = Daru::Vector.new(10.times.map { rand(100) })
9
+ end
10
+ should 'be the same using [] or args*' do
11
+ a1 = Statsample::Anova::OneWayWithVectors.new(@v1, @v2, @v3)
12
+ a2 = Statsample::Anova::OneWayWithVectors.new([@v1, @v2, @v3])
13
+ assert_equal(a1.f, a2.f)
14
+ end
15
+ should 'be the same using module method or object instantiation' do
16
+ a1 = Statsample::Anova::OneWayWithVectors.new(@v1, @v2, @v3)
17
+ a2 = Statsample::Anova.oneway_with_vectors(@v1, @v2, @v3)
18
+ assert_equal(a1.f, a2.f)
19
+ end
20
+ should 'detect optional hash' do
21
+ a1 = Statsample::Anova::OneWayWithVectors.new(@v1, @v2, @v3, name: 'aaa')
22
+ assert_equal('aaa', a1.name)
23
+ end
24
+ should 'omit incorrect arguments' do
25
+ a1 = Statsample::Anova::OneWayWithVectors.new(@v1, @v2, @v3, name: 'aaa')
26
+ a2 = Statsample::Anova::OneWayWithVectors.new(@v1, nil, nil, @v2, @v3, name: 'aaa')
27
+ assert_equal(a1.f, a2.f)
28
+ end
29
+ end
30
+ setup do
31
+ @v1 = Daru::Vector.new([3, 3, 2, 3, 6])
32
+ @v2 = Daru::Vector.new([7, 6, 5, 6, 7])
33
+ @v3 = Daru::Vector.new([9, 8, 9, 7, 8])
34
+ @name = 'Anova testing'
35
+ @anova = Statsample::Anova::OneWayWithVectors.new(@v1, @v2, @v3, name: @name)
36
+ end
37
+ should 'store correctly contrasts' do
38
+ c1 = Statsample::Anova::Contrast.new(vectors: [@v1, @v2, @v3], c: [1, -0.5, -0.5])
39
+
40
+ c2 = @anova.contrast(c: [1, -0.5, -0.5])
41
+ assert_equal(c1.t, c2.t)
42
+ end
43
+ should 'respond to #summary' do
44
+ assert(@anova.respond_to? :summary)
45
+ end
46
+ should 'have correct name of analysis on #summary' do
47
+ assert_match(/#{@name}/, @anova.summary)
48
+ end
49
+ should 'returns same levene values as direct Levene creation' do
50
+ assert_equal(@anova.levene.f, Statsample::Test.levene([@v1, @v2, @v3]).f)
51
+ end
52
+ should 'have correct value for levene' do
53
+ assert_in_delta(0.604, @anova.levene.f, 0.001)
54
+ assert_in_delta(0.562, @anova.levene.probability, 0.001)
55
+ end
56
+ should 'have correct value for sst' do
57
+ assert_in_delta(72.933, @anova.sst, 0.001)
58
+ end
59
+ should 'have correct value for sswg' do
60
+ assert_in_delta(14.8, @anova.sswg, 0.001)
61
+ end
62
+ should 'have correct value for ssb' do
63
+ assert_in_delta(58.133, @anova.ssbg, 0.001)
64
+ end
65
+ should 'sst=sswg+ssbg' do
66
+ assert_in_delta(@anova.sst, @anova.sswg + @anova.ssbg, 0.00001)
67
+ end
68
+ should 'df total equal to number of n-1' do
69
+ assert_equal(@v1.size + @v2.size + @v3.size - 1, @anova.df_total)
70
+ end
71
+ should 'df wg equal to number of n-k' do
72
+ assert_equal(@v1.size + @v2.size + @v3.size - 3, @anova.df_wg)
73
+ end
74
+ should 'df bg equal to number of k-1' do
75
+ assert_equal(2, @anova.df_bg)
76
+ end
77
+ should 'f=(ssbg/df_bg)/(sswt/df_wt)' do
78
+ assert_in_delta((@anova.ssbg.quo(@anova.df_bg)).quo(@anova.sswg.quo(@anova.df_wg)), @anova.f, 0.001)
79
+ end
80
+ should 'p be correct' do
81
+ assert(@anova.probability < 0.01)
82
+ end
83
+ should 'be correct using different test values' do
84
+ anova2 = Statsample::Anova::OneWayWithVectors.new([@v1, @v1, @v1, @v1, @v2])
85
+ assert_in_delta(3.960, anova2.f, 0.001)
86
+ assert_in_delta(0.016, anova2.probability, 0.001)
87
+ end
88
+ context 'with extra information on summary' do
89
+ setup do
90
+ @anova.summary_descriptives = true
91
+ @anova.summary_levene = true
92
+ @summary = @anova.summary
93
+ end
94
+ should 'have section with levene statistics' do
95
+ assert_match(/Levene/, @summary)
96
+ end
97
+ should 'have section with descriptives' do
98
+ assert_match(/Min/, @summary)
99
+ end
100
+ end
101
+ end
102
+ end