D3.js线性回归

tom*_*tom 7 javascript linear-regression d3.js

我搜索了一些关于构建线性回归的帮助,并在这里找到了一些例子:
非线性回归函数
以及一些应该覆盖它的js库,但不幸的是我无法使它们正常工作:
simple-statistics.js和这一个:regression.js
随着regression.js我能够获得该行的mb值,所以我可以y = m*x + b用来绘制我的图形的线性回归之后的行,但是不能将这些值应用到行生成器,我尝试的代码是下列:

d3.csv("typeStatsTom.csv", function (error, dataset) {
//Here I plot other stuff, setup the x & y scale correctly etc. 
//Then to plot the line:

        var data = [x.domain(), y.domain()];
        var result = regression('linear', data);
        console.log(result)
        console.log(result.equation[0]);
        var linereg = d3.svg.line()
                        .x(function (d) { return x(d.Ascendenti); })
                        .y(function (d) { return y((result.equation[0] * d.Ascendenti) + result.equation[1]); });
        var reglinepath = svg.append("path")
                            .attr("class", "line")
                            .attr("d", linereg(dataset))
                            .attr("fill", "none")
                            .attr("stroke", "#386cb0")
                            .attr("stroke-width", 1 + "px");
Run Code Online (Sandbox Code Playgroud)

控制台中的结果值如下:

    Object
      equation: Array[2]
        0: 1.8909425770308126
        1: 0.042557422969139225
      length: 2
      __proto__: Array[0]
      points: Array[2]
      string: "y = 1.89x + 0.04"
      __proto__: Object
Run Code Online (Sandbox Code Playgroud)

从我在控制台中可以看出我应该正确设置xy值,但当然svg中的路径没有显示(但是已经绘制),所以我不知道该怎么做了.
任何帮助都非常感谢,即使是涉及simple.statistics.js图书馆的解决方案也会有所帮助!
谢谢!

tom*_*tom 10

我做了工作,用下面的代码发现这里:

   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);
Run Code Online (Sandbox Code Playgroud)

然后绘制一条线:

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");
Run Code Online (Sandbox Code Playgroud)

使用我在这里找到的代码