Class: Statsample::Regression::Multiple::GslEngine

Inherits:
BaseEngine show all
Defined in:
lib/statsample/regression/multiple/gslengine.rb

Overview

Class for Multiple Regression Analysis Requires rbgsl and uses a listwise aproach. Slower on prediction of values than Alglib, because predict is ruby based. Better memory management on multiple (+1000) series of regression. If you need pairwise, use RubyEngine Example:

@a=[1,3,2,4,3,5,4,6,5,7].to_vector(:numeric)
@b=[3,3,4,4,5,5,6,6,4,4].to_vector(:numeric)
@c=[11,22,30,40,50,65,78,79,99,100].to_vector(:numeric)
@y=[3,4,5,6,7,8,9,10,20,30].to_vector(:numeric)
ds={'a'=>@a,'b'=>@b,'c'=>@c,'y'=>@y}.to_dataset
lr=Statsample::Regression::Multiple::GslEngine.new(ds,'y')

Instance Attribute Summary

Attributes inherited from BaseEngine

#cases, #digits, #name, #total_cases, #valid_cases

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from BaseEngine

#anova, #assign_names, #coeffs_t, #coeffs_tolerances, #constant_se, #constant_t, #df_e, #df_r, #estimated_variance_covariance_matrix, #f, #mse, #msr, #predicted, #probability, #process, #r2_adjusted, #report_building, #residuals, #se_estimate, #se_r2, #sse, #sse_direct, #ssr, #ssr_direct, #standarized_predicted, #tolerance, univariate?

Methods included from Summarizable

#summary

Constructor Details

#initialize(ds, y_var, opts = Hash.new) ⇒ GslEngine

Returns a new instance of GslEngine.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/statsample/regression/multiple/gslengine.rb', line 20

def initialize(ds,y_var, opts=Hash.new)
  super
  @ds=ds.dup_only_valid
  @ds_valid=@ds
  @valid_cases=@ds_valid.cases
  @dy=@ds[@y_var]
  @ds_indep=ds.dup(ds.fields-[y_var])
  # Create a custom matrix
  columns=[]
  @fields=[]
  max_deps = GSL::Matrix.alloc(@ds.cases, @ds.fields.size)
  constant_col=@ds.fields.size-1
  for i in 0...@ds.cases
    max_deps.set(i,constant_col,1)
  end
  j=0
  @ds.fields.each{|f|
    if f!=@y_var
      @ds[f].each_index{|i1|
        max_deps.set(i1,j,@ds[f][i1])
      }
      columns.push(@ds[f].to_a)
      @fields.push(f)
      j+=1
    end
  }
  @dep_columns=columns.dup
  @lr_s=nil
  c, @cov, @chisq, @status = GSL::MultiFit.linear(max_deps, @dy.gsl)
  @constant=c[constant_col]
  @coeffs_a=c.to_a.slice(0...constant_col)
  @coeffs=assign_names(@coeffs_a)
  c=nil
end

Class Method Details

._load(data) ⇒ Object



58
59
60
61
# File 'lib/statsample/regression/multiple/gslengine.rb', line 58

def self._load(data)
  h=Marshal.load(data)
  self.new(h['ds'], h['y_var'])
end

Instance Method Details

#_dump(i) ⇒ Object



55
56
57
# File 'lib/statsample/regression/multiple/gslengine.rb', line 55

def _dump(i)
  Marshal.dump({'ds'=>@ds,'y_var'=>@y_var})
end

#build_standarizedObject



99
100
101
102
# File 'lib/statsample/regression/multiple/gslengine.rb', line 99

def build_standarized
  @ds_s=@ds.standarize
  @lr_s=GslEngine.new(@ds_s,@y_var)
end

#coeffsObject



63
64
65
# File 'lib/statsample/regression/multiple/gslengine.rb', line 63

def coeffs
  @coeffs
end

#coeffs_seObject

Standard error for coeffs



116
117
118
119
120
121
122
123
124
125
126
# File 'lib/statsample/regression/multiple/gslengine.rb', line 116

def coeffs_se
  out={}
  evcm=estimated_variance_covariance_matrix
  @ds_valid.fields.each_with_index do |f,i|

    mi=i+1
    next if f==@y_var
    out[f]=evcm[mi,mi]
  end
  out
end

#constantObject



86
87
88
# File 'lib/statsample/regression/multiple/gslengine.rb', line 86

def constant
  @constant
end

#lr_sObject



93
94
95
96
97
98
# File 'lib/statsample/regression/multiple/gslengine.rb', line 93

def lr_s
  if @lr_s.nil?
    build_standarized
  end
  @lr_s
end

#matrix_resolutionObject

Coefficients using a constant Based on www.xycoon.com/ols1.htm



68
69
70
71
72
73
74
75
76
# File 'lib/statsample/regression/multiple/gslengine.rb', line 68

def matrix_resolution
  columns=@dep_columns.dup.map {|xi| xi.map{|i| i.to_f}}
  columns.unshift([1.0]*@ds.cases)
  y=Matrix.columns([@dy.data.map  {|i| i.to_f}])
  x=Matrix.columns(columns)
  xt=x.t
  matrix=((xt*x)).inverse*xt
  matrix*y
end

#process_s(v) ⇒ Object



103
104
105
# File 'lib/statsample/regression/multiple/gslengine.rb', line 103

def process_s(v)
  lr_s.process(v)
end

#rObject



80
81
82
# File 'lib/statsample/regression/multiple/gslengine.rb', line 80

def r
  Bivariate::pearson(@dy, predicted)
end

#r2Object



77
78
79
# File 'lib/statsample/regression/multiple/gslengine.rb', line 77

def r2
  r**2
end

#sstObject



83
84
85
# File 'lib/statsample/regression/multiple/gslengine.rb', line 83

def sst
  @dy.ss
end

#standarized_coeffsObject



89
90
91
92
# File 'lib/statsample/regression/multiple/gslengine.rb', line 89

def standarized_coeffs
  l=lr_s
  l.coeffs
end

#standarized_residualsObject

???? Not equal to SPSS output



107
108
109
110
111
112
113
# File 'lib/statsample/regression/multiple/gslengine.rb', line 107

def standarized_residuals
  res=residuals
  red_sd=residuals.sds
  res.collect {|v|
    v.quo(red_sd)
  }.to_vector(:numeric)
end