statsample-ekatena 2.0.2

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.
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