计算关联性

我们可以用包含 4 个元素的数组([76,9,4,1])来表示一张 2 乘 2 的表格。我们也可以使用其他表示方式,比如包含两个数组的数组,每个子数组又包含两个元素([[76,9],[4,1]])。也可以使用一个对象,它包含一些属性,名为"11""01"。但是,一维数组更为简单,也容易进行操作。我们可以将数组索引看成包含两个二进制位的数字,左边的(高位)数字表示绑定“是否变成松鼠”,右边的(低位)数字表示事件绑定。例如,若二进制数字为 10,表示雅克变成了松鼠,但事件并未发生(比如说吃比萨)。这种情况发生了 4 次。由于二进制数字 10 的十进制是 2,因此我们将其存储到数组中索引为 2 的位置上。

下面这个函数用于计算数组的系数ϕ

  1. function phi(table) {
  2. return (table[3] * table[0] - table[2] * table[1]) /
  3. Math.sqrt((table[2] + table[3]) *
  4. (table[0] + table[1]) *
  5. (table[1] + table[3]) *
  6. (table[0] + table[2]));
  7. }
  8. console.log(phi([76, 9, 4, 1]));
  9. // → 0.068599434

这将ϕ公式直接翻译成 JavaScript。 Math.sqrt是平方根函数,由标准 JavaScript 环境中的Math对象提供。 我们必须在表格中添加两个字段来获取字段,例如n1因为行和或者列和不直接存储在我们的数据结构中。

雅克花了三个月的时间记录日志。在本章的代码沙箱(http://eloquentjavascript.net/code/)的下载文件中,用JOURNAL绑定存储了该结果数据集合。

若要从这篇记录中提取出某个特定事件的 2 乘 2 表格,我们首先需要循环遍历整个记录,并计算出与变身成松鼠相关事件发生的次数。

  1. function hasEvent(event, entry) {
  2. return entry.events.indexOf(event) != -1;
  3. }
  4. function tableFor(event, journal) {
  5. let table = [0, 0, 0, 0];
  6. for (let i = 0; i < journal.length; i++) {
  7. let entry = journal[i], index = 0;
  8. if (entry.events.includes(event)) index += 1;
  9. if (entry.squirrel) index += 2;
  10. table[index] += 1;
  11. }
  12. return table;
  13. }
  14. console.log(tableFor("pizza", JOURNAL));
  15. // → [76, 9, 4, 1]

数组拥有includes方法,检查给定值是否存在于数组中。 该函数使用它来确定,对于某一天,感兴趣的事件名称是否在事件列表中。

tableFor中的循环体通过检查列表是否包含它感兴趣的特定事件,以及该事件是否与松鼠事件一起发生,来计算每个日记条目在表格中的哪个盒子。 然后循环对表中的正确盒子加一。

我们现在有了我们计算个体相关性的所需工具。 剩下的唯一一步,就是为记录的每种类型的事件找到关联,看看是否有什么明显之处。