statsample 0.7.0 → 0.8.0
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.
- data/History.txt +7 -0
- data/Manifest.txt +15 -9
- data/README.txt +6 -0
- data/Rakefile +8 -0
- data/{demo → examples}/correlation_matrix.rb +0 -0
- data/{demo/dominanceanalysis.rb → examples/dominance_analysis.rb} +0 -0
- data/{demo → examples}/dominance_analysis_bootstrap.rb +0 -0
- data/{demo → examples}/levene.rb +0 -0
- data/{demo → examples}/multiple_regression.rb +5 -3
- data/{demo → examples}/multivariate_correlation.rb +0 -0
- data/{demo → examples}/polychoric.rb +0 -0
- data/{demo → examples}/principal_axis.rb +0 -0
- data/examples/t_test.rb +11 -0
- data/{demo → examples}/tetrachoric.rb +0 -0
- data/lib/statistics2.rb +1 -1
- data/lib/statsample.rb +57 -6
- data/lib/statsample/bivariate/polychoric.rb +12 -25
- data/lib/statsample/bivariate/tetrachoric.rb +1 -3
- data/lib/statsample/converter/csv.rb +11 -12
- data/lib/statsample/dominanceanalysis/bootstrap.rb +2 -3
- data/lib/statsample/factor/principalaxis.rb +0 -2
- data/lib/statsample/factor/rotation.rb +6 -8
- data/lib/statsample/graph.rb +8 -0
- data/lib/statsample/graph/svggraph.rb +0 -4
- data/lib/statsample/regression/multiple/baseengine.rb +25 -28
- data/lib/statsample/regression/multiple/matrixengine.rb +30 -34
- data/lib/statsample/test.rb +36 -1
- data/lib/statsample/test/levene.rb +11 -7
- data/lib/statsample/test/t.rb +189 -0
- data/test/test_anova.rb +8 -10
- data/test/test_bivariate.rb +40 -37
- data/test/test_codification.rb +9 -13
- data/test/test_combination.rb +37 -39
- data/test/test_crosstab.rb +46 -48
- data/test/test_csv.rb +40 -45
- data/test/test_dataset.rb +150 -152
- data/test/test_distribution.rb +24 -21
- data/test/test_dominance_analysis.rb +10 -12
- data/test/test_factor.rb +95 -91
- data/test/test_ggobi.rb +30 -33
- data/test/test_gsl.rb +4 -4
- data/test/test_helpers.rb +26 -0
- data/test/test_histogram.rb +5 -6
- data/test/test_logit.rb +20 -21
- data/test/test_matrix.rb +47 -48
- data/test/test_mle.rb +130 -131
- data/test/test_multiset.rb +95 -96
- data/test/test_permutation.rb +35 -36
- data/test/test_promise_after.rb +39 -0
- data/test/test_regression.rb +49 -51
- data/test/test_reliability.rb +29 -30
- data/test/test_resample.rb +22 -23
- data/test/test_srs.rb +8 -9
- data/test/test_statistics.rb +12 -6
- data/test/test_stest.rb +18 -10
- data/test/test_stratified.rb +15 -16
- data/test/test_svg_graph.rb +11 -22
- data/test/test_test_t.rb +40 -0
- data/test/test_umannwhitney.rb +14 -15
- data/test/test_vector.rb +33 -37
- data/test/test_xls.rb +34 -41
- metadata +22 -11
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
=== 0.8.0 / 2010-03-29
|
2
|
+
* New Statsample::Test::T module, with classes and methods to do Student's t tests for one and two samples.
|
3
|
+
* Statsample::PromiseAfter module to set a number of variables without explicitly call the compute or iterate method
|
4
|
+
* All tests ported to MiniUnit
|
5
|
+
* Directory 'demo' renamed to 'examples'
|
6
|
+
* Bug fix on report_building on Statsample::Regression::Multiple classes
|
7
|
+
|
1
8
|
=== 0.7.0 / 2010-03-25
|
2
9
|
* Ported to ReportBuilder 1.x series
|
3
10
|
* Implementation of ruby based covariance and correlation changed to a clearer code
|
data/Manifest.txt
CHANGED
@@ -10,15 +10,16 @@ data/repeated_fields.csv
|
|
10
10
|
data/test_binomial.csv
|
11
11
|
data/tetmat_matrix.txt
|
12
12
|
data/tetmat_test.txt
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
13
|
+
examples/correlation_matrix.rb
|
14
|
+
examples/dominance_analysis.rb
|
15
|
+
examples/dominance_analysis_bootstrap.rb
|
16
|
+
examples/levene.rb
|
17
|
+
examples/multiple_regression.rb
|
18
|
+
examples/multivariate_correlation.rb
|
19
|
+
examples/polychoric.rb
|
20
|
+
examples/principal_axis.rb
|
21
|
+
examples/t_test.rb
|
22
|
+
examples/tetrachoric.rb
|
22
23
|
lib/distribution.rb
|
23
24
|
lib/distribution/chisquare.rb
|
24
25
|
lib/distribution/f.rb
|
@@ -45,6 +46,7 @@ lib/statsample/factor.rb
|
|
45
46
|
lib/statsample/factor/pca.rb
|
46
47
|
lib/statsample/factor/principalaxis.rb
|
47
48
|
lib/statsample/factor/rotation.rb
|
49
|
+
lib/statsample/graph.rb
|
48
50
|
lib/statsample/graph/gdchart.rb
|
49
51
|
lib/statsample/graph/svgboxplot.rb
|
50
52
|
lib/statsample/graph/svggraph.rb
|
@@ -74,6 +76,7 @@ lib/statsample/resample.rb
|
|
74
76
|
lib/statsample/srs.rb
|
75
77
|
lib/statsample/test.rb
|
76
78
|
lib/statsample/test/levene.rb
|
79
|
+
lib/statsample/test/t.rb
|
77
80
|
lib/statsample/test/umannwhitney.rb
|
78
81
|
lib/statsample/vector.rb
|
79
82
|
po/es/statsample.mo
|
@@ -93,12 +96,14 @@ test/test_dominance_analysis.rb
|
|
93
96
|
test/test_factor.rb
|
94
97
|
test/test_ggobi.rb
|
95
98
|
test/test_gsl.rb
|
99
|
+
test/test_helpers.rb
|
96
100
|
test/test_histogram.rb
|
97
101
|
test/test_logit.rb
|
98
102
|
test/test_matrix.rb
|
99
103
|
test/test_mle.rb
|
100
104
|
test/test_multiset.rb
|
101
105
|
test/test_permutation.rb
|
106
|
+
test/test_promise_after.rb
|
102
107
|
test/test_regression.rb
|
103
108
|
test/test_reliability.rb
|
104
109
|
test/test_resample.rb
|
@@ -107,6 +112,7 @@ test/test_statistics.rb
|
|
107
112
|
test/test_stest.rb
|
108
113
|
test/test_stratified.rb
|
109
114
|
test/test_svg_graph.rb
|
115
|
+
test/test_test_t.rb
|
110
116
|
test/test_umannwhitney.rb
|
111
117
|
test/test_vector.rb
|
112
118
|
test/test_xls.rb
|
data/README.txt
CHANGED
@@ -11,10 +11,12 @@ Includes:
|
|
11
11
|
* Descriptive statistics: frequencies, median, mean, standard error, skew, kurtosis (and many others).
|
12
12
|
* Imports and exports datasets from and to Excel, CSV and plain text files.
|
13
13
|
* Correlations: Pearson's r, Spearman's rank correlation (rho), Tetrachoric, Polychoric
|
14
|
+
* Tests: T, Levene, U-Mannwhitney, One-Way Anova
|
14
15
|
* Regression: Simple, Multiple, Probit and Logit
|
15
16
|
* Factorial Analysis: Extraction (PCA and Principal Axis) and Rotation (Varimax and relatives)
|
16
17
|
* Dominance Analysis, with multivariate dependent and bootstrap (Azen & Budescu)
|
17
18
|
* Sample calculation related formulas
|
19
|
+
* Creates reports on text, html and rtf, using ReportBuilder
|
18
20
|
|
19
21
|
== FEATURES:
|
20
22
|
|
@@ -47,6 +49,10 @@ Includes:
|
|
47
49
|
* Module Statsample::Crosstab provides function to create crosstab for categorical data
|
48
50
|
* Reliability analysis provides functions to analyze scales. Class ItemAnalysis provides statistics like mean, standard deviation for a scale, Cronbach's alpha and standarized Cronbach's alpha, and for each item: mean, correlation with total scale, mean if deleted, Cronbach's alpha is deleted. With HtmlReport, graph the histogram of the scale and the Item Characteristic Curve for each item
|
49
51
|
* Module Statsample::SRS (Simple Random Sampling) provides a lot of functions to estimate standard error for several type of samples
|
52
|
+
* Module Statsample::Test provides several methods and classes to perform inferencial statistics
|
53
|
+
* Statsample::Test::Levene
|
54
|
+
* Statsample::Test::UMannWhitney
|
55
|
+
* Statsample::Test::T
|
50
56
|
* Interfaces to gdchart, gnuplot and SVG::Graph
|
51
57
|
|
52
58
|
|
data/Rakefile
CHANGED
@@ -88,4 +88,12 @@ task :publicar_docs => [:clean, :docs] do
|
|
88
88
|
sh %{rsync #{h.rsync_args} #{local_dir}/ #{host}:#{remote_dir}}
|
89
89
|
end
|
90
90
|
|
91
|
+
task :release => [:tag] do
|
92
|
+
end
|
93
|
+
|
94
|
+
task :tag do
|
95
|
+
sh %(svn commit -m "Version bump: #{Statsample::VERSION}")
|
96
|
+
sh %(svn cp https://ruby-statsample.googlecode.com/svn/reportbuilder/trunk https://ruby-statsample.googlecode.com/svn/statsample/tags/v#{Statsample::VERSION} -m "ReportBuilder #{Statsample::VERSION} tagged")
|
97
|
+
end
|
98
|
+
|
91
99
|
# vim: syntax=Ruby
|
File without changes
|
File without changes
|
File without changes
|
data/{demo → examples}/levene.rb
RENAMED
File without changes
|
@@ -3,7 +3,7 @@ $:.unshift(File.dirname(__FILE__)+'/../lib/')
|
|
3
3
|
|
4
4
|
require 'statsample'
|
5
5
|
require 'benchmark'
|
6
|
-
samples=
|
6
|
+
samples=1000
|
7
7
|
a=samples.times.collect {rand}.to_scale
|
8
8
|
b=samples.times.collect {rand}.to_scale
|
9
9
|
c=samples.times.collect {rand}.to_scale
|
@@ -15,7 +15,7 @@ ds['y']=ds.collect{|row| row['a']*5+row['b']*3+row['c']*2+row['d']*1+rand()}
|
|
15
15
|
Benchmark.bm(7) do |x|
|
16
16
|
|
17
17
|
|
18
|
-
rb=ReportBuilder.new("Multiple Regression Engines")
|
18
|
+
rb=ReportBuilder.new(:name=>"Multiple Regression Engines")
|
19
19
|
|
20
20
|
if Statsample.has_gsl?
|
21
21
|
x.report("GSL:") {
|
@@ -29,6 +29,8 @@ end
|
|
29
29
|
lr=Statsample::Regression::Multiple::RubyEngine.new(ds,'y',:name=>"Multiple Regression using RubyEngine")
|
30
30
|
rb.add(lr.summary)
|
31
31
|
}
|
32
|
-
|
33
32
|
puts rb.to_text
|
34
33
|
end
|
34
|
+
|
35
|
+
|
36
|
+
|
File without changes
|
File without changes
|
File without changes
|
data/examples/t_test.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
$:.unshift(File.dirname(__FILE__)+'/../lib')
|
3
|
+
require 'statsample'
|
4
|
+
a=10.times.map {rand(100)}.to_scale
|
5
|
+
t_1=Statsample::Test.t_one_sample(a,{:u=>50})
|
6
|
+
puts t_1.summary
|
7
|
+
|
8
|
+
b=20.times.map {(rand(20))**2+50}.to_scale
|
9
|
+
|
10
|
+
t_2=Statsample::Test.t_two_samples_independent(a,b)
|
11
|
+
puts t_2.summary
|
File without changes
|
data/lib/statistics2.rb
CHANGED
data/lib/statsample.rb
CHANGED
@@ -18,12 +18,10 @@
|
|
18
18
|
#
|
19
19
|
|
20
20
|
|
21
|
-
|
22
|
-
$:.unshift(File.expand_path(File.dirname(__FILE__)+"/../ext"))
|
23
|
-
|
21
|
+
#$:.unshift(File.dirname(__FILE__))
|
24
22
|
require 'matrix'
|
25
23
|
require 'distribution'
|
26
|
-
|
24
|
+
gem 'reportbuilder','~>1.0'
|
27
25
|
require 'reportbuilder'
|
28
26
|
class Numeric
|
29
27
|
def square ; self * self ; end
|
@@ -113,7 +111,7 @@ module Statsample
|
|
113
111
|
false
|
114
112
|
end
|
115
113
|
end
|
116
|
-
VERSION = '0.
|
114
|
+
VERSION = '0.8.0'
|
117
115
|
SPLIT_TOKEN = ","
|
118
116
|
autoload(:Database, 'statsample/converters')
|
119
117
|
autoload(:Anova, 'statsample/anova')
|
@@ -140,7 +138,7 @@ module Statsample
|
|
140
138
|
autoload(:Regression, 'statsample/regression')
|
141
139
|
autoload(:Test, 'statsample/test')
|
142
140
|
autoload(:Factor, 'statsample/factor')
|
143
|
-
|
141
|
+
autoload(:Graph, 'statsample/graph')
|
144
142
|
|
145
143
|
|
146
144
|
class << self
|
@@ -154,6 +152,7 @@ module Statsample
|
|
154
152
|
false
|
155
153
|
end
|
156
154
|
end
|
155
|
+
|
157
156
|
# Create a matrix using vectors as columns.
|
158
157
|
# Use:
|
159
158
|
#
|
@@ -204,6 +203,58 @@ module Statsample
|
|
204
203
|
u
|
205
204
|
end
|
206
205
|
end
|
206
|
+
|
207
|
+
module PromiseAfter
|
208
|
+
# Like memoizable module (http://promise.rubyforge.org/Promise.html)
|
209
|
+
# but this applies to set a lot or variables with one expensive method
|
210
|
+
# with a direct calling of dependent methods.
|
211
|
+
# If one of the dependent methods returns nil or false, the main method
|
212
|
+
# is called.
|
213
|
+
#
|
214
|
+
# Use when
|
215
|
+
# 1. You have one expensive operation which set many internal variables
|
216
|
+
# 2. This expensive operations depends on values which can set
|
217
|
+
# anytime BEFORE calculation of main function
|
218
|
+
#
|
219
|
+
# I use for classes which requires a iteration to set several variables,
|
220
|
+
# hiding to user the need to explicitily call the iterate method.
|
221
|
+
#
|
222
|
+
# Example:
|
223
|
+
# class ExpensiveCalculation
|
224
|
+
# include PromiseAfter
|
225
|
+
# attr_accessor :y, :z
|
226
|
+
# def initialize(y=nil,z=nil)
|
227
|
+
# @y=y
|
228
|
+
# @z=z
|
229
|
+
# def compute
|
230
|
+
# @a=@y*1000+@z*1000
|
231
|
+
# end
|
232
|
+
# def a
|
233
|
+
# @a.nil? nil : "This is the value: #{@a}"
|
234
|
+
# end
|
235
|
+
# promise_after :compute, :a, :b
|
236
|
+
# end
|
237
|
+
# puts ExpensiveCalculation.new(1,2).a
|
238
|
+
|
239
|
+
def promise_after(function, *syms)
|
240
|
+
syms.each do |sym|
|
241
|
+
# You should doc the method!
|
242
|
+
raise NoMethodError, "Method `#{sym}' doesn't exists! Create it first " unless method_defined? sym
|
243
|
+
alias_method((sym.to_s+"_without_promise_after").intern, sym)
|
244
|
+
define_method(sym) {
|
245
|
+
#sym_to_iv="@#{sym.to_s.gsub(":","")}".intern
|
246
|
+
#if !instance_variable_defined?(sym_to_iv) or instance_variable_get(sym_to_iv).nil?
|
247
|
+
if(!send(sym.to_s+"_without_promise_after"))
|
248
|
+
send(function)
|
249
|
+
end
|
250
|
+
send(sym.to_s+"_without_promise_after")
|
251
|
+
}
|
252
|
+
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
|
207
258
|
module Writable
|
208
259
|
def save(filename)
|
209
260
|
fp=File.open(filename,"w")
|
@@ -65,6 +65,7 @@ module Statsample
|
|
65
65
|
|
66
66
|
class Polychoric
|
67
67
|
include GetText
|
68
|
+
extend Statsample::PromiseAfter
|
68
69
|
bindtextdomain("statsample")
|
69
70
|
# Name of the analysis
|
70
71
|
attr_accessor :name
|
@@ -135,28 +136,16 @@ module Statsample
|
|
135
136
|
compute_basic_parameters
|
136
137
|
end
|
137
138
|
# Returns the polychoric correlation
|
138
|
-
|
139
|
-
if @r.nil?
|
140
|
-
compute
|
141
|
-
end
|
142
|
-
@r
|
143
|
-
end
|
139
|
+
attr_reader :r
|
144
140
|
# Returns the rows thresholds
|
141
|
+
attr_reader :alpha
|
142
|
+
# Returns the columns thresholds
|
143
|
+
attr_reader :beta
|
145
144
|
|
146
|
-
|
147
|
-
if @alpha.nil?
|
148
|
-
compute
|
149
|
-
end
|
150
|
-
@alpha
|
151
|
-
end
|
152
|
-
# Returns the column thresholds
|
145
|
+
promise_after :compute, :r, :alpha, :beta
|
153
146
|
|
154
|
-
|
155
|
-
|
156
|
-
compute
|
157
|
-
end
|
158
|
-
@beta
|
159
|
-
end
|
147
|
+
alias :threshold_x :alpha
|
148
|
+
alias :threshold_y :beta
|
160
149
|
|
161
150
|
|
162
151
|
# Start the computation of polychoric correlation
|
@@ -739,22 +728,20 @@ module Statsample
|
|
739
728
|
end
|
740
729
|
|
741
730
|
def summary
|
742
|
-
rp=ReportBuilder.new()
|
743
|
-
rp.add(self)
|
744
|
-
rp.to_text
|
731
|
+
rp=ReportBuilder.new(:no_title=>true).add(self).to_text
|
745
732
|
end
|
733
|
+
|
746
734
|
|
747
735
|
def report_building(generator) # :nodoc:
|
748
|
-
compute if
|
736
|
+
#compute if r.nil?
|
749
737
|
section=ReportBuilder::Section.new(:name=>@name)
|
750
|
-
t=ReportBuilder::Table.new(:name=>_("Contingence Table")
|
738
|
+
t=ReportBuilder::Table.new(:name=>_("Contingence Table"), :header=>[""]+(@n.times.collect {|i| "Y=#{i}"})+["Total"])
|
751
739
|
@m.times do |i|
|
752
740
|
t.row(["X = #{i}"]+(@n.times.collect {|j| @matrix[i,j]}) + [@sumr[i]])
|
753
741
|
end
|
754
742
|
t.hr
|
755
743
|
t.row(["T"]+(@n.times.collect {|j| @sumc[j]})+[@total])
|
756
744
|
section.add(t)
|
757
|
-
#generator.parse_element(t)
|
758
745
|
section.add(sprintf("r: %0.4f",r))
|
759
746
|
t=ReportBuilder::Table.new(:name=>_("Thresholds"), :header=>["","Value"])
|
760
747
|
threshold_x.each_with_index {|val,i|
|
@@ -114,9 +114,7 @@ module Statsample
|
|
114
114
|
end
|
115
115
|
# Summary of the analysis
|
116
116
|
def summary
|
117
|
-
|
118
|
-
rp.add(self)
|
119
|
-
rp.to_text
|
117
|
+
ReportBuilder.new(:name=>@name).add(self).to_text
|
120
118
|
end
|
121
119
|
|
122
120
|
def report_building(generator) # :nodoc:
|
@@ -1,21 +1,20 @@
|
|
1
|
-
|
2
|
-
require 'fastercsv'
|
3
|
-
Statsample::CSV_klass=FasterCSV
|
4
|
-
else
|
5
|
-
require 'csv'
|
6
|
-
Statsample::CSV_klass=CSV
|
7
|
-
|
8
|
-
end
|
1
|
+
|
9
2
|
|
10
3
|
module Statsample
|
11
4
|
class CSV < SpreadsheetBase
|
5
|
+
if RUBY_VERSION<"1.9"
|
6
|
+
require 'fastercsv'
|
7
|
+
CSV_klass=::FasterCSV
|
8
|
+
else
|
9
|
+
require 'csv'
|
10
|
+
CSV_klass=::CSV
|
11
|
+
end
|
12
12
|
class << self
|
13
13
|
# Returns a Dataset based on a csv file
|
14
14
|
#
|
15
15
|
# USE:
|
16
16
|
# ds=Statsample::CSV.read("test_csv.csv")
|
17
|
-
def read(filename, empty=[''],ignore_lines=0,fs=nil,rs=nil)
|
18
|
-
|
17
|
+
def read(filename, empty=[''],ignore_lines=0,fs=nil,rs=nil)
|
19
18
|
first_row=true
|
20
19
|
fields=[]
|
21
20
|
fields_data={}
|
@@ -24,7 +23,7 @@ module Statsample
|
|
24
23
|
opts={}
|
25
24
|
opts[:col_sep]=fs unless fs.nil?
|
26
25
|
opts[:row_sep]=rs unless rs.nil?
|
27
|
-
csv=
|
26
|
+
csv=CSV_klass.open(filename,'r',opts)
|
28
27
|
csv.each do |row|
|
29
28
|
line_number+=1
|
30
29
|
if(line_number<=ignore_lines)
|
@@ -51,7 +50,7 @@ module Statsample
|
|
51
50
|
# Statsample::CSV.write(ds,"test_csv.csv")
|
52
51
|
def write(dataset,filename, convert_comma=false,*opts)
|
53
52
|
|
54
|
-
writer=
|
53
|
+
writer=CSV_klass.open(filename,'w',*opts)
|
55
54
|
writer << dataset.fields
|
56
55
|
dataset.each_array do|row|
|
57
56
|
if(convert_comma)
|
@@ -171,10 +171,9 @@ module Statsample
|
|
171
171
|
end
|
172
172
|
# Summary of analysis
|
173
173
|
def summary
|
174
|
-
rp=ReportBuilder.new()
|
175
|
-
rp.add(self)
|
176
|
-
rp.to_text
|
174
|
+
rp=ReportBuilder.new().add(self).to_text
|
177
175
|
end
|
176
|
+
|
178
177
|
def t
|
179
178
|
Distribution::T.p_value(1-((1-@alpha) / 2), @n_samples - 1)
|
180
179
|
end
|
@@ -18,13 +18,14 @@ module Factor
|
|
18
18
|
class Rotation
|
19
19
|
EPSILON=1e-15
|
20
20
|
MAX_ITERATIONS=25
|
21
|
-
|
21
|
+
extend Statsample::PromiseAfter
|
22
22
|
attr_reader :iterations, :rotated, :component_transformation_matrix, :h2
|
23
23
|
# Maximum number of iterations
|
24
24
|
attr_accessor :max_iterations
|
25
25
|
# Maximum precision
|
26
26
|
attr_accessor :epsilon
|
27
27
|
|
28
|
+
promise_after :iterate, :iterations, :rotated, :component_transformation_matrix, :h2
|
28
29
|
|
29
30
|
def initialize(matrix, opts=Hash.new)
|
30
31
|
@matrix=matrix
|
@@ -33,19 +34,16 @@ module Factor
|
|
33
34
|
@component_transformation_matrix=nil
|
34
35
|
@max_iterations=MAX_ITERATIONS
|
35
36
|
@epsilon=EPSILON
|
37
|
+
@rotated=nil
|
36
38
|
@h2=(@matrix.collect {|c| c**2} * Matrix.column_vector([1]*@m)).column(0).to_a
|
37
39
|
opts.each{|k,v|
|
38
40
|
self.send("#{k}=",v) if self.respond_to? k
|
39
41
|
}
|
40
|
-
|
41
|
-
|
42
42
|
end
|
43
43
|
alias_method :communalities, :h2
|
44
44
|
alias_method :rotated_component_matrix, :rotated
|
45
|
-
# Start iteration
|
46
|
-
def iterate
|
47
|
-
max_i||=@max_iterations
|
48
|
-
@max_iterations=max_i
|
45
|
+
# Start iteration
|
46
|
+
def iterate
|
49
47
|
t=Matrix.identity(@m)
|
50
48
|
b=@matrix.dup
|
51
49
|
h=Matrix.diagonal(*@h2).collect {|c| Math::sqrt(c)}
|
@@ -54,7 +52,7 @@ module Factor
|
|
54
52
|
@not_converged=true
|
55
53
|
@iterations=0
|
56
54
|
while @not_converged
|
57
|
-
break if iterations
|
55
|
+
break if iterations>@max_iterations
|
58
56
|
@iterations+=1
|
59
57
|
#puts "Iteration #{iterations}"
|
60
58
|
num_pairs=@m*(@m-1).quo(2)
|