2013-12-10 148 views
6

我搜索了構建線性迴歸一些幫助,並發現了一些例子在這裏:
nonlinear regression function
,也有一些JS庫,應該包括這一點,但不幸的是我無法讓他們正常工作:
simple-statistics.js這一個:regression.js
隨着regression.js我能得到的mb值行,所以我可以使用y = m*x + b繪製跟隨我的圖的線性迴歸線,但不能申請這些值到行生成器,我試過的代碼如下:D3.js線性迴歸

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"); 

結果的值在控制檯中的以下內容:

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 

從我可以在我應該已經設置了xy值正確控制檯告訴我們,但當然路徑在結果svg沒有顯示(但繪製),所以我不知道該怎麼做了。
任何幫助真的很感激,即使涉及simple.statistics.js庫的解決方案將是有益的!
謝謝!

+0

可以將代碼你用你的代碼創建一個jsfiddle? –

+0

確定只是第二個 – tomtomtom

+0

從github加載的regression.js在jsfiddle中給出了錯誤,所以它不能工作,不幸的是,這裏是我的Dropbox中的文件: http://dl.dropboxusercontent.com/u/37967455/lunghezza_ascendenti- xheight_regressione.html – tomtomtom

回答

9

我做了工作,用下面的代碼中發現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); 

然後繪製符合:

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"); 

使用我發現here

+0

不錯的一個伴侶,這幫助了很多! –

2

它看起來像我的路徑越來越繪製,只是遠離屏幕。

path element in firebug

也許迴歸計算不正確?該問題可能是上線202:

var data = [x.domain(), y.domain()]; 
var result = regression('linear', data); 

如果原始數據看起來像[[1, 500], [2, 300]]這將找到的[[1, 2], [300, 500]線性迴歸這可能不是你想要的。

我猜你想要做的是用整個數據點集合而不是圖形邊界來計算迴歸。然後,而不是爲每個數據值繪製此線,您只需繪製端點。

+0

是啊你指出的是正確的,其實是我問的:) 我使用的域是極端值的數據我用的圈子,我認爲,如果我有這兩個點,該行將生成反正 通過我用這條線得到它的方式: https://github.com/Tom-Alexander/regression-js#linear-regression- 我也嘗試過使用: var assex = [dataset.map(function(d){return d.Ascendenti; })]; var assey = [dataset.map(function(d){return d.xHeight;})]; 但這種方式我不能夠得到所需的數組,因爲它需要[[x0,y0],[x1,y1] .. [xn,yn]] – tomtomtom

+0

離開代碼的最後部分,我嘗試過創建一個包含每個點的值的數組,如下所示: var coord = dataset.map(function(d){return [d.Ascendenti +「,」+ d.xHeight];}); 這實際上返回一個包含每個x和y值的數組的數組,但是變量結果的控制檯日誌記錄了NaN,所以我現在不知道該怎麼做,我有點迷失 – tomtomtom

+0

爲什麼你在做字符串連接嗎?如果您只是返回兩個元素的數組而不是將它們轉換爲字符串,那麼您的代碼應該可以正常工作:var coord = dataset.map(function(d){return [d.Ascendenti,d.xHeight];}); ' – couchand