module Statsample module Reliability # DSL for analysis of multiple scales analysis. # Retrieves reliability analysis for each scale and # provides fast accessors to correlations matrix, # PCA and Factor Analysis. # # == Usage # @x1=[1,1,1,1,2,2,2,2,3,3,3,30].to_vector(:scale) # @x2=[1,1,1,2,2,3,3,3,3,4,4,50].to_vector(:scale) # @x3=[2,2,1,1,1,2,2,2,3,4,5,40].to_vector(:scale) # @x4=[1,2,3,4,4,4,4,3,4,4,5,30].to_vector(:scale) # ds={'x1'=>@x1,'x2'=>@x2,'x3'=>@x3,'x4'=>@x4}.to_dataset # opts={:name=>"Scales", # Name of analysis # :summary_correlation_matrix=>true, # Add correlation matrix # :summary_pca } # Add PCA between scales # msa=Statsample::Reliability::MultiScaleAnalysis.new(opts) do |m| # m.scale :s1, ds.clone(%w{x1 x2}) # m.scale :s2, ds.clone(%w{x3 x4}), {:name=>"Scale 2"} # end # # Retrieve summary # puts msa.summary class MultiScaleAnalysis include Statsample::Summarizable # Hash with scales attr_reader :scales # Name of analysis attr_accessor :name # Add a correlation matrix on summary attr_accessor :summary_correlation_matrix # Add PCA to summary attr_accessor :summary_pca # Add Principal Axis to summary attr_accessor :summary_principal_axis # Add Parallel Analysis to summary attr_accessor :summary_parallel_analysis # Options for Factor::PCA object attr_accessor :pca_options # Options for Factor::PrincipalAxis attr_accessor :principal_axis_options # Options for Parallel Analysis attr_accessor :parallel_analysis_options # Generates a new MultiScaleAnalysis # Opts could be any accessor of the class # * :name, # * :summary_correlation_matrix # * :summary_pca # * :summary_principal_axis # * :pca_options # * :factor_analysis_options # # If block given, all methods should be called # inside object environment. # def initialize(opts=Hash.new, &block) @scales=Hash.new @scales_keys=Array.new opts_default={ :name=>_("Multiple Scale analysis"), :summary_correlation_matrix=>false, :summary_pca=>false, :summary_principal_axis=>false, :summary_parallel_analysis=>false, :pca_options=>Hash.new, :principal_axis_options=>Hash.new, :parallel_analysis_options=>Hash.new } @opts=opts_default.merge(opts) @opts.each{|k,v| self.send("#{k}=",v) if self.respond_to? k } if block block.arity<1 ? instance_eval(&block) : block.call(self) end end # Add or retrieve a scale to analysis. # If second parameters is a dataset, generates a ScaleAnalysis # for ds, named code with options opts. # # If second parameters is empty, returns the ScaleAnalysis # code. def scale(code, ds=nil, opts=nil) if ds.nil? @scales[code] else opts={:name=>_("Scale %s") % code} if opts.nil? @scales_keys.push(code) @scales[code]=ScaleAnalysis.new(ds, opts) end end # Delete ScaleAnalysis named code def delete_scale(code) @scales_keys.delete code @scales.delete code end # Retrieves a Principal Component Analysis (Factor::PCA) # using all scales, using opts a options. def pca(opts=nil) opts||=pca_options Statsample::Factor::PCA.new(correlation_matrix, opts) end # Retrieves a PrincipalAxis Analysis (Factor::PrincipalAxis) # using all scales, using opts a options. def principal_axis_analysis(opts=nil) opts||=principal_axis_options Statsample::Factor::PrincipalAxis.new(correlation_matrix, opts) end def dataset_from_scales ds=Dataset.new(@scales_keys) @scales.each_pair do |code,scale| ds[code.to_s]=scale.ds.vector_sum ds[code.to_s].name=scale.name end ds.update_valid_data ds end def parallel_analysis(opts=nil) opts||=parallel_analysis_options Statsample::Factor::ParallelAnalysis.new(dataset_from_scales, opts) end # Retrieves a Correlation Matrix between scales. # def correlation_matrix Statsample::Bivariate.correlation_matrix(dataset_from_scales) end def report_building(b) # :nodoc: b.section(:name=>name) do |s| s.section(:name=>_("Reliability analysis of scales")) do |s2| @scales.each_pair do |k,scale| s2.parse_element(scale) end end if summary_correlation_matrix s.section(:name=>_("Correlation matrix for %s") % name) do |s2| s2.parse_element(correlation_matrix) end end if summary_pca s.section(:name=>_("PCA for %s") % name) do |s2| s2.parse_element(pca) end end if summary_principal_axis s.section(:name=>_("Principal Axis for %s") % name) do |s2| s2.parse_element(principal_axis_analysis) end end if summary_parallel_analysis s.section(:name=>_("Parallel Analysis for %s") % name) do |s2| s2.parse_element(parallel_analysis) end end end end end end end