Class: R::Model

Inherits:
Object
  • Object
show all
Defined in:
lib/rbbt/util/R/model.rb

Constant Summary collapse

R_METHOD =
:eval

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, formula, data = nil, options = {}) ⇒ Model

Returns a new instance of Model.



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/rbbt/util/R/model.rb', line 22

def initialize(name, formula, data = nil, options = {})
  @name = name
  @formula = formula
  @options = options || {}
  @model_file = options[:model_file] if options[:model_file]
  @model_file ||= Misc.sanitize_filename(File.join(options[:model_dir], name)) if options[:model_dir]

  if data and not model_file.exists?
    method = Misc.process_options options, :fit
    fit(data, method || "lm", options)
  end
end

Instance Attribute Details

#formulaObject

Returns the value of attribute formula.



21
22
23
# File 'lib/rbbt/util/R/model.rb', line 21

def formula
  @formula
end

#model_fileObject

Returns the value of attribute model_file.



21
22
23
# File 'lib/rbbt/util/R/model.rb', line 21

def model_file
  @model_file
end

#nameObject

Returns the value of attribute name.



21
22
23
# File 'lib/rbbt/util/R/model.rb', line 21

def name
  @name
end

Class Method Details

.groom(tsv, formula) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/rbbt/util/R/model.rb', line 61

def self.groom(tsv, formula)
  tsv = tsv.to_list if tsv.type == :single

  if formula.include? tsv.key_field and not tsv.fields.include? tsv.key_field
    tsv = tsv.add_field tsv.key_field do |k,v|
      k
    end
  end

  tsv
end

Instance Method Details

#colClasses(tsv) ⇒ Object



35
36
37
38
39
40
# File 'lib/rbbt/util/R/model.rb', line 35

def colClasses(tsv)
  return nil unless TSV === tsv
  "c('character', " << 
  (tsv.fields.collect{|f| R.ruby2R(@options[f] ? @options[f].to_s : ":NA") } * ", ") <<
  ")"
end

#exists?Boolean

Returns:

  • (Boolean)


101
102
103
# File 'lib/rbbt/util/R/model.rb', line 101

def exists?
  File.exists? model_file
end

#fit(tsv, method = 'lm', args = {}) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/rbbt/util/R/model.rb', line 105

def fit(tsv, method='lm', args = {})
  args_str = ""
  args_str = args.collect{|name,value| [name,R.ruby2R(value)] * "=" } * ", "
  args_str = ", " << args_str unless args_str.empty?

  tsv = Model.groom(tsv, formula)

  FileUtils.mkdir_p File.dirname(model_file) unless File.exists?(File.dirname(model_file))
  tsv.R <<-EOF, r_options(tsv)
model = rbbt.model.fit(data, #{formula}, method=#{method}#{args_str})
save(model, file='#{model_file}')
data = NULL
  EOF
end

#predict(tsv, field = "Prediction") ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/rbbt/util/R/model.rb', line 73

def predict(tsv, field = "Prediction")
  case tsv
  when TSV
    tsv = Model.groom tsv, formula 
    tsv.R <<-EOF, r_options(tsv)
model = rbbt.model.load('#{model_file}');
data.groomed = rbbt.model.groom(data,formula=#{formula})
data$#{field} = predict(model, data.groomed);
    EOF
  when Hash
    res = R.eval_a <<-EOF
model = rbbt.model.load('#{model_file}');
predict(model, data.frame(#{R.ruby2R tsv}));
    EOF
    Array === tsv.values.first ? res : res.first
  when Fixnum, Array, Float, String
    field = formula.split("~").last.strip

    res = R.eval_a <<-EOF
model = rbbt.model.load('#{model_file}');
predict(model, data.frame(#{field} = #{R.ruby2R tsv}));
    EOF
    Array === tsv ? res : res.first
  else
    raise "Unknown object for predict: #{Misc.fingerprint tsv}"
  end
end

#r_options(tsv) ⇒ Object



42
43
44
45
46
# File 'lib/rbbt/util/R/model.rb', line 42

def r_options(tsv)
  {:R_open => "colClasses=#{colClasses(tsv)}", 
    :R_method => (@options[:R_method] || R_METHOD), 
      :source => @options[:source]}
end

#update(tsv, field = "Prediction") ⇒ Object



52
53
54
55
56
57
58
59
# File 'lib/rbbt/util/R/model.rb', line 52

def update(tsv, field = "Prediction")
  tsv.R <<-EOF, r_options(tsv)
model = rbbt.model.load('#{model_file}');
model = update(model, data);
save(model, file='#{model_file}');
data = NULL
  EOF
end