Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I calculate a trend line in PHP?

So I've read the two related questions for calculating a trend line for a graph, but I'm still lost.

I have an array of xy coordinates, and I want to come up with another array of xy coordinates (can be fewer coordinates) that represent a logarithmic trend line using PHP.

I'm passing these arrays to javascript to plot graphs on the client side.

like image 499
Stephen Avatar asked May 04 '10 20:05

Stephen


People also ask

How do you calculate a trend line?

To calculate the trend line for the graph of a linear relationship, find the slope-intercept form of the line, y = mx + b, where x is the independent variable, y is the dependent variable, m is the slope of the line, and b is the y-intercept.

How many points do you get for a trendline?

To create a trendline, an analyst must have at least two points on a price chart.


1 Answers

In case anyone is having problems with the create_function, here is how I edited it. (Though I wasn't using logs, so I did take those out.)

I also reduced the number of calculations and added an R2. It seems to work so far.

function lsq(){
    $X = array(1,2,3,4,5);
    $Y = array(.3,.2,.7,.9,.8);

    // Now estimate $a and $b using equations from Math World
    $n = count($X);

    $mult_elem = function($x,$y){   //anon function mult array elements 
        $output=$x*$y;              //will be called on each element
        return $output;
    };

    $sumX2 = array_sum(array_map($mult_elem, $X, $X));

    $sumXY = array_sum(array_map($mult_elem, $X, $Y));
    $sumY = array_sum($Y);
    $sumX = array_sum($X);

    $bFit = ($n * $sumXY - $sumY * $sumX) /
    ($n * $sumX2 - pow($sumX, 2));
    $aFit = ($sumY - $bFit * $sumX) / $n;
    echo ' intercept ',$aFit,'    ';
    echo ' slope ',$bFit,'   ' ;    

    //r2
    $sumY2 = array_sum(array_map($mult_elem, $Y, $Y));
    $top=($n*$sumXY-$sumY*$sumX);
    $bottom=($n*$sumX2-$sumX*$sumX)*($n*$sumY2-$sumY*$sumY);
    $r2=pow($top/sqrt($bottom),2);
    echo '  r2  ',$r2;
}
like image 113
Dr. Pierce Avatar answered Oct 06 '22 03:10

Dr. Pierce