Skip to content

Instantly share code, notes, and snippets.

@nealalan
Created August 5, 2019 23:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nealalan/4181555a0e5cdbd0bef1515e2ea3ac65 to your computer and use it in GitHub Desktop.
Save nealalan/4181555a0e5cdbd0bef1515e2ea3ac65 to your computer and use it in GitHub Desktop.
JavaScript Computing Correlation
  • function that computes the ϕ coefficient from such an array:
function phi(table) {
  return (table[3] * table[0] - table[2] * table[1]) /
    Math.sqrt((table[2] + table[3]) *
              (table[0] + table[1]) *
              (table[1] + table[3]) *
              (table[0] + table[2]));
}
console.log(phi([76, 9, 4, 1]));
// → 0.068599434
  • extract a two-by-two table for a specific event from the journal, we must loop over all the entries and tally how many times the event occurs
function tableFor(event, journal) {
  let table = [0, 0, 0, 0];
  for (let i = 0; i < journal.length; i++) {
    let entry = journal[i], index = 0;
    if (entry.events.includes(event)) index += 1;
    if (entry.squirrel) index += 2;
    table[index] += 1;
  }
  return table;
}
console.log(tableFor("pizza", JOURNAL));
// → [76, 9, 4, 1]
  • to compute a correlation for every type of event that occurs in the data set, we need to find every type of event
function journalEvents(journal) {
  let events = [];
  for (let entry of journal) {
    for (let event of entry.events) {
      if (!events.includes(event)) {
        events.push(event);
      }
    }
  }
  return events;
}
console.log(journalEvents(JOURNAL));
// → ["carrot", "exercise", "weekend", "bread", …]
  • By going over all the events and adding those that aren’t already in there to the events array, the function collects every type of event. Using that, we can see all the correlations.
for (let event of journalEvents(JOURNAL)) {
  console.log(event + ":", phi(tableFor(event, JOURNAL)));
}
// → carrot:         0.0140970969
// → exercise:       0.0685994341
// → weekend:        0.1371988681
// → bread:         -0.0757554019
// → pudding:       -0.0648203724
// → brushed teeth: -0.3805211953
// → candy:          0.1296407447
// → work:          -0.1371988681
// → spaghetti:      0.2425356250
// → reading:        0.1106828054
// → peanuts:        0.5902679812
// and so on
  • we can manually see the highest two correlations we can combine them to see the correlation
for (let entry of JOURNAL) {
  if (entry.events.includes("peanuts") &&
     !entry.events.includes("brushed teeth")) {
    entry.events.push("peanut teeth");
  }
}
console.log(phi(tableFor("peanut teeth", JOURNAL)));
// → 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment