diff options
author | Christoph Helma <helma@in-silico.ch> | 2016-10-13 22:59:45 +0200 |
---|---|---|
committer | Christoph Helma <helma@in-silico.ch> | 2016-10-13 22:59:45 +0200 |
commit | 09452bba5c407c27721223d126e3f45c12b20a0c (patch) | |
tree | ed4f73a874ddb12c98e7c62af49c2de5fcc4f4d1 /lib | |
parent | 2dc66aef3b7932105868ee8c7d32ad975e142d1b (diff) |
tests pass
Diffstat (limited to 'lib')
-rw-r--r-- | lib/caret.rb | 5 | ||||
-rw-r--r-- | lib/model.rb | 32 | ||||
-rw-r--r-- | lib/regression.rb | 2 |
3 files changed, 15 insertions, 24 deletions
diff --git a/lib/caret.rb b/lib/caret.rb index df86093..2c4cd0c 100644 --- a/lib/caret.rb +++ b/lib/caret.rb @@ -9,6 +9,11 @@ module OpenTox if independent_variables.flatten.uniq == ["NA"] prediction = Algorithm::Regression::weighted_average dependent_variables:dependent_variables, weights:weights prediction[:warning] = "No variables for regression model. Using weighted average of similar substances." + elsif + dependent_variables.size < 3 + prediction = Algorithm::Regression::weighted_average dependent_variables:dependent_variables, weights:weights + prediction[:warning] = "Insufficient number of neighbors (#{dependent_variables.size}) for regression model. Using weighted average of similar substances." + else dependent_variables.each_with_index do |v,i| dependent_variables[i] = to_r(v) diff --git a/lib/model.rb b/lib/model.rb index 4bbb7da..d7b072f 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -28,23 +28,9 @@ module OpenTox bad_request_error "Please provide a prediction_feature and/or a training_dataset." unless prediction_feature or training_dataset prediction_feature = training_dataset.features.first unless prediction_feature # TODO: prediction_feature without training_dataset: use all available data - # explicit prediction algorithm - if algorithms[:prediction] and algorithms[:prediction][:method] - case algorithms[:prediction][:method] - when /Classification/i - model = LazarClassification.new - when /Regression/i - model = LazarRegression.new - else - bad_request_error "Prediction method '#{algorithms[:prediction][:method]}' not implemented." - end # guess model type - elsif prediction_feature.numeric? - model = LazarRegression.new - else - model = LazarClassification.new - end + prediction_feature.numeric? ? model = LazarRegression.new : model = LazarClassification.new model.prediction_feature_id = prediction_feature.id model.training_dataset_id = training_dataset.id @@ -193,17 +179,17 @@ module OpenTox query_descriptors = substance.calculate_properties(features) similarity_descriptors = query_descriptors.collect_with_index{|v,i| (v-descriptor_means[i])/descriptor_sds[i]} else - similarity_descriptors = descriptor_ids.collect_with_index{|id,i| - prop = substance.properties[id] - prop = prop.median if prop.is_a? Array # measured - (prop-descriptor_means[i])/descriptor_sds[i] - } - query_descriptors = descriptor_ids.collect_with_index{|id,i| + similarity_descriptors = [] + query_descriptors = [] + descriptor_ids.each_with_index do |id,i| prop = substance.properties[id] prop = prop.median if prop.is_a? Array # measured - substance.properties[id] - } + if prop + similarity_descriptors[i] = (prop-descriptor_means[i])/descriptor_sds[i] + query_descriptors[i] = prop + end end + end else bad_request_error "Unknown descriptor type '#{descriptors}' for similarity method '#{similarity[:method]}'." end diff --git a/lib/regression.rb b/lib/regression.rb index d1724fd..3890987 100644 --- a/lib/regression.rb +++ b/lib/regression.rb @@ -3,7 +3,7 @@ module OpenTox class Regression - def self.weighted_average dependent_variables:, independent_variables:nil, weights:, query_variables: + def self.weighted_average dependent_variables:, independent_variables:nil, weights:, query_variables:nil # TODO: prediction_interval weighted_sum = 0.0 sim_sum = 0.0 |