statsample-ekatena 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
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,40 @@
1
+ #!/usr/bin/ruby
2
+ $:.unshift(File.dirname(__FILE__)+'/../lib/')
3
+
4
+ # == Description
5
+ #
6
+ # This example will explain how a parallel analysis can be performed on a PCA.
7
+ # Parallel Analysis helps in determining how many components are to be retained
8
+ # from the PCA.
9
+ require 'statsample'
10
+ samples=150
11
+ variables=30
12
+ iterations=50
13
+ Statsample::Analysis.store(Statsample::Factor::ParallelAnalysis) do
14
+
15
+ rng = Distribution::Normal.rng()
16
+ f1 = rnorm(samples)
17
+ f2 = rnorm(samples)
18
+ f3 = rnorm(samples)
19
+
20
+ vectors={}
21
+
22
+ variables.times do |i|
23
+ vectors["v#{i}".to_sym] = Daru::Vector.new(samples.times.collect {|nv| f1[nv]*i+(f2[nv]*(15-i))+((f3[nv]*(30-i))*1.5)*rng.call})
24
+ vectors["v#{i}".to_sym].rename "Vector #{i}"
25
+ end
26
+
27
+ ds = Daru::DataFrame.new(vectors)
28
+
29
+ pa=Statsample::Factor::ParallelAnalysis.new(ds, :iterations=>iterations, :debug=>true)
30
+ pca=pca(cor(ds))
31
+ echo "There are 3 real factors on data"
32
+ summary pca
33
+ echo "Traditional Kaiser criterion (k>1) returns #{pca.m} factors"
34
+ summary pa
35
+ echo "Parallel Analysis returns #{pa.number_of_factors} factors to preserve"
36
+ end
37
+
38
+ if __FILE__==$0
39
+ Statsample::Analysis.run_batch
40
+ end
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/ruby
2
+ $:.unshift(File.dirname(__FILE__)+'/../lib/')
3
+
4
+ # == Description
5
+ # Polychoric Correlation using two-step and joint method
6
+ #
7
+ # Polychoric correlation in statsample requires installation of
8
+ # the [statsample-bivariate-extension](https://rubygems.org/gems/statsample-bivariate-extension)
9
+ # gem. This gem extends the Statsample::Bivariate class with useful
10
+ # algorithms for polychoric and tetrachoric correlation.
11
+ #
12
+ # Statsample will automatically detect presence of polychoric/tetrachoric
13
+ # algorithms so there is no need to explicitly require the gem.
14
+ #
15
+ # In this example we'll see how polychoric correlation can be
16
+ # performed using statsample.
17
+ require 'statsample'
18
+ Statsample::Analysis.store(Statsample::Bivariate::Polychoric) do
19
+ ct=Matrix[[rand(10)+50, rand(10)+50, rand(10)+1],
20
+ [rand(20)+5, rand(50)+4, rand(10)+1],
21
+ [rand(8)+1, rand(12)+1, rand(10)+1]]
22
+
23
+ # Estimation of polychoric correlation using two-step (default)
24
+ poly=polychoric(ct, :name=>"Polychoric with two-step", :debug=>false)
25
+ summary poly
26
+
27
+ # Estimation of polychoric correlation using joint method (slow)
28
+ poly=polychoric(ct, :method=>:joint, :name=>"Polychoric with joint")
29
+ summary poly
30
+
31
+ # Uses polychoric series (not recomended)
32
+
33
+ poly=polychoric(ct, :method=>:polychoric_series, :name=>"Polychoric with polychoric series")
34
+ summary poly
35
+ end
36
+
37
+ if __FILE__==$0
38
+ Statsample::Analysis.run_batch
39
+ end
40
+
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/ruby
2
+ $:.unshift(File.dirname(__FILE__)+'/../lib/')
3
+ # Principal Axis Analysis¶
4
+ #
5
+ # Here we use the Statsample::Factor::PrincipalAnalysis class
6
+ # for principal axis analysis for a correlation or covariance matrix.
7
+ require 'statsample'
8
+
9
+ Statsample::Analysis.store(Statsample::Factor::PrincipalAxis) do
10
+
11
+ matrix=Matrix[
12
+ [1.0, 0.709501601093587, 0.877596585880047, 0.272219316266807],
13
+ [0.709501601093587, 1.0, 0.291633797330304, 0.871141831433844],
14
+ [0.877596585880047, 0.291633797330304, 1.0, -0.213373722977167],
15
+ [0.272219316266807, 0.871141831433844, -0.213373722977167, 1.0]]
16
+
17
+ matrix.extend Statsample::CovariateMatrix
18
+ fa=principal_axis(matrix,:m=>1,:smc=>false)
19
+
20
+ summary fa
21
+ end
22
+
23
+ if __FILE__==$0
24
+ Statsample::Analysis.run_batch
25
+ end
26
+
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/ruby
2
+ $:.unshift(File.dirname(__FILE__)+'/../lib')
3
+
4
+ # == Description
5
+ #
6
+ # Reliability Scale Analysis with statsample
7
+ require 'statsample'
8
+ Statsample::Analysis.store(Statsample::Reliability) do
9
+ samples=100
10
+ a=rnorm(samples)
11
+
12
+ ds = Daru::DataFrame.new({})
13
+
14
+ 20.times do |i|
15
+ ds["v#{i}".to_sym]= a + rnorm(samples,0,0.2)
16
+ end
17
+
18
+ rel=Statsample::Reliability::ScaleAnalysis.new(ds)
19
+ summary rel
20
+
21
+ ms=Statsample::Reliability::MultiScaleAnalysis.new(:name=>"Multi Scale analyss") do |m|
22
+ m.scale "Scale 1", ds.clone([:v1, :v2, :v3, :v4, :v5, :v6, :v7, :v8, :v9, :v10])
23
+ m.scale "Scale 2", ds.clone([:v11, :v12, :v13, :v14, :v15, :v16, :v17, :v18, :v19])
24
+ end
25
+
26
+ summary ms
27
+ end
28
+
29
+ if __FILE__==$0
30
+ Statsample::Analysis.run_batch
31
+ end
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/ruby
2
+ $:.unshift(File.dirname(__FILE__)+'/../lib/')
3
+ $:.unshift('/home/cdx/dev/reportbuilder/lib/')
4
+
5
+ # == Description
6
+ #
7
+ # Creating a scatterplot with statsample's Statsample::Graph::Scatterplot class.
8
+ #
9
+ # In this example we'll demonstrate how a normally distributed Daru::Vector can
10
+ # be created using the daru and distribution gems, and how the values generated
11
+ # can be plotted very easily using the 'scatterplot' shorthand and supplying X
12
+ # and Y co-ordinates.
13
+ require 'benchmark'
14
+ require 'statsample'
15
+ n=100
16
+
17
+ Statsample::Analysis.store(Statsample::Graph::Scatterplot) do
18
+ x=rnorm(n)
19
+ y=x+rnorm(n,0.5,0.2)
20
+ scatterplot(x,y)
21
+ end
22
+
23
+ if __FILE__==$0
24
+ Statsample::Analysis.run
25
+ end
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/ruby
2
+ $:.unshift(File.dirname(__FILE__)+'/../lib')
3
+ # == Description
4
+ #
5
+ # This example illustrates how a T test can be done and summarized with statsample
6
+ #
7
+ # == References
8
+ #
9
+ # http://en.wikipedia.org/wiki/Student%27s_t-test
10
+ require 'statsample'
11
+
12
+ Statsample::Analysis.store(Statsample::Test::T) do
13
+
14
+
15
+ a=rnorm(10)
16
+ t_1=Statsample::Test.t_one_sample(a,{:u=>50})
17
+ summary t_1
18
+
19
+ b=rnorm(10,2)
20
+
21
+ t_2=Statsample::Test.t_two_samples_independent(a,b)
22
+ summary t_2
23
+ end
24
+
25
+ if __FILE__==$0
26
+ Statsample::Analysis.run_batch
27
+ end
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/ruby
2
+ $:.unshift(File.dirname(__FILE__)+'/../lib/')
3
+
4
+ require 'statsample'
5
+
6
+ Statsample::Analysis.store(Statsample::Bivariate::Tetrachoric) do
7
+
8
+ a=40
9
+ b=10
10
+ c=20
11
+ d=30
12
+ summary tetrachoric(a,b,c,d)
13
+ end
14
+
15
+ if __FILE__==$0
16
+ Statsample::Analysis.run_batch
17
+ end
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/ruby
2
+ $:.unshift(File.dirname(__FILE__)+'/../lib')
3
+
4
+ # == Description
5
+ #
6
+ # Example illustrating Mann-Whitney U test with statsample.
7
+ #
8
+ # == References
9
+ #
10
+ # http://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test
11
+ require 'statsample'
12
+
13
+ Statsample::Analysis.store(Statsample::Test::UMannWhitney) do
14
+
15
+ a = Daru::Vector.new(10.times.map {rand(100)})
16
+ b = Daru::Vector.new(20.times.map {(rand(20))**2+50})
17
+
18
+ u=Statsample::Test::UMannWhitney.new(a,b)
19
+ summary u
20
+ end
21
+
22
+ if __FILE__==$0
23
+ Statsample::Analysis.run_batch
24
+ end
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/ruby
2
+ $:.unshift(File.dirname(__FILE__)+'/../lib/')
3
+ # == Description
4
+ #
5
+ # This example provides a small sneak-peak into creating a Daru::Vector.
6
+ # For details on using Daru::Vector (with example on math, statistics and plotting)
7
+ # see the notebook at this link:
8
+ # http://nbviewer.ipython.org/github/SciRuby/sciruby-notebooks/blob/master/Data%20Analysis/Usage%20of%20Vector.ipynb
9
+ require 'statsample'
10
+
11
+ Statsample::Analysis.store(Daru::Vector) do
12
+ a = Daru::Vector.new_with_size(1000) {r=rand(5); r==4 ? nil: r;}
13
+ summary a
14
+ b = Daru::Vector[1,2,3,4,6..10]
15
+ summary b
16
+ end
17
+
18
+ if __FILE__==$0
19
+ Statsample::Analysis.run_batch
20
+ end
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/ruby
2
+ $:.unshift(File.dirname(__FILE__)+'/../lib/')
3
+ # == Description
4
+ #
5
+ # Velicer MAP test.
6
+
7
+ require 'statsample'
8
+
9
+ Statsample::Analysis.store(Statsample::Factor::MAP) do
10
+
11
+ rng=Distribution::Normal.rng
12
+ samples=100
13
+ variables=10
14
+
15
+ f1=rnorm(samples)
16
+ f2=rnorm(samples)
17
+
18
+ vectors={}
19
+
20
+ variables.times do |i|
21
+ vectors["v#{i}".to_sym]= Daru::Vector.new(
22
+ samples.times.collect do |nv|
23
+ if i<5
24
+ f1[nv]*5 + f2[nv] *2 +rng.call
25
+ else
26
+ f1[nv]*2 + f2[nv] *3 +rng.call
27
+ end
28
+ end)
29
+ end
30
+
31
+
32
+ ds = Daru::DataFrame.new(vectors)
33
+ cor=cor(ds)
34
+ pca=pca(cor)
35
+
36
+ map=Statsample::Factor::MAP.new(cor)
37
+
38
+ echo ("There are 2 real factors on data")
39
+ summary(pca)
40
+ echo("Traditional Kaiser criterion (k>1) returns #{pca.m} factors")
41
+ summary(map)
42
+ echo("Velicer's MAP Test returns #{map.number_of_factors} factors to preserve")
43
+ end
44
+ if __FILE__==$0
45
+ Statsample::Analysis.run_batch
46
+ end
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby1.9
2
+ require 'reportbuilder'
3
+ refs=[]
4
+ Dir.glob "**/*.rb" do |f|
5
+ next if f=~/pkg/
6
+ reference=false
7
+ File.open(f).each_line do |l|
8
+
9
+ if l=~/== Reference/
10
+ reference=true
11
+ elsif reference
12
+ if l=~/\*\s+(.+)/
13
+ refs.push $1
14
+ else
15
+ reference=false
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+
22
+
23
+ rb=ReportBuilder.new(:name=>"References") do |g|
24
+ refs.uniq.sort.each do |r|
25
+ g.text "* #{r}"
26
+ end
27
+ end
28
+
29
+ rb.save_text("references.txt")
@@ -0,0 +1,134 @@
1
+ # = spss.rb -
2
+ #
3
+ # Provides utilites for working with spss files
4
+ #
5
+ # Copyright (C) 2009 Claudio Bustos
6
+ #
7
+ # Claudio Bustos mailto:clbustos@gmail.com
8
+
9
+ module SPSS # :nodoc: all
10
+ module Dictionary
11
+ class Element
12
+ def add(a)
13
+ @elements.push(a)
14
+ end
15
+
16
+ def parse_elements(func = :to_s)
17
+ @elements.collect{ |e| " "+e.send(func) }.join("\n")
18
+ end
19
+
20
+ def init_with config
21
+ config.each do |key, value|
22
+ self.send(key.to_s + "=", value) if methods.include? key.to_s
23
+ end
24
+ end
25
+
26
+ def initialize(config = {})
27
+ @config = config
28
+ @elements = []
29
+ end
30
+ end
31
+ class Dictionary < Element
32
+ attr_accessor :locale, :date_time, :row_count
33
+ def initialize(config = {})
34
+ super
35
+ init_with ({
36
+ :locale=>"en_US",
37
+ :date_time=>Time.new().strftime("%Y-%m-%dT%H:%M:%S"),
38
+ :row_count=>1
39
+ })
40
+ init_with config
41
+ end
42
+
43
+ def to_xml
44
+ "<dictionary locale='#{@locale}' creationDateTime='#{@date_time}' rowCount='#{@row_count}' xmlns='http://xml.spss.com/spss/data'>\n"+parse_elements(:to_xml)+"\n</dictionary>"
45
+
46
+ end
47
+ def to_spss
48
+ parse_elements(:to_spss)
49
+ end
50
+ end
51
+
52
+ class MissingValue < Element
53
+ attr_accessor :data, :type, :from, :to
54
+ def initialize(data,type=nil)
55
+ @data=data
56
+ if type.nil? or type=="lowerBound" or type=="upperBound"
57
+ @type=type
58
+ else
59
+ raise Exception,"Incorrect value for type"
60
+ end
61
+ end
62
+ def to_xml
63
+ "<missingValue data='#{@data}' "+(type.nil? ? "":"type='#{type}'")+"/>"
64
+ end
65
+ end
66
+ class LabelSet
67
+ attr_accessor
68
+ def initialize(labels)
69
+ @labels=labels
70
+ end
71
+ def parse_xml(name)
72
+ "<valueLabelSet>\n "+@labels.collect{|key,value| "<valueLabel label='#{key}' value='#{value}' />"}.join("\n ")+"\n <valueLabelVariable name='#{name}' />\n</valueLabelSet>"
73
+ end
74
+ def parse_spss()
75
+ @labels.collect{|key,value| "#{key} '#{value}'"}.join("\n ")
76
+ end
77
+ end
78
+ class Variable < Element
79
+ attr_accessor :aligment, :display_width, :label, :measurement_level, :name, :type, :decimals, :width, :type_format, :labelset, :missing_values
80
+ def initialize(config={})
81
+ super
82
+ @@var_number||=1
83
+ init_with({
84
+ :aligment => "left",
85
+ :display_width => 8,
86
+ :label => "Variable #{@@var_number}",
87
+ :measurement_level => "SCALE",
88
+ :name => "var#{@@var_number}",
89
+ :type => 0,
90
+ :decimals => 2,
91
+ :width => 10,
92
+ :type_format => "F",
93
+ :labelset => nil
94
+ })
95
+ init_with config
96
+ @missing_values=[]
97
+ @@var_number+=1
98
+ end
99
+ def to_xml
100
+ labelset_s=(@labelset.nil?) ? "":"\n"+@labelset.parse_xml(@name)
101
+ missing_values=(@missing_values.size>0) ? @missing_values.collect {|m| m.to_xml}.join("\n"):""
102
+ "<variable aligment='#{@aligment}' displayWidth='#{@display_width}' label='#{@label}' measurementLevel='#{@measurement_level}' name='#{@name}' type='#{@type}'>\n<variableFormat decimals='#{@decimals}' width='#{@width}' type='#{@type_format}' />\n"+parse_elements(:to_xml)+missing_values+"</variable>"+labelset_s
103
+ end
104
+ def to_spss
105
+ out=<<HERE
106
+ VARIABLE LABELS #{@name} '#{label}' .
107
+ VARIABLE ALIGMENT #{@name} (#{@aligment.upcase}) .
108
+ VARIABLE WIDTH #{@name} (#{@display_width}) .
109
+ VARIABLE LEVEL #{@name} (#{@measurement_level.upcase}) .
110
+ HERE
111
+ if !@labelset.nil?
112
+ out << "VALUE LABELS #{@name} "+labelset.parse_spss()+" ."
113
+ end
114
+ if @missing_values.size>0
115
+ out << "MISSING VALUES #{@name} ("+@missing_values.collect{|m| m.data}.join(",")+") ."
116
+ end
117
+ out
118
+ end
119
+ end
120
+ end
121
+ end
122
+ n=SPSS::Dictionary::Dictionary.new
123
+ ls=SPSS::Dictionary::LabelSet.new({1=>"Si",2=>"No"})
124
+ var1=SPSS::Dictionary::Variable.new
125
+ var1.labelset=ls
126
+ mv1=SPSS::Dictionary::MissingValue.new("-99")
127
+ var2=SPSS::Dictionary::Variable.new
128
+ n.add(var1)
129
+ n.add(var2)
130
+ var2.missing_values=[mv1]
131
+
132
+ File.open("dic_spss.sps","wb") {|f|
133
+ f.puts n.to_spss
134
+ }