summaryrefslogtreecommitdiff
path: root/test/nanomaterial-prediction-models.rb
blob: f90a822e7bd20aed35b8e6aa1abad3f09910f4c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
54
55
56
57
58
59
require_relative "setup.rb"

class NanomaterialPredictionModelTest < MiniTest::Test

  def setup
    @training_dataset = Dataset.where(:name => "Protein Corona Fingerprinting Predicts the Cellular Interaction of Gold and Silver Nanoparticles").first
    unless @training_dataset
      Import::Enanomapper.import File.join(File.dirname(__FILE__),"data","enm")
      @training_dataset = Dataset.where(name: "Protein Corona Fingerprinting Predicts the Cellular Interaction of Gold and Silver Nanoparticles").first
    end
    @prediction_feature = @training_dataset.features.select{|f| f["name"] == 'log2(Net cell association)'}.first
  end

  def test_default_nanomaterial_prediction_model
    prediction_model = Model::NanoPrediction.create
    [:endpoint,:species,:source].each do |p|
      refute_empty prediction_model[p]
    end
    assert prediction_model.regression?
    refute prediction_model.classification?
    prediction_model.crossvalidations.each do |cv|
      refute_nil cv.r_squared
      refute_nil cv.rmse
    end
    nanoparticle = @training_dataset.nanoparticles[-34]
    assert_includes nanoparticle.dataset_ids, @training_dataset.id
    prediction = prediction_model.predict nanoparticle
    refute_nil prediction[:value]
    assert_includes prediction[:prediction_interval][0]..prediction[:prediction_interval][1], prediction[:measurements].median, "This assertion assures that measured values are within the prediction interval. It may fail in 5% of the predictions."
    prediction_model.delete
  end

  def test_nanomaterial_prediction_model_parameters
    algorithms = {
      :descriptors => {
        :method => "fingerprint",
        :type => "MP2D",
      },
      :similarity => {
        :method => "Algorithm::Similarity.tanimoto",
        :min => 0.1
      },
      :prediction => { :method => "OpenTox::Algorithm::Regression.weighted_average" },
      :feature_selection => nil
    }
    prediction_model = Model::NanoPrediction.create algorithms: algorithms
    assert prediction_model.regression?
    refute prediction_model.classification?
    prediction_model.crossvalidations.each do |cv|
      refute_nil cv.r_squared
      refute_nil cv.rmse
    end
    nanoparticle = @training_dataset.nanoparticles[-34]
    assert_includes nanoparticle.dataset_ids, @training_dataset.id
    prediction = prediction_model.predict nanoparticle
    refute_nil prediction[:value]
    assert_includes prediction[:prediction_interval][0]..prediction[:prediction_interval][1], prediction[:measurements].median, "This assertion assures that measured values are within the prediction interval. It may fail in 5% of the predictions."
  end
end