Outlier Calculation

Outlier Calculation for Data Bridges, done by Samir converting code from R script made by Friederike (WFP)

by brainsengineering

JavaScript

function variance(values){
  var avg = mean(values);
  
  var squareDiffs = values.map(function(value){
    var diff = value - avg;
    var sqrDiff = diff * diff;
    return sqrDiff;
  });
  
  var sum = 0;
  for (var i = 0; i < squareDiffs.length; i++) {
  	sum = sum + squareDiffs[i];
  }
  
  var variance = sum / (values.length - 1);

  return variance;
}

function mean(data){
	var sum = 0;
  for (var i = 0; i < data.length; i++) {
  	sum = sum + data[i];
  }

  var avg = sum / data.length;
  return avg;
}

function verifyOutliers(x) {
	var N = x.length
	var x_mean = mean(x);
	
  var e = [];
  e.length = N;
  for (var i = 0; i < N; i++) {
  	e[i] = x[i] - x_mean;
  }
	var e_var = variance(e);

  var d = [];
  d.length = N;
  for (var i = 0; i < N; i++) {
  	d[i] = Math.abs(e[i]/x_mean);
  }
  
	var vf = [];  
  var differenceTenPercent = false;
  
  vf.length = N;
  for (var i = 0; i < N; i++) {
    if (d[i] > 0.1) {
      vf[i] = 1;
      differenceTenPercent = true;
    } else {
      vf[i] = 0;
    }
  }
  
  
  //console.log('> differenceTenPercent:' + differenceTenPercent);
  console.log(x);
  console.log(d);
  if (N === 3 && differenceTenPercent === false) {
    console.log('10% diff false and N===3: ' + vf);
    return vf;
  }
  
	var N_1 = N-1;
	var N_2 = N-2;

	var s = [];
  s.length = N;
  for (var i = 0; i < N; i++) {
  	s[i] = Math.sqrt((e_var * N_1 / N_2) - e[i]*e[i] * N/(N_1 * N_2));
  }
  
	var r = [];
	r.length = N;
	var N_sqrt = Math.sqrt((N_1/N))

	for (i = 0; i < N; i++) { 
  		r[i] = e[i] / (s[i]*N_sqrt)
	}

  for (var i = 0; i < N; i++) {
  	vf[i] = (r[i] > (3 + ((N <=6)?1:0))?1:0);
  }
  return vf;
}

function hasOutliers(flags) {
	for (var i = 0; i < flags.length; i++) {
    if (flags[i] == 1) {
      return true; 
    } 
  }
	return false; 
}

function verifyAllOutliers(x) {
	var N = x.length;
  var data = [];
  data.length = N;
  for (var i = 0; i < N; i++) {
  	data[i] = x[i];
  }
  flags = verifyOutliers(data);
 ...