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,180 @@
1
+ module Statsample
2
+ # A histogram consists of a set of bins which count the
3
+ # number of events falling into a given range of a continuous variable x.
4
+ #
5
+ # This implementations follows convention of GSL
6
+ # for specification.
7
+ #
8
+ # * Verbatim: *
9
+ #
10
+ # The range for bin[i] is given by range[i] to range[i+1].
11
+ # For n bins there are n+1 entries in the array range.
12
+ # Each bin is inclusive at the lower end and exclusive at the upper end.
13
+ # Mathematically this means that the bins are defined
14
+ # by the following inequality,
15
+ #
16
+ # bin[i] corresponds to range[i] <= x < range[i+1]
17
+ #
18
+ # Here is a diagram of the correspondence between ranges and bins
19
+ # on the number-line for x,
20
+ #
21
+ #
22
+ # [ bin[0] )[ bin[1] )[ bin[2] )[ bin[3] )[ bin[4] )
23
+ # ---|---------|---------|---------|---------|---------|--- x
24
+ # r[0] r[1] r[2] r[3] r[4] r[5]
25
+ #
26
+ #
27
+ # In this picture the values of the range array are denoted by r.
28
+ # On the left-hand side of each bin the square bracket ‘[’ denotes
29
+ # an inclusive lower bound ( r <= x), and the round parentheses ‘)’
30
+ # on the right-hand side denote an exclusive upper bound (x < r).
31
+ # Thus any samples which fall on the upper end of the histogram are
32
+ # excluded.
33
+ # If you want to include this value for the last bin you will need to
34
+ # add an extra bin to your histogram.
35
+ #
36
+ #
37
+ # == Reference:
38
+ # * http://www.gnu.org/software/gsl/manual/html_node/The-histogram-struct.html
39
+
40
+ class Histogram
41
+ include Enumerable
42
+
43
+ class << self
44
+ # Alloc +n_bins+, using +range+ as ranges of bins
45
+ def alloc(n_bins, range=nil, opts=Hash.new)
46
+ Histogram.new(n_bins, range, opts)
47
+
48
+ end
49
+ # Alloc +n_bins+ bins, using +p1+ as minimum and +p2+
50
+ # as maximum
51
+ def alloc_uniform(n_bins, p1=nil,p2=nil)
52
+ if p1.is_a? Array
53
+ min,max=p1
54
+ else
55
+ min,max=p1,p2
56
+ end
57
+ range=max - min
58
+ step=range / n_bins.to_f
59
+ range=(n_bins+1).times.map {|i| min + (step*i)}
60
+ Histogram.new(range)
61
+ end
62
+ end
63
+
64
+ attr_accessor :name
65
+ attr_reader :bin
66
+ attr_reader :range
67
+
68
+ include GetText
69
+ bindtextdomain("statsample")
70
+
71
+ def initialize(p1, min_max=false, opts=Hash.new)
72
+
73
+ if p1.is_a? Array
74
+ range=p1
75
+ @n_bins=p1.size-1
76
+ elsif p1.is_a? Integer
77
+ @n_bins=p1
78
+ end
79
+
80
+ @bin=[0.0]*(@n_bins)
81
+ if(min_max)
82
+ min, max=min_max[0], min_max[1]
83
+ range=Array.new(@n_bins+1)
84
+ (@n_bins+1).times {|i| range[i]=min+(i*(max-min).quo(@n_bins)) }
85
+ end
86
+ range||=[0.0]*(@n_bins+1)
87
+ set_ranges(range)
88
+ @name=""
89
+ opts.each{|k,v|
90
+ self.send("#{k}=",v) if self.respond_to? k
91
+ }
92
+ end
93
+
94
+ # Number of bins
95
+ def bins
96
+ @n_bins
97
+ end
98
+
99
+ def increment(x, w=1)
100
+ if x.respond_to? :each
101
+ x.each{|y| increment(y,w) }
102
+ elsif x.is_a? Numeric
103
+ (range.size - 1).times do |i|
104
+ if x >= range[i] and x < range[i+1]
105
+ @bin[i] += w
106
+ break
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ def set_ranges(range)
113
+ raise "Range size should be bin+1" if range.size!=@bin.size+1
114
+ @range=range
115
+ end
116
+
117
+ def get_range(i)
118
+ [@range[i],@range[i+1]]
119
+ end
120
+
121
+ def max
122
+ @range.last
123
+ end
124
+
125
+ def min
126
+ @range.first
127
+ end
128
+ def max_val
129
+ @bin.max
130
+ end
131
+ def min_val
132
+ @bin.min
133
+ end
134
+ def each
135
+ bins.times.each do |i|
136
+ r=get_range(i)
137
+ arg={:i=>i, :low=>r[0],:high=>r[1], :middle=>(r[0]+r[1]) / 2.0, :value=>@bin[i]}
138
+ yield arg
139
+ end
140
+ end
141
+ def estimated_variance
142
+ sum,n=0,0
143
+ mean=estimated_mean
144
+ each do |v|
145
+ sum+=v[:value]*(v[:middle]-mean)**2
146
+ n+=v[:value]
147
+ end
148
+ sum / (n-1)
149
+ end
150
+ def estimated_standard_deviation
151
+ Math::sqrt(estimated_variance)
152
+ end
153
+ def estimated_mean
154
+ sum,n=0,0
155
+ each do |v|
156
+ sum+= v[:value]* v[:middle]
157
+ n+=v[:value]
158
+ end
159
+ sum / n
160
+ end
161
+ alias :mean :estimated_mean
162
+ alias :sigma :estimated_standard_deviation
163
+
164
+ def sum(start=nil,_end=nil)
165
+ start||=0
166
+ _end||=@n_bins-1
167
+ (start.._end).inject(0) {|ac,i| ac+@bin[i]}
168
+ end
169
+ def report_building(generator)
170
+ hg=Statsample::Graph::Histogram.new(self)
171
+ generator.parse_element(hg)
172
+ end
173
+ def report_building_text(generator)
174
+ @range.each_with_index do |r,i|
175
+ next if i==@bin.size
176
+ generator.text(sprintf("%5.2f : %d", r, @bin[i]))
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,329 @@
1
+ class ::Vector
2
+ def to_matrix
3
+ ::Matrix.columns([self.to_a])
4
+ end
5
+ def to_vector
6
+ self
7
+ end
8
+ end
9
+ class ::Matrix
10
+ def to_matrix
11
+ self
12
+ end
13
+
14
+ def to_dataframe
15
+ f = (self.respond_to? :fields_y) ? fields_y : column_size.times.map {|i| "VAR_#{i+1}".to_sym }
16
+ f = [f] unless f.is_a?(Array)
17
+ ds = Daru::DataFrame.new({}, order: f)
18
+ f.each do |ff|
19
+ ds[ff].rename ff
20
+ end
21
+ row_size.times {|i|
22
+ ds.add_row(self.row(i).to_a)
23
+ }
24
+ ds.rename(self.name) if self.respond_to? :name
25
+ ds
26
+ end
27
+
28
+ alias :to_dataset :to_dataframe
29
+
30
+ if defined? :eigenpairs
31
+ alias_method :eigenpairs_ruby, :eigenpairs
32
+ end
33
+
34
+ if Statsample.has_gsl?
35
+ # Optimize eigenpairs of extendmatrix module using gsl
36
+ def eigenpairs
37
+ to_gsl.eigenpairs
38
+ end
39
+ end
40
+
41
+ def eigenvalues
42
+ eigenpairs.collect {|v| v[0]}
43
+ end
44
+
45
+ def eigenvectors
46
+ eigenpairs.collect {|v| v[1]}
47
+ end
48
+
49
+ def eigenvectors_matrix
50
+ Matrix.columns(eigenvectors)
51
+ end
52
+
53
+ def to_gsl
54
+ out=[]
55
+ self.row_size.times{|i|
56
+ out[i]=self.row(i).to_a
57
+ }
58
+ GSL::Matrix[*out]
59
+ end
60
+
61
+ def []=(i, j, x)
62
+ @rows[i][j] = x
63
+ end
64
+ end
65
+
66
+ module GSL
67
+ class Vector
68
+ class Col
69
+ def to_matrix
70
+ ::Matrix.columns([self.size.times.map {|i| self[i]}])
71
+ end
72
+
73
+ def to_ary
74
+ to_a
75
+ end
76
+
77
+ def to_gsl
78
+ self
79
+ end
80
+ end
81
+ end
82
+ class Matrix
83
+ def to_gsl
84
+ self
85
+ end
86
+
87
+ def to_dataframe
88
+ f = (self.respond_to? :fields_y) ? fields_y : column_size.times.map { |i| "VAR_#{i+1}".to_sym }
89
+ ds=Daru::DataFrame.new({}, order: f)
90
+ f.each do |ff|
91
+ ds[ff].rename ff
92
+ end
93
+
94
+ row_size.times {|i|
95
+ ds.add_row(self.row(i).to_a)
96
+ }
97
+ ds.rename(self.name) if self.respond_to? :name
98
+ ds
99
+ end
100
+
101
+ alias :to_dataset :to_dataframe
102
+
103
+ def row_size
104
+ size1
105
+ end
106
+
107
+ def column_size
108
+ size2
109
+ end
110
+
111
+ def determinant
112
+ det
113
+ end
114
+
115
+ def inverse
116
+ GSL::Linalg::LU.invert(self)
117
+ end
118
+
119
+ def eigenvalues
120
+ eigenpairs.collect {|v| v[0]}
121
+ end
122
+
123
+ def eigenvectors
124
+ eigenpairs.collect {|v| v[1]}
125
+ end
126
+
127
+ # Matrix sum of squares
128
+ def mssq
129
+ sum=0
130
+ to_v.each {|i| sum+=i**2}
131
+ sum
132
+ end
133
+
134
+ def eigenvectors_matrix
135
+ eigval, eigvec= GSL::Eigen.symmv(self)
136
+ GSL::Eigen::symmv_sort(eigval, eigvec, GSL::Eigen::SORT_VAL_DESC)
137
+ eigvec
138
+ end
139
+
140
+ def eigenpairs
141
+ eigval, eigvec= GSL::Eigen.symmv(self)
142
+ GSL::Eigen::symmv_sort(eigval, eigvec, GSL::Eigen::SORT_VAL_DESC)
143
+ @eigenpairs=eigval.size.times.map {|i|
144
+ [eigval[i],eigvec.get_col(i)]
145
+ }
146
+ end
147
+
148
+ #def eigenpairs_ruby
149
+ # self.to_matrix.eigenpairs_ruby
150
+ #end
151
+ def square?
152
+ size1==size2
153
+ end
154
+
155
+ def to_matrix
156
+ rows=self.size1
157
+ cols=self.size2
158
+ out=(0...rows).collect{|i| (0...cols).collect {|j| self[i,j]} }
159
+ ::Matrix.rows(out)
160
+ end
161
+
162
+ def total_sum
163
+ sum=0
164
+ size1.times {|i|
165
+ size2.times {|j|
166
+ sum+=self[i,j]
167
+ }
168
+ }
169
+ sum
170
+ end
171
+ end
172
+ end
173
+
174
+ module Statsample
175
+ # Module to add names to X and Y fields
176
+ module NamedMatrix
177
+ include Summarizable
178
+
179
+ def fields
180
+ raise "Should be square" if !square?
181
+ fields_x
182
+ end
183
+ def fields=(v)
184
+ raise "Matrix should be square" if !square?
185
+ @fields_x=v
186
+ @fields_y=v
187
+ end
188
+ def fields_x=(v)
189
+ raise "Size of fields != row_size" if v.size!=row_size
190
+ @fields_x=v
191
+ end
192
+ def fields_y=(v)
193
+ raise "Size of fields != column_size" if v.size!=column_size
194
+ @fields_y=v
195
+ end
196
+ def fields_x
197
+ @fields_x||=row_size.times.collect {|i| _("X%d") % i}
198
+ end
199
+ def fields_y
200
+ @fields_y||=column_size.times.collect {|i| _("Y%d") % i}
201
+ end
202
+
203
+ def name
204
+ @name||=get_new_name
205
+ end
206
+ def name=(v)
207
+ @name=v
208
+ end
209
+ def get_new_name
210
+ @@named_matrix||=0
211
+ @@named_matrix+=1
212
+ _("Matrix %d") % @@named_matrix
213
+ end
214
+
215
+ end
216
+ # Module to add method for variance/covariance and correlation matrices
217
+ # == Usage
218
+ # matrix=Matrix[[1,2],[2,3]]
219
+ # matrix.extend CovariateMatrix
220
+ #
221
+ module CovariateMatrix
222
+ include NamedMatrix
223
+ @@covariatematrix=0
224
+
225
+ # Get type of covariate matrix. Could be :covariance or :correlation
226
+ def _type
227
+ if row_size==column_size
228
+ if row_size.times.find {|i| self[i,i]!=1.0}
229
+ :covariance
230
+ else
231
+ :correlation
232
+ end
233
+ else
234
+ @type
235
+ end
236
+
237
+ end
238
+ def _type=(t)
239
+ @type=t
240
+ end
241
+ def correlation
242
+ if(_type==:covariance)
243
+ matrix=Matrix.rows(row_size.times.collect { |i|
244
+ column_size.times.collect { |j|
245
+ if i==j
246
+ 1.0
247
+ else
248
+ self[i,j].quo(Math::sqrt(self[i,i])*Math::sqrt(self[j,j]))
249
+ end
250
+ }
251
+ })
252
+ matrix.extend CovariateMatrix
253
+ matrix.fields_x=fields_x
254
+ matrix.fields_y=fields_y
255
+ matrix._type=:correlation
256
+ matrix
257
+ else
258
+ self
259
+ end
260
+ end
261
+
262
+
263
+ # Get variance for field k
264
+ #
265
+ def variance(k)
266
+ submatrix([k])[0,0]
267
+ end
268
+
269
+ def get_new_name
270
+ @@covariatematrix+=1
271
+ _("Covariate matrix %d") % @@covariatematrix
272
+ end
273
+
274
+ # Select a submatrix of factors. If you have a correlation matrix
275
+ # with a, b and c, you could obtain a submatrix of correlations of
276
+ # a and b, b and c or a and b
277
+ #
278
+ # You could use labels or index to select the factors.
279
+ # If you don't specify columns, its will be equal to rows.
280
+ #
281
+ # Example:
282
+ # a=Matrix[[1.0, 0.3, 0.2],
283
+ # [0.3, 1.0, 0.5],
284
+ # [0.2, 0.5, 1.0]]
285
+ # a.extend CovariateMatrix
286
+ # a.fields=%w{a b c}
287
+ # a.submatrix(%w{c a}, %w{b})
288
+ # => Matrix[[0.5],[0.3]]
289
+ # a.submatrix(%w{c a})
290
+ # => Matrix[[1.0, 0.2] , [0.2, 1.0]]
291
+ def submatrix(rows,columns = nil)
292
+ raise ArgumentError, "rows shouldn't be empty" if rows.respond_to? :size and rows.size == 0
293
+ columns ||= rows
294
+ # Convert all fields on index
295
+ row_index = rows.collect do |v|
296
+ r = v.is_a?(Numeric) ? v : fields_x.index(v)
297
+ raise "Index #{v} doesn't exists on matrix" if r.nil?
298
+ r
299
+ end
300
+
301
+ column_index = columns.collect do |v|
302
+ r = v.is_a?(Numeric) ? v : fields_y.index(v)
303
+ raise "Index #{v} doesn't exists on matrix" if r.nil?
304
+ r
305
+ end
306
+
307
+
308
+ fx=row_index.collect {|v| fields_x[v]}
309
+ fy=column_index.collect {|v| fields_y[v]}
310
+
311
+ matrix = Matrix.rows(row_index.collect { |i| column_index.collect { |j| self[i, j] }})
312
+ matrix.extend CovariateMatrix
313
+ matrix.fields_x = fx
314
+ matrix.fields_y = fy
315
+ matrix._type = _type
316
+ matrix
317
+ end
318
+ def report_building(generator)
319
+ @name||= (_type==:correlation ? _("Correlation"):_("Covariance"))+_(" Matrix")
320
+ generator.table(:name=>@name, :header=>[""]+fields_y) do |t|
321
+ row_size.times {|i|
322
+ t.row([fields_x[i]]+row(i).to_a.collect {|i1|
323
+ i1.nil? ? "--" : sprintf("%0.3f",i1).gsub("0.",".")
324
+ })
325
+ }
326
+ end
327
+ end
328
+ end
329
+ end