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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.travis.yml +23 -0
- data/CONTRIBUTING.md +17 -0
- data/Gemfile +2 -0
- data/History.txt +457 -0
- data/LICENSE.txt +12 -0
- data/README.md +175 -0
- data/Rakefile +44 -0
- data/benchmarks/correlation_matrix_15_variables.rb +32 -0
- data/benchmarks/correlation_matrix_5_variables.rb +33 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix.ds +0 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix.html +93 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix.rb +71 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix.xls +0 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix_gsl_ruby.ods +0 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix_with_graphics.ods +0 -0
- data/benchmarks/correlation_matrix_methods/results.ds +0 -0
- data/benchmarks/factor_map.rb +37 -0
- data/benchmarks/helpers_benchmark.rb +5 -0
- data/data/locale/es/LC_MESSAGES/statsample.mo +0 -0
- data/doc_latex/manual/equations.tex +78 -0
- data/examples/boxplot.rb +28 -0
- data/examples/chisquare_test.rb +23 -0
- data/examples/correlation_matrix.rb +32 -0
- data/examples/dataset.rb +30 -0
- data/examples/dominance_analysis.rb +33 -0
- data/examples/dominance_analysis_bootstrap.rb +32 -0
- data/examples/histogram.rb +26 -0
- data/examples/icc.rb +24 -0
- data/examples/levene.rb +29 -0
- data/examples/multiple_regression.rb +20 -0
- data/examples/multivariate_correlation.rb +33 -0
- data/examples/parallel_analysis.rb +40 -0
- data/examples/polychoric.rb +40 -0
- data/examples/principal_axis.rb +26 -0
- data/examples/reliability.rb +31 -0
- data/examples/scatterplot.rb +25 -0
- data/examples/t_test.rb +27 -0
- data/examples/tetrachoric.rb +17 -0
- data/examples/u_test.rb +24 -0
- data/examples/vector.rb +20 -0
- data/examples/velicer_map_test.rb +46 -0
- data/grab_references.rb +29 -0
- data/lib/spss.rb +134 -0
- data/lib/statsample-ekatena/analysis.rb +100 -0
- data/lib/statsample-ekatena/analysis/suite.rb +89 -0
- data/lib/statsample-ekatena/analysis/suitereportbuilder.rb +44 -0
- data/lib/statsample-ekatena/anova.rb +24 -0
- data/lib/statsample-ekatena/anova/contrast.rb +79 -0
- data/lib/statsample-ekatena/anova/oneway.rb +187 -0
- data/lib/statsample-ekatena/anova/twoway.rb +207 -0
- data/lib/statsample-ekatena/bivariate.rb +406 -0
- data/lib/statsample-ekatena/bivariate/pearson.rb +54 -0
- data/lib/statsample-ekatena/codification.rb +182 -0
- data/lib/statsample-ekatena/converter/csv.rb +28 -0
- data/lib/statsample-ekatena/converter/spss.rb +48 -0
- data/lib/statsample-ekatena/converters.rb +211 -0
- data/lib/statsample-ekatena/crosstab.rb +188 -0
- data/lib/statsample-ekatena/daru.rb +115 -0
- data/lib/statsample-ekatena/dataset.rb +10 -0
- data/lib/statsample-ekatena/dominanceanalysis.rb +425 -0
- data/lib/statsample-ekatena/dominanceanalysis/bootstrap.rb +232 -0
- data/lib/statsample-ekatena/factor.rb +104 -0
- data/lib/statsample-ekatena/factor/map.rb +124 -0
- data/lib/statsample-ekatena/factor/parallelanalysis.rb +166 -0
- data/lib/statsample-ekatena/factor/pca.rb +242 -0
- data/lib/statsample-ekatena/factor/principalaxis.rb +243 -0
- data/lib/statsample-ekatena/factor/rotation.rb +198 -0
- data/lib/statsample-ekatena/formula/fit_model.rb +46 -0
- data/lib/statsample-ekatena/formula/formula.rb +306 -0
- data/lib/statsample-ekatena/graph.rb +11 -0
- data/lib/statsample-ekatena/graph/boxplot.rb +236 -0
- data/lib/statsample-ekatena/graph/histogram.rb +198 -0
- data/lib/statsample-ekatena/graph/scatterplot.rb +213 -0
- data/lib/statsample-ekatena/histogram.rb +180 -0
- data/lib/statsample-ekatena/matrix.rb +329 -0
- data/lib/statsample-ekatena/multiset.rb +310 -0
- data/lib/statsample-ekatena/regression.rb +65 -0
- data/lib/statsample-ekatena/regression/multiple.rb +89 -0
- data/lib/statsample-ekatena/regression/multiple/alglibengine.rb +128 -0
- data/lib/statsample-ekatena/regression/multiple/baseengine.rb +251 -0
- data/lib/statsample-ekatena/regression/multiple/gslengine.rb +129 -0
- data/lib/statsample-ekatena/regression/multiple/matrixengine.rb +205 -0
- data/lib/statsample-ekatena/regression/multiple/rubyengine.rb +86 -0
- data/lib/statsample-ekatena/regression/simple.rb +121 -0
- data/lib/statsample-ekatena/reliability.rb +150 -0
- data/lib/statsample-ekatena/reliability/icc.rb +415 -0
- data/lib/statsample-ekatena/reliability/multiscaleanalysis.rb +181 -0
- data/lib/statsample-ekatena/reliability/scaleanalysis.rb +233 -0
- data/lib/statsample-ekatena/reliability/skillscaleanalysis.rb +114 -0
- data/lib/statsample-ekatena/resample.rb +15 -0
- data/lib/statsample-ekatena/shorthand.rb +125 -0
- data/lib/statsample-ekatena/srs.rb +169 -0
- data/lib/statsample-ekatena/test.rb +82 -0
- data/lib/statsample-ekatena/test/bartlettsphericity.rb +45 -0
- data/lib/statsample-ekatena/test/chisquare.rb +73 -0
- data/lib/statsample-ekatena/test/f.rb +52 -0
- data/lib/statsample-ekatena/test/kolmogorovsmirnov.rb +63 -0
- data/lib/statsample-ekatena/test/levene.rb +88 -0
- data/lib/statsample-ekatena/test/t.rb +309 -0
- data/lib/statsample-ekatena/test/umannwhitney.rb +208 -0
- data/lib/statsample-ekatena/test/wilcoxonsignedrank.rb +90 -0
- data/lib/statsample-ekatena/vector.rb +19 -0
- data/lib/statsample-ekatena/version.rb +3 -0
- data/lib/statsample.rb +282 -0
- data/po/es/statsample.mo +0 -0
- data/po/es/statsample.po +959 -0
- data/po/statsample.pot +947 -0
- data/references.txt +24 -0
- data/statsample-ekatena.gemspec +49 -0
- data/test/fixtures/bank2.dat +200 -0
- data/test/fixtures/correlation_matrix.rb +17 -0
- data/test/fixtures/df.csv +15 -0
- data/test/fixtures/hartman_23.matrix +9 -0
- data/test/fixtures/stock_data.csv +500 -0
- data/test/fixtures/tetmat_matrix.txt +5 -0
- data/test/fixtures/tetmat_test.txt +1001 -0
- data/test/helpers_tests.rb +83 -0
- data/test/test_analysis.rb +176 -0
- data/test/test_anova_contrast.rb +36 -0
- data/test/test_anovaoneway.rb +26 -0
- data/test/test_anovatwoway.rb +37 -0
- data/test/test_anovatwowaywithdataset.rb +47 -0
- data/test/test_anovawithvectors.rb +102 -0
- data/test/test_awesome_print_bug.rb +16 -0
- data/test/test_bartlettsphericity.rb +25 -0
- data/test/test_bivariate.rb +164 -0
- data/test/test_codification.rb +78 -0
- data/test/test_crosstab.rb +67 -0
- data/test/test_dominance_analysis.rb +39 -0
- data/test/test_factor.rb +228 -0
- data/test/test_factor_map.rb +38 -0
- data/test/test_factor_pa.rb +56 -0
- data/test/test_fit_model.rb +88 -0
- data/test/test_ggobi.rb +35 -0
- data/test/test_gsl.rb +15 -0
- data/test/test_histogram.rb +109 -0
- data/test/test_matrix.rb +48 -0
- data/test/test_multiset.rb +176 -0
- data/test/test_regression.rb +231 -0
- data/test/test_reliability.rb +223 -0
- data/test/test_reliability_icc.rb +198 -0
- data/test/test_reliability_skillscale.rb +57 -0
- data/test/test_resample.rb +24 -0
- data/test/test_srs.rb +9 -0
- data/test/test_statistics.rb +69 -0
- data/test/test_stest.rb +69 -0
- data/test/test_stratified.rb +17 -0
- data/test/test_test_f.rb +33 -0
- data/test/test_test_kolmogorovsmirnov.rb +34 -0
- data/test/test_test_t.rb +62 -0
- data/test/test_umannwhitney.rb +27 -0
- data/test/test_vector.rb +12 -0
- data/test/test_wilcoxonsignedrank.rb +64 -0
- 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
|