代码之家  ›  专栏  ›  技术社区  ›  MTT

最适合散点图的回归

  •  2
  • MTT  · 技术社区  · 8 年前

    我绘制了以下散点图,我想在数据中添加一个线性、多项式回归(最适合的回归)。有什么简单的方法吗?

    我的图表很简单,由c3库v4完成(取决于d3 v3):

                <div id="chart2"></div>
                <script>
                    var chart = c3.generate({
                        bindto: '#chart2',
                        data: {
                            url: '../static/CSV/Chart_data/grades_access.csv'+(new Date).getTime(),
                            x:'Access_grade',
                            type: 'scatter'
                        },
                        axis: {
                            y: {
                                label: {
                                    text:"Average grade",
                                    position: "outer-middle"
                                },
                                min:1,
                                max:9
                            },
                            x: {
                                label: {
                                    text:"Access grade PAU",
                                    position: "outer-center"
                                },
                                min:9,
                                max:14
                            }
                        },
                        size: {
                            height: 400,
                            width: 800
                        },
                        zoom: {
                            enabled: true
                        },
                        legend: {
                            show: true,
                            position: 'inset',
                            inset: {
                                anchor: 'top-right',
                                x: 20,
                                y: 300,
                                step: 1
                            }
                        }     
                    }); 
                </script>
    

    和grades\u访问。csv是:

    Access_grade,Subject
    9.85,2.5
    10.64,8.1
    10.0,3.2
    10.92,4.0
    11.69,2.9
    11.79,7.8
    11.03,5.0
    10.47,6.2
    ...
    

    谁能给我一个提示吗?我想要一件简单的东西,不要太夸张。但如果可能的话,用回归方程:) 谢谢

    1 回复  |  直到 8 年前
        1
  •  2
  •   Mark    8 年前

    这个问题我已经回答了好几次了 other libraries 但从来没有 c3.js 下面是使用简单的最小二乘法拟合线性回归的代码。它做到了 onrendered 以便您仍然可以使用 c3 获取和分析csv文件的能力:

    <div id="chart2"></div>
    <script>
        var chart = c3.generate({
          bindto: '#chart2',
          data: {
            url: 'data.csv',
            x: 'Access_grade',
            type: 'scatter'
          },
          axis: {
            y: {
              label: {
                text: "Average grade",
                position: "outer-middle"
              },
              min: 1,
              max: 9
            },
            x: {
              label: {
                text: "Access grade PAU",
                position: "outer-center"
              },
              min: 9,
              max: 14
            }
          },
          size: {
            height: 400,
            width: 800
          },
          zoom: {
            enabled: true
          },
          legend: {
            show: true,
            position: 'inset',
            inset: {
              anchor: 'top-right',
              x: 20,
              y: 300,
              step: 1
            }
          },
    
          onrendered: function(c) {
            var points = chart.data()[0].values.map((d) => [d.x, d.value]),
              slopeIntercept = slopeAndIntercept(points),
              fitPoints = chart.data()[0].values.map((d) => slopeIntercept.slope * d.x + slopeIntercept.intercept);
    
            chart.load({
              columns: [
                ['Regression'].concat(fitPoints)
              ],
              type: 'line'
            });
          }
        });
    
        // simple linear regression
        slopeAndIntercept = function(points) {
          var rV = {},
            N = points.length,
            sumX = 0,
            sumY = 0,
            sumXx = 0,
            sumYy = 0,
            sumXy = 0;
    
          // can't fit with 0 or 1 point
          if (N < 2) {
            return rV;
          }
    
          for (var i = 0; i < N; i++) {
            var x = points[i][0],
              y = points[i][1];
            sumX += x;
            sumY += y;
            sumXx += (x * x);
            sumYy += (y * y);
            sumXy += (x * y);
          }
    
          // calc slope and intercept
          rV['slope'] = ((N * sumXy) - (sumX * sumY)) / (N * sumXx - (sumX * sumX));
          rV['intercept'] = (sumY - rV['slope'] * sumX) / N;
          rV['rSquared'] = Math.abs((rV['slope'] * (sumXy - (sumX * sumY) / N)) / (sumYy - ((sumY * sumY) / N)));
    
          return rV;
        }
    </script>
    

    这是跑步 example