Module: Statsample::CovariateMatrix

Includes:
NamedMatrix
Defined in:
lib/statsample/matrix.rb

Overview

Module to add method for variance/covariance and correlation matrices

Usage

matrix=Matrix[[1,2],[2,3]]
matrix.extend CovariateMatrix

Constant Summary collapse

@@covariatematrix =
0

Instance Method Summary collapse

Methods included from NamedMatrix

#fields, #fields=, #fields_x, #fields_x=, #fields_y, #fields_y=, #name, #name=

Methods included from Summarizable

#summary

Instance Method Details

#_typeObject

Get type of covariate matrix. Could be :covariance or :correlation


228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/statsample/matrix.rb', line 228

def _type
  if row_size==column_size
    if row_size.times.find {|i| self[i,i]!=1.0}
      :covariance
    else
      :correlation
    end
  else
    @type
  end

end

#_type=(t) ⇒ Object


240
241
242
# File 'lib/statsample/matrix.rb', line 240

def _type=(t)
  @type=t
end

#correlationObject


243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# File 'lib/statsample/matrix.rb', line 243

def correlation
  if(_type==:covariance)
    matrix=Matrix.rows(row_size.times.collect { |i|
      column_size.times.collect { |j|
        if i==j
          1.0
        else
          self[i,j].quo(Math::sqrt(self[i,i])*Math::sqrt(self[j,j]))
        end
      }
    })
    matrix.extend CovariateMatrix
    matrix.fields_x=fields_x
    matrix.fields_y=fields_y
    matrix._type=:correlation
    matrix
  else
    self
  end
end

#get_new_nameObject


271
272
273
274
# File 'lib/statsample/matrix.rb', line 271

def get_new_name
  @@covariatematrix+=1
  _("Covariate matrix %d") % @@covariatematrix
end

#report_building(generator) ⇒ Object


320
321
322
323
324
325
326
327
328
329
# File 'lib/statsample/matrix.rb', line 320

def report_building(generator)
  @name||= (_type==:correlation ? _("Correlation"):_("Covariance"))+_(" Matrix")
  generator.table(:name=>@name, :header=>[""]+fields_y) do |t|
    row_size.times {|i|
      t.row([fields_x[i]]+row(i).to_a.collect {|i1|
          i1.nil? ? "--" : sprintf("%0.3f",i1).gsub("0.",".")
      })
    }
  end
end

#submatrix(rows, columns = nil) ⇒ Object

Select a submatrix of factors. If you have a correlation matrix with a, b and c, you could obtain a submatrix of correlations of a and b, b and c or a and b

You could use labels or index to select the factors. If you don't specify columns, its will be equal to rows.

Example:

a=Matrix[[1.0, 0.3, 0.2],
         [0.3, 1.0, 0.5],
         [0.2, 0.5, 1.0]]
a.extend CovariateMatrix
a.fields=%w{a b c}
a.submatrix(%w{c a}, %w{b})
=> Matrix[[0.5],[0.3]]
a.submatrix(%w{c a})
=> Matrix[[1.0, 0.2] , [0.2, 1.0]]

Raises:

  • (ArgumentError)

293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
# File 'lib/statsample/matrix.rb', line 293

def submatrix(rows,columns = nil)
  raise ArgumentError, "rows shouldn't be empty" if rows.respond_to? :size and rows.size == 0
  columns ||= rows
  # Convert all fields on index
  row_index = rows.collect do |v|
    r = v.is_a?(Numeric) ? v : fields_x.index(v)
    raise "Index #{v} doesn't exists on matrix" if r.nil?
    r
  end

  column_index = columns.collect do |v|
    r = v.is_a?(Numeric) ? v : fields_y.index(v)
    raise "Index #{v} doesn't exists on matrix" if r.nil?
    r
  end


  fx=row_index.collect {|v| fields_x[v]}
  fy=column_index.collect {|v| fields_y[v]}

  matrix = Matrix.rows(row_index.collect { |i| column_index.collect { |j| self[i, j] }})
  matrix.extend CovariateMatrix
  matrix.fields_x = fx
  matrix.fields_y = fy
  matrix._type = _type
  matrix
end

#variance(k) ⇒ Object

Get variance for field k


267
268
269
# File 'lib/statsample/matrix.rb', line 267

def variance(k)
  submatrix([k])[0,0]
end