Google-sheets – Probability Density Function of a Chi Distribution

google sheetsgoogle-apps-script

I'm trying to write an extension for Google Sheets to add the CHIDIST() function as in Microsoft Excel and LibreOffice Calc. My current attempt does not produce the same results as the LibreOffice function. Any help would be greatly appreciated.

function CHIDIST(value, degrees_of_freedom) {
  x = value;
  v = degrees_of_freedom;
  if(x>0) {
    return (Math.pow(x,(v-2)/2)*Math.pow(Math.E,-x/2))/(Math.pow(2,v/2)*gamma(v/2));
  }
  else {
    return 0;
  }
}

function gamma(x){
    var p = [0.99999999999980993, 676.5203681218851, -1259.1392167224028,
        771.32342877765313, -176.61502916214059, 12.507343278686905,
        -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7];

    var g = 7;
    if(x < 0.5){
        return Math.PI / (Math.sin(Math.PI * x)*gamma(1-x));
    }

    x -= 1;
    var a = p[0];
    var t = x+g+0.5;
    for(var i = 1; i < p.length; i++){
        a += p[i]/(x+i);
    }

    return Math.sqrt(2*Math.PI)*Math.pow(t, x+0.5)*Math.exp(-t)*a;
}

This is the equation that I modeled the program after:

Wikipedia ChiDist PDF

Best Answer

Your function works correctly, in the sense that it gives the probability density function of the χ²-distribution. It returns the same results as =CHISQ.DIST(x,v,FALSE) in Excel 2013. Note that "false" here means "not cumulative".

The LibreOffice function =CHIDIST(x;v) and (old-fashioned) Excel function =CHIDIST(x,v) return the right-tailed cumulative probability. Its modern Excel equivalent is =CHISQ.DIST.RT(x,v).

There is a formula for the cumulative distribution function for χ²-distribution; it involves the lower incomplete gamma function, so you'll need to find an implementation of that first. At the end of computation you'll need to subtract the result from 1 to get the right tail instead of left.