statsample 0.11.1 → 0.11.2

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
-
2
- YH��P���&�D�ֆ=T����z���p��?^u)�~�)�
1
+ ��2�>Pfrg�*}�1���=�1�B�xQ*2���m��yН�:�qW3W�n�/��y�K��Ub)�4�KU�ާ>�B2�q����K�|Z�=V8؎� ��ݕҕ⹳:<�� R�K��
2
+ �VW��}�5j�}�i������$�RR�U�����^c�B�Ҽ�^h��>*���������@�����QhR��Τ�v��[��W3�\���]{!��\P��J��M�D�,�Hq-��b��%g�{U5
data/History.txt CHANGED
@@ -1,3 +1,6 @@
1
+ === 0.11.2 / 2010-05-05
2
+ * Updated dependency for 'extendedmatrix' to 0.2 (Matrix#build method)
3
+
1
4
  === 0.11.1 / 2010-05-04
2
5
  * Removed Matrix almost all Matrix extensions and replaced by dependency on 'extendmatrix' gem
3
6
  * Added dependency to gsl >=1.12.109. Polychoric with joint method fails without this explicit dependency
data/Rakefile CHANGED
@@ -18,7 +18,9 @@ task :lint do
18
18
  }
19
19
  end
20
20
 
21
-
21
+ task :release do
22
+ system %{git push origin master}
23
+ end
22
24
  desc "Update pot/po files."
23
25
  task :updatepo do
24
26
  require 'gettext/tools'
@@ -37,7 +39,7 @@ h=Hoe.spec('statsample') do
37
39
  #self.testlib=:minitest
38
40
  self.rubyforge_name = "ruby-statsample"
39
41
  self.developer('Claudio Bustos', 'clbustos@gmail.com')
40
- self.extra_deps << ["spreadsheet","~>0.6.0"] << ["svg-graph", "~>1.0"] << ["reportbuilder", "~>1.0"] << ["minimization", "~>0.2.0"] << ["fastercsv"] << ["dirty-memoize", "~>0.0"] << ["statistics2", "~>0.54"] << ["extendmatrix","~>0.1"] << ["gsl", "~>1.12.109"]
42
+ self.extra_deps << ["spreadsheet","~>0.6.0"] << ["svg-graph", "~>1.0"] << ["reportbuilder", "~>1.0"] << ["minimization", "~>0.2.0"] << ["fastercsv"] << ["dirty-memoize", "~>0.0"] << ["statistics2", "~>0.54"] << ["extendmatrix","~>0.2.0"] << ["gsl", "~>1.12.109"]
41
43
  self.clean_globs << "test/images/*" << "demo/item_analysis/*" << "demo/Regression"
42
44
  self.need_rdoc=false
43
45
  end
data/lib/statsample.rb CHANGED
@@ -111,7 +111,7 @@ module Statsample
111
111
  false
112
112
  end
113
113
  end
114
- VERSION = '0.11.1'
114
+ VERSION = '0.11.2'
115
115
  SPLIT_TOKEN = ","
116
116
  autoload(:Database, 'statsample/converters')
117
117
  autoload(:Anova, 'statsample/anova')
@@ -34,20 +34,23 @@ module Factor
34
34
  # Number of factors. Set by default to the number of factors
35
35
  # with eigen values > 1
36
36
  attr_accessor :m
37
+ # Use GSL if available
38
+ attr_accessor :use_gsl
37
39
  include GetText
38
40
  bindtextdomain("statsample")
39
41
 
40
42
  def initialize(matrix ,opts=Hash.new)
41
- if matrix.respond_to? :to_gsl
42
- matrix=matrix.to_gsl
43
- end
43
+ @use_gsl=nil
44
44
  @name=_("Principal Component Analysis")
45
45
  @matrix=matrix
46
- @n_variables=@matrix.size1
46
+ @n_variables=@matrix.column_size
47
47
  @m=nil
48
48
  opts.each{|k,v|
49
49
  self.send("#{k}=",v) if self.respond_to? k
50
50
  }
51
+ if @use_gsl.nil?
52
+ @use_gsl=Statsample.has_gsl?
53
+ end
51
54
  calculate_eigenpairs
52
55
  if @m.nil?
53
56
  # Set number of factors with eigenvalues > 1
@@ -67,9 +70,9 @@ module Factor
67
70
  # Feature vector for m factors
68
71
  def feature_vector(m=nil)
69
72
  m||=@m
70
- omega_m=GSL::Matrix.zeros(@n_variables, m)
73
+ omega_m=::Matrix.build(@n_variables, m) {0}
71
74
  m.times do |i|
72
- omega_m.set_col(i, @eigenpairs[i][1])
75
+ omega_m.column= i, @eigenpairs[i][1]
73
76
  end
74
77
  omega_m
75
78
  end
@@ -84,13 +87,13 @@ module Factor
84
87
  def component_matrix(m=nil)
85
88
  m||=@m
86
89
  raise "m should be > 0" if m<1
87
- omega_m=GSL::Matrix.zeros(@n_variables, m)
90
+ omega_m=::Matrix.build(@n_variables, m) {0}
88
91
  gammas=[]
89
92
  m.times {|i|
90
- omega_m.set_col(i, @eigenpairs[i][1])
93
+ omega_m.column=i, @eigenpairs[i][1]
91
94
  gammas.push(Math::sqrt(@eigenpairs[i][0]))
92
95
  }
93
- gamma_m=GSL::Matrix.diagonal(gammas)
96
+ gamma_m=::Matrix.diagonal(*gammas)
94
97
  (omega_m*(gamma_m)).to_matrix
95
98
  end
96
99
  # Communalities for all variables given m factors
@@ -112,13 +115,30 @@ module Factor
112
115
  end
113
116
 
114
117
  def calculate_eigenpairs
115
- eigval, eigvec= GSL::Eigen.symmv(@matrix)
118
+ if @use_gsl
119
+ calculate_eigenpairs_gsl
120
+ else
121
+ calculate_eigenpairs_ruby
122
+ end
123
+ end
124
+
125
+ def calculate_eigenpairs_ruby
126
+ eigval, eigvec= @matrix.eigenvaluesJacobi, @matrix.cJacobiV
116
127
  @eigenpairs={}
117
- eigval.each_index {|i|
118
- @eigenpairs[eigval[i]]=eigvec.get_col(i)
128
+ eigval.to_a.each_index {|i|
129
+ @eigenpairs[eigval[i]]=eigvec.column(i)
119
130
  }
120
131
  @eigenpairs=@eigenpairs.sort.reverse
121
132
  end
133
+ def calculate_eigenpairs_gsl
134
+ eigval, eigvec= GSL::Eigen.symmv(@matrix.to_gsl)
135
+ @eigenpairs={}
136
+ eigval.each_index {|i|
137
+ @eigenpairs[eigval[i]]=eigvec.get_col(i)
138
+ }
139
+ @eigenpairs=@eigenpairs.sort.reverse
140
+ end
141
+
122
142
  def summary
123
143
  ReportBuilder.new(:no_title=>true).add(self).to_text
124
144
  end
@@ -2,6 +2,10 @@ require 'extendmatrix'
2
2
 
3
3
 
4
4
  class ::Matrix
5
+ def to_matrix
6
+ self
7
+ end
8
+
5
9
  def to_gsl
6
10
  out=[]
7
11
  self.row_size.times{|i|
@@ -13,6 +17,9 @@ end
13
17
 
14
18
  module GSL
15
19
  class Matrix
20
+ def to_gsl
21
+ self
22
+ end
16
23
  def to_matrix
17
24
  rows=self.size1
18
25
  cols=self.size2
data/test/test_factor.rb CHANGED
@@ -3,15 +3,22 @@ require(File.dirname(__FILE__)+'/helpers_tests.rb')
3
3
  class StatsampleFactorTestCase < MiniTest::Unit::TestCase
4
4
  # Tested with SPSS and R
5
5
  def test_pca
6
- if Statsample.has_gsl?
7
- require 'gsl'
8
6
  a=[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2.0, 1.0, 1.5, 1.1].to_scale
9
7
  b=[2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9].to_scale
10
8
  a.recode! {|c| c-a.mean}
11
9
  b.recode! {|c| c-b.mean}
12
10
  ds={'a'=>a,'b'=>b}.to_dataset
13
11
  cov_matrix=Statsample::Bivariate.covariance_matrix(ds)
14
- pca=Statsample::Factor::PCA.new(cov_matrix)
12
+ if Statsample.has_gsl?
13
+ pca=Statsample::Factor::PCA.new(cov_matrix,:use_gsl=>true)
14
+ pca_set(pca)
15
+ else
16
+ skip("Eigenvalues could be calculated with GSL (requires gsl)")
17
+ end
18
+ pca=Statsample::Factor::PCA.new(cov_matrix,:use_gsl=>false)
19
+ pca_set(pca)
20
+ end
21
+ def pca_set(pca)
15
22
  expected_eigenvalues=[1.284, 0.0490]
16
23
  expected_eigenvalues.each_with_index{|ev,i|
17
24
  assert_in_delta(ev,pca.eigenvalues[i],0.001)
@@ -21,31 +28,25 @@ class StatsampleFactorTestCase < MiniTest::Unit::TestCase
21
28
  assert_in_delta(ev,pca.communalities[i],0.001)
22
29
  }
23
30
  expected_cm=[0.768, 0.833]
24
-
25
31
  obs=pca.component_matrix(1).column(0).to_a
26
32
  expected_cm.each_with_index{|ev,i|
27
33
  assert_in_delta(ev,obs[i],0.001)
28
34
  }
29
35
 
30
- expected_fm_1=GSL::Matrix[[0.677], [0.735]]
31
- expected_fm_2=GSL::Matrix[[0.677,0.735], [0.735, -0.677]]
36
+ expected_fm_1=::Matrix[[0.677], [0.735]]
37
+ expected_fm_2=::Matrix[[0.677,0.735], [0.735, -0.677]]
32
38
  _test_matrix(expected_fm_1,pca.feature_vector(1))
33
39
  _test_matrix(expected_fm_2,pca.feature_vector(2))
34
40
  assert(pca.summary)
35
- else
36
- skip "PCA not tested. Requires GSL"
37
- end
38
41
  end
39
42
 
40
43
  # Tested with R
41
44
  def test_principalaxis
42
- if Statsample.has_gsl?
43
- require 'gsl'
44
- matrix=Matrix[
45
+ matrix=::Matrix[
45
46
  [1.0, 0.709501601093587, 0.877596585880047, 0.272219316266807], [0.709501601093587, 1.0, 0.291633797330304, 0.871141831433844], [0.877596585880047, 0.291633797330304, 1.0, -0.213373722977167], [0.272219316266807, 0.871141831433844, -0.213373722977167, 1.0]]
46
47
  fa=Statsample::Factor::PrincipalAxis.new(matrix,:m=>1)
47
48
 
48
- cm=Matrix[[0.923],[0.912],[0.507],[0.483]].to_gsl
49
+ cm=::Matrix[[0.923],[0.912],[0.507],[0.483]]
49
50
 
50
51
  _test_matrix(cm,fa.component_matrix)
51
52
 
@@ -59,42 +60,32 @@ class StatsampleFactorTestCase < MiniTest::Unit::TestCase
59
60
  fa=Statsample::Factor::PrincipalAxis.new(matrix,:smc=>false)
60
61
  assert_raise RuntimeError do
61
62
  fa.iterate
62
-
63
63
  end
64
+ assert(fa.summary.size>0)
64
65
 
65
-
66
-
67
- assert(fa.summary)
68
-
69
- else
70
- skip "Principal Axis not tested. Requires GSL"
71
- end
72
66
  end
73
67
 
74
68
 
75
69
  def test_rotation_varimax
76
- if Statsample.has_gsl?
77
- a = Matrix[ [ 0.4320, 0.8129, 0.3872] ,
78
- [0.7950, -0.5416, 0.2565] ,
79
- [0.5944, 0.7234, -0.3441],
80
- [0.8945, -0.3921, -0.1863] ]
70
+ a = Matrix[ [ 0.4320, 0.8129, 0.3872] ,
71
+ [0.7950, -0.5416, 0.2565] ,
72
+ [0.5944, 0.7234, -0.3441],
73
+ [0.8945, -0.3921, -0.1863] ]
81
74
 
82
- expected= Matrix[[-0.0204423, 0.938674, -0.340334],
83
- [0.983662, 0.0730206, 0.134997],
84
- [0.0826106, 0.435975, -0.893379],
85
- [0.939901, -0.0965213, -0.309596]].to_gsl
86
- varimax=Statsample::Factor::Varimax.new(a)
87
- assert(!varimax.rotated.nil?, "Rotated shouldn't be empty")
88
- assert(!varimax.component_transformation_matrix.nil?, "Component matrix shouldn't be empty")
89
- assert(!varimax.h2.nil?,"H2 shouldn't be empty")
90
- _test_matrix(expected,varimax.rotated)
91
- else
92
- skip "Rotation not tested. Requires GSL"
93
- end
75
+ expected= Matrix[[-0.0204423, 0.938674, -0.340334],
76
+ [0.983662, 0.0730206, 0.134997],
77
+ [0.0826106, 0.435975, -0.893379],
78
+ [0.939901, -0.0965213, -0.309596]]
79
+ varimax=Statsample::Factor::Varimax.new(a)
80
+ assert(!varimax.rotated.nil?, "Rotated shouldn't be empty")
81
+ assert(!varimax.component_transformation_matrix.nil?, "Component matrix shouldn't be empty")
82
+ assert(!varimax.h2.nil?, "H2 shouldn't be empty")
83
+
84
+ _test_matrix(expected,varimax.rotated)
94
85
  end
95
86
  def _test_matrix(a,b)
96
- a.size1.times {|i|
97
- a.size2.times {|j|
87
+ a.row_size.times {|i|
88
+ a.column_size.times {|j|
98
89
  assert_in_delta(a[i,j], b[i,j],0.001)
99
90
  }
100
91
  }
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 11
8
- - 1
9
- version: 0.11.1
8
+ - 2
9
+ version: 0.11.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Claudio Bustos
@@ -35,7 +35,7 @@ cert_chain:
35
35
  rpP0jjs0
36
36
  -----END CERTIFICATE-----
37
37
 
38
- date: 2010-05-04 00:00:00 -04:00
38
+ date: 2010-05-05 00:00:00 -04:00
39
39
  default_executable:
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
@@ -139,8 +139,9 @@ dependencies:
139
139
  - !ruby/object:Gem::Version
140
140
  segments:
141
141
  - 0
142
- - 1
143
- version: "0.1"
142
+ - 2
143
+ - 0
144
+ version: 0.2.0
144
145
  type: :runtime
145
146
  version_requirements: *id008
146
147
  - !ruby/object:Gem::Dependency
metadata.gz.sig CHANGED
Binary file