- According to the probability and sort and unique the data. Caculate the between the value threshold.
- determine the label by the thresthold.
- according to label in fact and the label predict.
var config_model='';
var data=[];
for(var i=0;i<trainingData.length;i++)
{
var row=[];
row.push(trainingData[i][0]);
var name='model'+i;
window[name]=train_model_new(trainingData[i][1]);
//model=
config_model+='<p>'+trainingData[i][0]+" "+window[name].weight+" intercept"+window[name].intercept+'</p>';
proarr=model_data_probability(window[name],validateData[i][1]);
rocarray=mljs_validate(proarr,validateLabel[i][1]);
row.push(rocarray[3]);
row.push(rocarray[1]);
row.push(rocarray[2]);
//console.log(row);
data.push(row);
}
//console.log(data);
plot_roc(data,'roc_plot');function mljs_validate(probability,trainingLabel){
var cutoffarray=cutoff(probability);
//console.log(probability);
//console.log(cutoffarray);
roc_array_label=mljs_determin_label(probability,cutoffarray);
//console.log(roc_array_label);
roc_tp4=mljs_label_cross(trainingLabel,roc_array_label);
//console.log(roc_array_label);
return roc_tp4;
//console.log(trainingLabel);
// var data=[['gene',roc_tp4[3],roc_tp4[1],roc_tp4[2]]];
// plot_roc(data,'roc_plot');
}1. According to the probability and sort and unique the data. Caculate the between the value threshold.
cutoff(probability);
- Deep copy probability array.
- sort the probability from small to big.
- Unique the probability.
- Calculate the therthold the first one is the smallest -1, other is the (data[i]+data[i+1])/2
var cutoffarray=cutoff(probability);
function cutoff(arr2) {
arr=JSON.parse(JSON.stringify(arr2));
if (arr.length === 0) return arr;
arr = arr.sort(function (a, b) { return a*1 - b*1; });
var ret = [arr[0]];
for (var i = 1; i < arr.length; i++) { //Start loop at 1: arr[0] can never be a duplicate
if (arr[i-1] !== arr[i]) {
ret.push(arr[i]);
}
}
var cutoff=[];
cutoff.push(ret[0]-1);
for(var i=1;i<ret.length;i++){
cutoff.push((ret[i-1]+ret[i])/2);
}
cutoff.push(ret[ret.length-1]+1);
return cutoff;
}2. determine the label by the thresthold.
mljs_determin_label(probability,cutoffarray)
roc_array_label=mljs_determin_label(probability,cutoffarray);
function mljs_determin_label(a,b){
//a is probability array
//b is cutoff array
label_array=[];
for(var i=0;i<b.length;i++){
//get each cutoff valule is b[i]
label_array.push([]);
for(var j=0;j<a.length;j++){
//get the each probability a[j]
if(a[j]> b[i]){
label_array[i].push(1);
}else{
label_array[i].push(0);
}
}
}
return label_array;
}3. according to label in fact and the label predict.
mljs_label_cross(trainingLabel,roc_array_label);
roc_tp4=mljs_label_cross(trainingLabel,roc_array_label);
function mljs_label_cross(a,b){
//a is the label of fact.
//b is the array of use probability to predict label.
var pro=[];
var tprarr=[];//sensitive
var fprarr=[];//
var precisionarr=[];
var specificityarr=[];
for(var i=0;i<b.length;i++){
// each cut off label is b[i]
var tp=0;
var tf=0;
var fp=0;
var fn=0;
var tpr=0;
var fpr=0;
var precision=0;
var specificity=0;
for(var j=0;j<b[i].length;j++){
if(b[i][j]==1 & a[j]==1){
tp++;
}
if(b[i][j]==0 & a[j]==0){
tf++;
}
if(b[i][j]==0 & a[j]==1){
fn++;
}
if(b[i][j]==1 & a[j]==0){
fp++;
}
}
tpr=tp/(tp+fn);//sensitive
tpr.toFixed(3);
fpr=fp/(tf+fp);
fpr.toFixed(3);
precision=tp/(tp+fp);
precision.toFixed(3);
specificity=tf/(tf+fp);
specificity.toFixed(3);
pro.push([tp,tf,fp,fn]);
fprarr.push(fpr);
tprarr.push(tpr);
precisionarr.push(precision);
specificityarr.push(specificity);
}
var auc=0;
for(var i=1;i<fprarr.length;i++){
auc+=(tprarr[i]+tprarr[i-1])*(fprarr[i]-fprarr[i-1])/2;
}
auc=Math.abs(auc).toFixed(3);
return [pro,fprarr,tprarr,auc,precisionarr,specificityarr];
}
//output is [[tp,tf,fp,fn],[false positive ratio array],[sensitive array],auc,[precision array],[specificity array]]//data=[[tp,tf,fp,fn],[false positive ratio array],[sensitive array],auc,[precision array],[specificity array]]
function report_ml_value(data)
{
var sensitive=data[2];
var auc=data[3];
var precision=data[4];
var specificity=data[5];
//first get the sensitive not less than 0.9.
var sen_09=0;
for(var i=0;i<sensitive.length;i++)
{
if(sensitive[i]<0.9)
{
sen_09=i-1;
break;
}
}
console.log(sensitive[sen_09]+' '+precision[sen_09]+' '+specificity[sen_09]);
var spe_09=0;
for(var i=0;i<specificity.length;i++)
{
if(specificity[i]>=0.9)
{
spe_09=i;
break;
}
}
console.log(sensitive[spe_09]+' '+precision[spe_09]+' '+specificity[spe_09]);
return [[sensitive[sen_09],precision[sen_09],specificity[sen_09],auc],[sensitive[spe_09],precision[spe_09],specificity[spe_09],auc]];
}
report_array=report_ml_value(roc_tp4)//html_report_value='';
function generate_table_report(name,data)
{
var html_report_value='<table class="table" id="logistic_report'+name+'"> \
<thead> \
<tr> <th scope="col">Name</th> <th scope="col">Sensitive</th> <th scope="col">Precision</th><th scope="col">Specificity</th><th scope="col">AUC</th>\
</tr>\
</thead><body>';
for(var i=0;i<data.length;i++)
{
html_report_value+='<tr><td>'+name+'</td><td>'+data[i][0]+'</td><td>'+data[i][1]+'</td><td>'+data[i][2]+'</td><td>'+data[i][3]+'</td></tr>';
}
html_report_value+='</body></table>';
return html_report_value;
}
name='model1';
report_array=report_ml_value(roc_tp4);
generate_table_report(name,report_array);function select_data_from_id()
{
//get data;
var data= getinforvalue('training_decision');
var label=getinforlabel('label_decision');
var label_unique=sort_unique(label);
//console.log(label_unique);
//merge_matrix()
merge_array=merge_matrix(data,label);
//console.log(merge_array);
merge_array=shufflearray(merge_array);
//console.log(merge_array);
//
var train_range_ratio=[0,1];
var validate_range_ratio=[0,1];
var train_range=[];
var validate_range=[];
var number=parseInt(train_range_ratio[1]*(data.length)) ;
//train_range_ratio[1]*(data.length);
train_range.push(parseInt(train_range_ratio[0]*(data.length)));
train_range.push(parseInt(train_range_ratio[1]*(data.length)));
//
validate_range.push(parseInt(validate_range_ratio[0]*(data.length)));
validate_range.push(parseInt(validate_range_ratio[1]*(data.length)));
//
var train=generate_train_validate_data(label_unique,train_range,merge_array);
trainingData =train[0];
trainingLabel=train[1];
var valide=generate_train_validate_data(label_unique,validate_range,merge_array);
validateData=valide[0];
validateLabel=valide[1];
/*
model=train_model(trainingData[0][1]);
proarr=model_data_probability(model,validateData[0][1]);
rocarray=mljs_validate(proarr,validateLabel[0][1]);
console.log(rocarray);
*/
var data=[];
for(var i=0;i<trainingData.length;i++)
{
var row=[];
row.push(trainingData[i][0]);
model=train_model(trainingData[i][1]);
proarr=model_data_probability(model,validateData[i][1]);
rocarray=mljs_validate(proarr,validateLabel[i][1]);
row.push(rocarray[3]);
row.push(rocarray[1]);
row.push(rocarray[2]);
//console.log(row);
data.push(row);
}
console.log(data);
plot_roc(data,'roc_plot');
}rocarray=mljs_validate(proarr,validateLabel[0][1]);
function mljs_validate(probability,trainingLabel){
var cutoffarray=cutoff(probability);
console.log(probability);
console.log(cutoffarray);
roc_array_label=mljs_determin_label(probability,cutoffarray);
roc_tp4=mljs_label_cross(trainingLabel,roc_array_label);
return roc_tp4;
}