lazar-gui 1.1.3 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/FAQ.md +22 -2
- data/Gemfile +2 -1
- data/README.md +5 -4
- data/VERSION +1 -1
- data/application.rb +151 -66
- data/bin/lazar-start.sh +2 -2
- data/lazar-gui.gemspec +6 -4
- data/public/javascripts/google_analytics_lazar.js +7 -0
- data/qmrf_report.rb +254 -0
- data/tmp/.gitignore +2 -0
- data/unicorn.rb +1 -6
- data/views/batch.haml +83 -74
- data/views/error.haml +1 -2
- data/views/info.haml +1 -1
- data/views/layout.haml +16 -11
- data/views/model_details.haml +157 -137
- data/views/neighbors.haml +2 -2
- data/views/predict.haml +17 -10
- data/views/prediction.haml +28 -20
- data/views/style.scss +2 -4
- metadata +39 -8
data/tmp/.gitignore
ADDED
data/unicorn.rb
CHANGED
data/views/batch.haml
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
%a.btn.btn-warning{:href => to('/predict')}
|
3
3
|
%span.glyphicon.glyphicon-menu-left{:aria=>{:hidden=>"true"}}
|
4
4
|
New Prediction
|
5
|
-
%a.btn.btn-success{:href=>"#{to("/predict/#{@filename}")}", :title=>"download"}
|
5
|
+
%a.btn.btn-success{:id => "downbutton", :href=>"#{to("/predict/#{@tmppath}/#{@filename}")}", :title=>"download"}
|
6
6
|
%span.glyphicon.glyphicon-download-alt
|
7
|
-
|
7
|
+
Download CSV
|
8
8
|
|
9
|
-
/ show
|
9
|
+
/ show file name
|
10
10
|
%topline
|
11
11
|
%div.row
|
12
12
|
%div.col-md-4
|
@@ -18,83 +18,92 @@
|
|
18
18
|
%div.table-responsive
|
19
19
|
%table.table.table-bordered{:id=>"batch", :style=>"background-color:white;"}
|
20
20
|
%tbody
|
21
|
-
|
22
|
-
|
21
|
+
- if @warnings
|
22
|
+
- @warnings.each do |warning|
|
23
|
+
%tr
|
24
|
+
%td
|
25
|
+
%b Warning
|
26
|
+
%td
|
27
|
+
= warning.sub(/\b(tmp\/)\b/,"")
|
28
|
+
- @view.each do |compound, array|
|
23
29
|
%tr
|
24
|
-
%td
|
25
|
-
%
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
- values.each_with_index do |array,i|
|
38
|
-
%td{:style=>"vertical-align:top;white-space:nowrap;"}
|
39
|
-
- model = array[0]
|
40
|
-
/ model type (classification|regression)
|
41
|
-
- model.model.class.to_s.match("Classification") ? type = "Classification" : type = "Regression"
|
42
|
-
- unit = model.unit
|
43
|
-
- prediction = array[1]
|
44
|
-
|
45
|
-
%b{:class => "title"}
|
46
|
-
= "#{model.endpoint.gsub('_', ' ')} (#{model.species})"
|
47
|
-
|
48
|
-
/ check for prediction
|
49
|
-
- if prediction[:neighbors].size > 0
|
50
|
-
%p
|
51
|
-
/ show model type (classification|regression)
|
52
|
-
%b Type:
|
53
|
-
= type
|
54
|
-
%p
|
55
|
-
/ check for database hit
|
56
|
-
- if prediction[:info] =~ /\b(identical)\b/i
|
57
|
-
|
58
|
-
/ show message about dbhit and measurements
|
30
|
+
%td{:style=>"vertical-align:top;"}
|
31
|
+
%p= compound.svg
|
32
|
+
%p= compound.smiles
|
33
|
+
- array.each do |model,prediction|
|
34
|
+
%td{:style=>"vertical-align:top;white-space:nowrap;"}
|
35
|
+
- model.model.class.to_s.match("Classification") ? type = "Classification" : type = "Regression"
|
36
|
+
- unit = model.unit
|
37
|
+
|
38
|
+
%b{:class => "title"}
|
39
|
+
= "#{model.endpoint.gsub('_', ' ')} (#{model.species})"
|
40
|
+
|
41
|
+
/ check for prediction
|
42
|
+
- if prediction[:value]
|
59
43
|
%p
|
60
|
-
|
44
|
+
/ show model type (classification|regression)
|
45
|
+
%b Type:
|
46
|
+
= type
|
47
|
+
%p
|
48
|
+
/ check for database hit
|
49
|
+
- if prediction[:info] =~ /\b(identical)\b/i
|
50
|
+
|
51
|
+
/ show message about dbhit and measurements
|
61
52
|
%p
|
62
|
-
|
53
|
+
%b Compound is part of the training dataset
|
54
|
+
%p
|
55
|
+
%b Measured activity:
|
56
|
+
%br
|
57
|
+
- if prediction[:measurements].is_a?(Array)
|
58
|
+
= (type == "Regression") ? prediction[:measurements].collect{|value| "#{value.delog10.signif(3)} (#{unit})</br>#{compound.mmol_to_mg(value.delog10).signif(3)} #{unit =~ /mmol\/L/ ? "(mg/L)" : "(mg/kg_bw/day)"}"}.join("</br>") : prediction[:measurements].join(", ")
|
59
|
+
- else
|
60
|
+
= (type == "Regression") ? "#{prediction[:measurements].delog10.signif(3)} (#{unit})</br>#{compound.mmol_to_mg(prediction[:measurements].delog10).signif(3)} #{(unit =~ /\b(mmol\/L)\b/) ? "(mg/L)" : "(mg/kg_bw/day)"}" : prediction[:measurements]
|
61
|
+
|
62
|
+
|
63
|
+
/ show prediction
|
64
|
+
%p
|
65
|
+
%b Prediction:
|
63
66
|
%br
|
64
|
-
|
65
|
-
|
67
|
+
= (type == "Regression") ? "#{prediction[:value].delog10.signif(3)} (#{unit})</br>#{compound.mmol_to_mg(prediction[:value].delog10).signif(3)} #{(unit =~ /\b(mmol\/L)\b/) ? "(mg/L)" : "(mg/kg_bw/day)"}" : prediction[:value]
|
68
|
+
|
69
|
+
/ show prediction interval or probability
|
70
|
+
%p
|
71
|
+
- if type == "Regression"
|
72
|
+
%b 95% Prediction interval:
|
73
|
+
- interval = (prediction[:prediction_interval].nil? ? nil : prediction[:prediction_interval])
|
74
|
+
%br
|
75
|
+
= interval.nil? ? "" : "#{interval[1].delog10.signif(3)} - #{interval[0].delog10.signif(3)} (#{unit})"
|
76
|
+
%br
|
77
|
+
= "#{compound.mmol_to_mg(interval[1].delog10).signif(3)} - #{compound.mmol_to_mg(interval[0].delog10).signif(3)} #{(unit =~ /\b(mmol\/L)\b/) ? "(mg/L)" : "(mg/kg_bw/day)"}" if !prediction[:prediction_interval].nil?
|
66
78
|
- else
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
= (type == "Regression") ? "#{prediction[:value].delog10} (#{unit})</br>#{compound.mmol_to_mg(prediction[:value].delog10)} #{(unit =~ /\b(mol\/L)\b/) ? "(mg/L)" : "(mg/kg_bw/day)"}" : prediction[:value]
|
75
|
-
|
76
|
-
/ show prediction interval or probability
|
79
|
+
%b Probability:
|
80
|
+
- unless prediction[:probabilities].nil?
|
81
|
+
- probabilities = ""
|
82
|
+
- prediction[:probabilities].each{|k,v| probabilities += "#{k}: #{v.signif(3)}<br>"}
|
83
|
+
%br
|
84
|
+
= probabilities
|
85
|
+
/ show warnings
|
77
86
|
%p
|
78
|
-
- if
|
79
|
-
%b
|
80
|
-
- interval = (prediction[:prediction_interval].nil? ? nil : prediction[:prediction_interval])
|
87
|
+
- if !prediction[:info].blank?
|
88
|
+
%b Info:
|
81
89
|
%br
|
82
|
-
=
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
%b Probability:
|
87
|
-
- unless prediction[:probabilities].nil?
|
90
|
+
%p=prediction[:info].sub(/\'.*\'/,"").sub(/,/, ",<br>")
|
91
|
+
- if !prediction[:warnings].blank?
|
92
|
+
%b Warnings:
|
93
|
+
- prediction[:warnings].uniq.each do |warning|
|
88
94
|
%br
|
89
|
-
= "
|
95
|
+
%p=warning.sub(/substances/, "substances<br>").sub(/prediction\:/, "prediction\:<br>")
|
96
|
+
|
97
|
+
/ no prediction
|
98
|
+
- else
|
99
|
+
%br
|
100
|
+
- if !prediction[:info].blank?
|
101
|
+
%b Info:
|
102
|
+
%br
|
103
|
+
%p=prediction[:info].sub(/\'.*\'/,"").sub(/,/, ",<br>")
|
104
|
+
- if !prediction[:warnings].blank?
|
105
|
+
%b Warnings:
|
106
|
+
- prediction[:warnings].uniq.each do |warning|
|
90
107
|
%br
|
91
|
-
|
92
|
-
|
93
|
-
- if !prediction[:warning].nil?
|
94
|
-
%b Warnings:
|
95
|
-
%a.btn.glyphicon.glyphicon-info-sign{:href=>"javascript:void(0)", :title=>"Warnings", :tabindex=>"0", data: {trigger:"focus", toggle:"popover", placement:"left", html:"true", content:"#{prediction[:warning]}"}}
|
96
|
-
|
97
|
-
/ no prediction
|
98
|
-
- else
|
99
|
-
%p
|
100
|
-
= "Not enough similar compounds </br>in training dataset."
|
108
|
+
%p=warning.sub(/substances/, "substances<br>").sub(/prediction\:/, "prediction\:<br>")
|
109
|
+
%tr
|
data/views/error.haml
CHANGED
data/views/info.haml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
%div.info
|
2
|
-
|
2
|
+
We are rebuilding the models. It will take a while, please be patient and reload the page in some time.
|
data/views/layout.haml
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
%script{:src=>"/javascripts/jquery.tablesorter.min.js"}
|
17
17
|
%script{:src=>"/javascripts/jquery.tablesorter.widgets.js"}
|
18
18
|
%script{:src=>"/javascripts/lazar-gui.js"}
|
19
|
+
%script{:src=>"/javascripts/google_analytics_lazar.js"}
|
19
20
|
%body
|
20
21
|
%noscript
|
21
22
|
%div{ :style=>"width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif"}
|
@@ -31,7 +32,9 @@
|
|
31
32
|
%div.col-md-3
|
32
33
|
%h1.media-heading
|
33
34
|
%small
|
34
|
-
%a{:href=>"https://nano-lazar.in-silico.ch", :rel=>"external"}
|
35
|
+
%a.btn{:href=>"https://nano-lazar.in-silico.ch", :rel=>"external"}
|
36
|
+
nano-lazar
|
37
|
+
%span.glyphicon.glyphicon-new-window
|
35
38
|
|
36
39
|
%div.container-fluid
|
37
40
|
%topline.alert
|
@@ -86,16 +89,18 @@
|
|
86
89
|
%a{:href => 'http://www.in-silico.ch', :rel => "external"} <i style="font-family: serife">in silico</i> toxicology gmbh 2004 - #{Time.now.year.to_s}
|
87
90
|
|
|
88
91
|
%a{:href => to("/license"), :rel => "external"} GPL3 License
|
89
|
-
%supporters
|
90
|
-
%
|
91
|
-
|
92
|
-
%
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
92
|
+
%supporters
|
93
|
+
%div.panel.panel-default
|
94
|
+
Financial support by
|
95
|
+
%div.panel-body
|
96
|
+
%a{:href=>"http://www.bfr.bund.de/de/start.html", :rel=>"external"}
|
97
|
+
%img{:src=>"/images/bfr_logo.gif"}
|
98
|
+
%a{:href=>"http://www.opentox.org/", :rel=>"external"}
|
99
|
+
%img{:src=>"/images/ot_logo.png"}
|
100
|
+
%a{:href=>"https://enanomapper.net/", :rel=>"external"}
|
101
|
+
%img{:src=>"/images/enm_logo.png"}
|
102
|
+
%a{:href=>"https://www.researchgate.net/institution/Nestle_SA/department/Nestle_Research_Center", :rel=>"external"}
|
103
|
+
%img{:src=>"/images/nestec.jpg"}
|
99
104
|
|
100
105
|
|
101
106
|
#back-top{:style => "z-index:100;position:fixed;bottom:1%;right:1%;"}
|
data/views/model_details.haml
CHANGED
@@ -1,141 +1,161 @@
|
|
1
|
-
%
|
2
|
-
%
|
3
|
-
|
4
|
-
%
|
5
|
-
|
6
|
-
%
|
7
|
-
|
8
|
-
|
9
|
-
= type
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
=
|
14
|
-
|
15
|
-
=
|
16
|
-
%
|
17
|
-
|
18
|
-
%
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
%
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
%br
|
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
|
-
|
1
|
+
%div.panel.panel-default
|
2
|
+
%div.panel-heading
|
3
|
+
%b Model:
|
4
|
+
%div.panel-body
|
5
|
+
Source:
|
6
|
+
%a{:href=>model.source, :rel=>"external"}
|
7
|
+
= model.source
|
8
|
+
%br
|
9
|
+
- model.classification? ? type = "Classification" : type = "Regression"
|
10
|
+
= "Type:\t"
|
11
|
+
= type
|
12
|
+
%br
|
13
|
+
- training_dataset = OpenTox::Dataset.find model.model.training_dataset_id
|
14
|
+
= "Training compounds:\t"
|
15
|
+
= training_dataset.data_entries.size
|
16
|
+
%br
|
17
|
+
= "Training dataset:\t"
|
18
|
+
%a{:href=>"#{to("/predict/dataset/#{training_dataset.name}")}"}
|
19
|
+
= training_dataset.name
|
20
|
+
|
21
|
+
%div.panel.panel-default
|
22
|
+
%div.panel-heading
|
23
|
+
%b Algorithms:
|
24
|
+
%div.panel-body
|
25
|
+
Similarity:
|
26
|
+
%a{:href=> "http://www.rubydoc.info/gems/lazar/OpenTox%2F#{model.model.algorithms["similarity"]["method"].sub("::", "%2F")}", :rel=>"external"}
|
27
|
+
= model.model.algorithms["similarity"]["method"]
|
28
|
+
= ", min: #{model.model.algorithms["similarity"]["min"]}"
|
29
|
+
%br
|
30
|
+
Prediction:
|
31
|
+
- if model.model.algorithms["prediction"]["method"] !~ /Caret/
|
32
|
+
%a{:href=>"http://www.rubydoc.info/gems/lazar/OpenTox%2F#{model.model.algorithms["prediction"]["method"].sub("::","%2f")}", :rel=>"external"}
|
33
|
+
= model.model.algorithms["prediction"]["method"]
|
34
|
+
- else
|
35
|
+
%a{:href=>"http://www.rubydoc.info/gems/lazar/OpenTox/Algorithm/Caret", :rel=>"external"}
|
36
|
+
= model.model.algorithms["prediction"]["method"]
|
37
|
+
|
38
|
+
%br
|
39
|
+
Descriptors:
|
40
|
+
= model.model.algorithms["descriptors"]["method"]+","
|
41
|
+
= model.model.algorithms["descriptors"]["type"]
|
42
|
+
|
43
|
+
%div.panel.panel-default
|
44
|
+
- if type == "Classification"
|
45
|
+
%div.panel-heading
|
46
|
+
%b Independent crossvalidations:
|
47
|
+
- else
|
48
|
+
%div.panel-heading
|
49
|
+
%b Independent crossvalidations (-log10 transformed):
|
50
|
+
%div.panel-body
|
51
|
+
/%div.row{:id=>"validations#{model.id}", :style=>"background-color:#f5f5f5;"}
|
52
|
+
%div.row{:id=>"validations#{model.id}"}
|
53
|
+
- crossvalidations.each do |cv|
|
54
|
+
%span.col-xs-4.col-sm-4.col-md-4.col-lg-4
|
55
|
+
= "Num folds:\t"
|
56
|
+
= cv.folds
|
57
57
|
%br
|
58
|
-
= "
|
59
|
-
= cv.
|
58
|
+
= "Num instances:\t"
|
59
|
+
= cv.nr_instances
|
60
60
|
%br
|
61
|
-
= "
|
62
|
-
= cv.
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
%td
|
82
|
-
%tr
|
83
|
-
%td
|
84
|
-
%td
|
85
|
-
%td active
|
86
|
-
%td inactive
|
87
|
-
-#%td total
|
88
|
-
%tr
|
89
|
-
%td
|
90
|
-
%b predicted
|
91
|
-
%td active
|
92
|
-
%td
|
93
|
-
=( idx == 1 ? cv.send(matrix)[0][0].round(3) : cv.send(matrix)[0][0])
|
94
|
-
%td
|
95
|
-
=( idx == 1 ? cv.send(matrix)[0][1].round(3) : cv.send(matrix)[0][1])
|
96
|
-
-#%td
|
97
|
-
=cv.confusion_matrix[0][0]+cv.confusion_matrix[0][1]
|
98
|
-
%tr
|
99
|
-
%td
|
100
|
-
%td inactive
|
101
|
-
%td
|
102
|
-
=( idx == 1 ? cv.send(matrix)[1][0].round(3) : cv.send(matrix)[1][0])
|
103
|
-
%td
|
104
|
-
=( idx == 1 ? cv.send(matrix)[1][1].round(3) : cv.send(matrix)[1][1])
|
105
|
-
-#%td
|
106
|
-
=cv.confusion_matrix[1][0]+cv.confusion_matrix[1][1]
|
107
|
-
-#%tr
|
108
|
-
%td
|
109
|
-
%td total
|
110
|
-
%td
|
111
|
-
=cv.confusion_matrix[0][0]+cv.confusion_matrix[1][0]
|
112
|
-
%td
|
113
|
-
=cv.confusion_matrix[0][1]+cv.confusion_matrix[1][1]
|
114
|
-
%td
|
115
|
-
-#= "Confusion Matrix:\t"
|
116
|
-
-#= cv.confusion_matrix
|
61
|
+
= "Num unpredicted"
|
62
|
+
= cv.nr_unpredicted
|
63
|
+
- if model.classification?
|
64
|
+
%br
|
65
|
+
= "Accuracy:\t"
|
66
|
+
= cv.accuracy.round(3) if cv.accuracy
|
67
|
+
%br
|
68
|
+
= "Weighted accuracy:\t"
|
69
|
+
= cv.weighted_accuracy.round(3) if cv.weighted_accuracy
|
70
|
+
- if cv.true_rate
|
71
|
+
%br
|
72
|
+
= "True positive rate:\t"
|
73
|
+
= cv.true_rate[cv.accept_values[0]].round(3)
|
74
|
+
%br
|
75
|
+
= "True negative rate:\t"
|
76
|
+
= cv.true_rate[cv.accept_values[1]].round(3)
|
77
|
+
- if cv.predictivity
|
78
|
+
%br
|
79
|
+
= "Positive predictive value:\t"
|
80
|
+
= cv.predictivity[cv.accept_values[0]].round(3)
|
117
81
|
%br
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
82
|
+
= "Negative predictive value:\t"
|
83
|
+
= cv.predictivity[cv.accept_values[1]].round(3)
|
84
|
+
%p
|
85
|
+
- ["confusion_matrix", "weighted_confusion_matrix"].each_with_index do |matrix,idx|
|
86
|
+
%b= (idx == 0 ? "Confusion Matrix" : "Weighted Confusion Matrix")
|
87
|
+
%table.table.table-condensed.table-borderless{:style=>"width:20%;"}
|
88
|
+
%tbody
|
89
|
+
%tr
|
90
|
+
%td
|
91
|
+
%td
|
92
|
+
%td
|
93
|
+
%b actual
|
94
|
+
%td
|
95
|
+
%td
|
96
|
+
%tr
|
97
|
+
%td
|
98
|
+
%td
|
99
|
+
%td active
|
100
|
+
%td inactive
|
101
|
+
-#%td total
|
102
|
+
%tr
|
103
|
+
%td
|
104
|
+
%b predicted
|
105
|
+
%td active
|
106
|
+
%td
|
107
|
+
=( idx == 1 ? cv.send(matrix)[0][0].round(3) : cv.send(matrix)[0][0])
|
108
|
+
%td
|
109
|
+
=( idx == 1 ? cv.send(matrix)[0][1].round(3) : cv.send(matrix)[0][1])
|
110
|
+
-#%td
|
111
|
+
=cv.confusion_matrix[0][0]+cv.confusion_matrix[0][1]
|
112
|
+
%tr
|
113
|
+
%td
|
114
|
+
%td inactive
|
115
|
+
%td
|
116
|
+
=( idx == 1 ? cv.send(matrix)[1][0].round(3) : cv.send(matrix)[1][0])
|
117
|
+
%td
|
118
|
+
=( idx == 1 ? cv.send(matrix)[1][1].round(3) : cv.send(matrix)[1][1])
|
119
|
+
-#%td
|
120
|
+
=cv.confusion_matrix[1][0]+cv.confusion_matrix[1][1]
|
121
|
+
-#%tr
|
122
|
+
%td
|
123
|
+
%td total
|
124
|
+
%td
|
125
|
+
=cv.confusion_matrix[0][0]+cv.confusion_matrix[1][0]
|
126
|
+
%td
|
127
|
+
=cv.confusion_matrix[0][1]+cv.confusion_matrix[1][1]
|
128
|
+
%td
|
129
|
+
-#= "Confusion Matrix:\t"
|
130
|
+
-#= cv.confusion_matrix
|
131
|
+
%br
|
132
|
+
%br
|
133
|
+
/= "Confidence plot:"
|
134
|
+
/%p.plot
|
135
|
+
/ %img{:src=>"confp#{cv.id}.svg"}
|
136
|
+
- if model.regression?
|
137
|
+
%br
|
138
|
+
%a.ht5{:href=>"https://en.wikipedia.org/wiki/Root-mean-square_deviation", :rel=>"external"} RMSE:
|
139
|
+
= cv.rmse.round(3) if cv.rmse
|
140
|
+
%br
|
141
|
+
%a.ht5{:href=>"https://en.wikipedia.org/wiki/Mean_absolute_error", :rel=>"external"} MAE:
|
142
|
+
= cv.mae.round(3) if cv.mae
|
143
|
+
%br
|
144
|
+
%a.ht5{:href=>"https://en.wikipedia.org/wiki/Coefficient_of_determination", :rel=>"external"}= "R"+"<sup>2</sup>"+":"
|
145
|
+
= cv.r_squared.round(3) if cv.r_squared
|
146
|
+
%br
|
147
|
+
/= "Confidence plot:"
|
148
|
+
/%p.plot
|
149
|
+
/ %img{:src=>"/confp#{cv.id}.svg"}
|
150
|
+
/%br
|
151
|
+
/= "Correlation plot"
|
152
|
+
/%p.plot
|
153
|
+
/ %img{:src=>"/corrp#{cv.id}.svg"}
|
140
154
|
|
141
|
-
%
|
155
|
+
%div.panel.panel-default
|
156
|
+
%div.panel-heading
|
157
|
+
%b QMRF:
|
158
|
+
%div.panel-body
|
159
|
+
%a.btn.btn-default.btn-xs{:href=>"#{to("/report/#{model.id}")}", :id=>"report#{model.id}", :style=>"font-size:small;"}
|
160
|
+
%span.glyphicon.glyphicon-download-alt
|
161
|
+
XML
|