D3.js linear regression

前端 未结 2 833
失恋的感觉
失恋的感觉 2020-12-29 13:35

I searched for some help on building linear regression and found some examples here:
nonlinear regression function
and also some js libraries that should cover this

2条回答
  •  旧巷少年郎
    2020-12-29 14:10

    I made it work using the following code found here:

       function linearRegression(y,x){
    
            var lr = {};
            var n = y.length;
            var sum_x = 0;
            var sum_y = 0;
            var sum_xy = 0;
            var sum_xx = 0;
            var sum_yy = 0;
    
            for (var i = 0; i < y.length; i++) {
    
                sum_x += x[i];
                sum_y += y[i];
                sum_xy += (x[i]*y[i]);
                sum_xx += (x[i]*x[i]);
                sum_yy += (y[i]*y[i]);
            } 
    
            lr['slope'] = (n * sum_xy - sum_x * sum_y) / (n*sum_xx - sum_x * sum_x);
            lr['intercept'] = (sum_y - lr.slope * sum_x)/n;
            lr['r2'] = Math.pow((n*sum_xy - sum_x*sum_y)/Math.sqrt((n*sum_xx-sum_x*sum_x)*(n*sum_yy-sum_y*sum_y)),2);
    
            return lr;
    
    };
    
    var yval = dataset.map(function (d) { return parseFloat(d.xHeight); });
    var xval = dataset.map(function (d) { return parseFloat(d.Ascendenti); });
    
    
    var lr = linearRegression(yval,xval);
    // now you have:
    // lr.slope
    // lr.intercept
    // lr.r2
    console.log(lr);
    

    And then plotting a line with:

    var max = d3.max(dataset, function (d) { return d.OvershootingSuperiore; });
    var myLine = svg.append("svg:line")
                .attr("x1", x(0))
                .attr("y1", y(lr.intercept))
                .attr("x2", x(max))
                .attr("y2", y( (max * lr.slope) + lr.intercept ))
                .style("stroke", "black");
    

    Using the code I found here

提交回复
热议问题