Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Standard deviation javascript

I am trying to get the standard deviation of a user input string. I have as follows, but it returns the wrong value for SD. The calculation should go as follows: Sum values/number values = mean Square (sum each value-mean) Sum squares/number values.

Assistance appreciated (and explanation if possible):

function sum() {
  var val = document.getElementById('userInput').value;
  var temp = val.split(" ");
  var total = 0;
  var v;
  var mean = total / temp.length;
  var total1 = 0;
  var v1;
  var temp23;
  var square;

  for (var i = 0; i < temp.length; i++) {
    v = parseFloat(temp[i]);
    total += v;
  }

  mean = total / temp.length;

  for (var i = 0; i < temp.length; i++) {
    v1 = parseFloat(Math.pow(temp[i] - mean), 2);
    total1 += v1;
  }


  temp23 = total1 / temp.length;
  square = Math.sqrt(temp23);

  document.write(total + '<br />');
  document.write(mean + '<br />');
  document.write(square);
}
<html>

<head>
</head>

<body>
  <form id="input">
    <textarea id="userInput" rows=20 cols=20></textarea>
    <input id="Run" type=Button value="run" onClick="sum()" />
  </form>
</body>

</html>
like image 966
tc03 Avatar asked Sep 08 '11 06:09

tc03


People also ask

What is standard deviation in array?

Returns the standard deviation, a measure of the spread of a distribution, of the array elements. The standard deviation is computed for the flattened array by default, otherwise over the specified axis.

How does Javascript calculate variance?

To calculate the variance we use the map() method and mutate the array by assigning (value – mean) ^ 2 to every array item, and then we calculate the sum of the array, and then we divide the sum with the length of the array.


4 Answers

Shorthand method for getting standard deviation from an array if you don't like lots of code:

function getStandardDeviation (array) {   const n = array.length   const mean = array.reduce((a, b) => a + b) / n   return Math.sqrt(array.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n) } 
like image 76
Foxcode Avatar answered Oct 06 '22 00:10

Foxcode


For anyone looking for a more generic solution, here's a standard deviation function added to the Array#. The function expects to be called on an array of numbers.

Array.prototype.stanDeviate = function(){    var i,j,total = 0, mean = 0, diffSqredArr = [];    for(i=0;i<this.length;i+=1){        total+=this[i];    }    mean = total/this.length;    for(j=0;j<this.length;j+=1){        diffSqredArr.push(Math.pow((this[j]-mean),2));    }    return (Math.sqrt(diffSqredArr.reduce(function(firstEl, nextEl){             return firstEl + nextEl;           })/this.length)); }; 
like image 39
cssimsek Avatar answered Oct 06 '22 00:10

cssimsek


function getStandardDeviation(numbersArr) {
    // CALCULATE AVERAGE
    var total = 0;
    for(var key in numbersArr) 
       total += numbersArr[key];
    var meanVal = total / numbersArr.length;
    // CALCULATE AVERAGE
  
    // CALCULATE STANDARD DEVIATION
    var SDprep = 0;
    for(var key in numbersArr) 
       SDprep += Math.pow((parseFloat(numbersArr[key]) - meanVal),2);
    var SDresult = Math.sqrt(SDprep/(numbersArr.length-1));
    // CALCULATE STANDARD DEVIATION

    return SDresult;       
}

var numbersArr = [10, 11, 12, 13, 14];
alert(getStandardDeviation(numbersArr));
like image 27
Berk Kanburlar Avatar answered Oct 05 '22 23:10

Berk Kanburlar


I think the (main) problem is on this line:

v1 = parseFloat(Math.pow(temp[i]-mean),2);

Should be:

v1 = Math.pow(parseFloat(temp[i])-mean),2);

Your code is trying to use the string in temp[i] as a number and subtract mean from it, and then square it, and then parse the resulting value. Need to parseFloat before using it in a calculation. Also you've got the ,2 outside the closing parenenthesis for the Math.pow call so the squaring won't work either.

Would be helpful to use more meaningful variable names too, I mean, e.g., you have a variable called "square" that holds the result of a square-root operation.

P.S. You need to add some error checking in case the user enters non-numeric data. Check that the result of parseFloat() is not NaN. I'd be inclined to do an initial loop through the array parsing and checking for valid numbers, storing the parsed numbers in a second array (or writing them back to the first array), and if any are invalid give the user an error message at that point and stop. Then in your actual calculations you don't have to worry about parsing as you go (or, in your case, parsing again in the second loop).

like image 38
nnnnnn Avatar answered Oct 05 '22 22:10

nnnnnn