Math/Statistics: Weighted Least Squares Linear Regression in Php

Posted on 2007-10-19
Last Modified: 2013-11-13
So, I have years, data points (valus) and weights (for data values).

How do I implement a method or class in Php for achieving Weighted Least Squares Linear Regression.

Any math wizards out there willing to help? Pseudo code will do, I can Php'ize it.

Question by:lexxwern
    LVL 26

    Expert Comment

    I am not familiar with Pseudo code but if you can do the least squares part I can suggest an inelligant way to weight your values.
    LVL 12

    Author Comment

    Hi aburr,

    Yes, I have code for that. I'll be using the Least Square Fit class. Let me post the code:

    generate equation for straight line
    picture of plot

    class ymxc{
    var $input; //array (x,y)
    //converts to selected colom to log
    function line(){
    //output m & c
    retrival variables
    expanded array array(x, y, xy, x^2) - $input[][2], $input[][3]
    n count of array
    returns constant and gradient
    foreach($this->input as $in){
    return $output;
    /* OU MS284 unit 7 page 41
    ISBN= 7492 2066 2 */

    function residuals(){
    expands array to include model array[][4]
    foreach($this->input as $ii){
    foreach ($this->input as $key => $in)$res[$key]  = $in[5];
    return $this->sdv($res);

    function sdv($array){
    foreach($array as $in){
    return $output;

    function plot($title,$xtitle,$ytitle,$plotname){
    requirs there to be an array of data
    Plots picture of array with line through
    writes picture to disk plot-datenumber.png
    plot needs title xtitle and ytitle

    $plot = imagecreate(600, 450);
    $bg=imagecolorallocate($plot, 239, 239, 239);
    imagefilledrectangle ($plot, 50, 50, 550, 400, imagecolorallocate($plot, 255, 255, 255));//plot size 500 x 350
    $font = 'Font.TTF';
    $texcol = imagecolorallocate($plot, 0, 0, 0);
    //separate into colomns find min and max
    foreach ($this->input as $key => $in) {
    $x[$key]  = $in[0];
    $y[$key]  = $in[1];

    sort($y, SORT_NUMERIC);
    sort($x, SORT_NUMERIC);

    //echo "<br/>ranges miny $miny maxy $maxy yrange $yrange" ;

    //plot points
    //imagettftext($plot, 10, 0, 50, 420, $texcol, $font, round($x[0]));
    //imagettftext($plot, 10, 0, 20, 400, $texcol, $font, round($y[0]));
    $xpoint= (($xx[$i]-$x[0])/$xrange*500)+45;
    $ypoint= (400-(($yy[$i]-$y[0])/$yrange*350));
    imagettftext($plot, 10, 0, $xpoint, $ypoint, $texcol, $font, "x");
    //echo "<br>$i x= $xpoint, y=$ypoint";
    if(!isset($xtitle))$xtitle="X Values";
    imagettftext($plot, 15, 0, 250, 440, $texcol, $font, $xtitle);
    if(!isset($ytitle))$ytitle="Y Values";
    imagettftext($plot, 15, 90, 20, 240, $texcol, $font, $ytitle);
    imagettftext($plot, 20, 0, 100, 30, $texcol, $font, $title);
    imagettftext($plot, 10, 0, 450, 40, imagecolorallocate($plot, 0, 0, 255), $font, "Gradient =".round($this->gradient,4));
    imagettftext($plot, 10, 0, 450, 20, imagecolorallocate($plot, 0, 0, 255), $font, "Constant =".round($this->constant,4));

    //set y markers
    imagettftext($plot, 5, 90, 50, 70*$i+50, $texcol, $font, "|");
    imagettftext($plot, 10, 90, 40, 450-(70*$i+50), $texcol, $font, round($i*($y[count($x)-1]-$y[0])/5+$y[0]));
    imagettftext($plot, 5, 0, 50+500/5*$i, 403, $texcol, $font, "|");  
    imagettftext($plot, 10, 0, 50+500/5*$i, 420, $texcol, $font, round($i*($x[count($x)-1]-$x[0])/5+$x[0]));

    //plot line    

    $t= 400-($t-$y[0])/$yrange*350;
    //imageline ($plot, 50, 400, 550, 50, imagecolorallocate($plot, 255, 0, 0) );
    imagettftext($plot, 10, 0, 15, $s, $texcol, $font, round($this->constant,2).",0");
    imageline ($plot, 50, $s, 550, $t, imagecolorallocate($plot, 255, 0, 0) );
    imageline ($plot, 50, 400-(-$y[0]/$yrange*350), 550, 400-(-$y[0]/$yrange*350), imagecolorallocate($plot, 0, 0, 255) );
    $xo= (($x0-$x[0])/$xrange*500)+50;
    imageline ($plot, $xo, 400, $xo, 50, imagecolorallocate($plot, 0, 255, 0) );
    //imagepng($plot, "plot-".strtotime('now').".png");
    imagepng($plot, $plotname.".png");

    LVL 26

    Accepted Solution

    An inelligant way to apply weights.
    Suppose that you have weights from 1 to 10
    Enter the data point weight times
    That is, if the weight is 5, enter that point five times.
    LVL 12

    Author Comment

    So that is effectively as good as multiplying the weight with the value of the dependent variable. Is that all that separates Linear Regression from Weighted Linear Regression?
    LVL 84

    Expert Comment

    LVL 26

    Expert Comment

    I submitted an answer, the correctness of which was confirmed

    Write Comment

    Please enter a first name

    Please enter a last name

    We will never share this with anyone.

    Featured Post

    Highfive Gives IT Their Time Back

    Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

    Software development teams often use in-memory caches to improve performance. They want to speed up access to, or reduce load on, a backing store (database, file system, etc.) by keeping some or all of the data in memory.   You should implement a …
    These days socially coordinated efforts have turned into a critical requirement for enterprises.
    The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.
    This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.

    779 members asked questions and received personalized solutions in the past 7 days.

    Join the community of 500,000 technology professionals and ask your questions.

    Join & Ask a Question

    Need Help in Real-Time?

    Connect with top rated Experts

    12 Experts available now in Live!

    Get 1:1 Help Now