Published
Edited
Aug 9, 2022
1 fork
Insert cell
# Linear Regression on NBA Salaries
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
predictor = getLSRModel(nba_full, reg_vars, "Salary");
Insert cell
Insert cell
Insert cell
columns = [
"Player",
"Age",
"Salary",
"PPG",
"ThreePtPct",
"AST",
"TOV",
"PF"
]
Insert cell
predictor_columns = [
"PPG",
"ThreePtPct",
"AST",
"TOV",
"PF"
]
Insert cell
math = require('https://unpkg.com/mathjs@5.0.1/dist/math.min.js')
Insert cell
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; }
}

// Calculate R^2
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;
}
Insert cell
function calcSSR(y, predictions) {
let sum = 0;
for (let i = 0; i < y.length; i++) {
let diff = y[i] - predictions[i];
sum += diff*diff;
}
return sum;
}
Insert cell
function calcSST(y, mean) {
let sum = 0;
for (let i = 0; i < y.length; i++) {
let diff = y[i] - mean;
sum += diff*diff;
}
return sum;
}
Insert cell
add = (v1, v2) => {return v1 + v2};
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more