function getLSRModel(raw_data, columns, response_col) {
let data = raw_data.map( function (row) {
return [1].concat(columns.map( col_name => row[col_name]));
} );
let data_t = math.transpose(data);
let y = raw_data.map( row => [row[response_col]]);
let something = math.multiply(data_t, data)
let something2 = math.multiply(data_t, y)
let beta_matrix = math.multiply(math.inv(something), something2);
let predictor_obj = {
predict: x => {
var beta0 = beta_matrix[0][0];
return beta0 + (beta_matrix.slice(1).map((b, i) => b[0] * x[i]).reduce(add));
},
getBetaMatrix: () => { return beta_matrix; }
}
let mean = d3.mean(y);
let predictions = data.map( x => predictor_obj.predict( x.slice(1) ) );
predictor_obj["predictions"] = predictions;
let ssr = calcSSR(y, predictions);
let sst = calcSST(y, mean);
let r_squared = 1 - (ssr/sst);
let adj_r_squared = 1 - ((1-r_squared)*(data.length - 1)/(data.length - columns.length - 1));
predictor_obj["r_squared"] = r_squared;
predictor_obj["adj_r_squared"] = adj_r_squared;
return predictor_obj;
}