正如一个 Python 函数:
def magnitude(x): x_sq = [i ** 2 for i in x] return math.sqrt(sum(x_sq))
我们通过将点积除以两个向量大小的乘积的方法得到 cos(ϴ)。
def cosTheta(x,y): mag_x = magnitude(x) mag_y = magnitude(y) return dotProduct(x,y) / (mag_x * mag_y)
现在,如果你对三角学有一定了解,你可能会记得,余弦函数产生一个在 1 和 -1 之间震荡的图形。
cos(ϴ) 的值将根据两个箭头向量之间的角度而发生变化。
- 当角度为零时(即两个向量指向完全相同的方向),cos(ϴ) 等于 1。
- 当角度为 -180°时(两个向量指向完全相反的方向),cos(ϴ) 等于 -1。
- 当角度为 90°时(两个向量指向完全不相关的方向),cos(ϴ) 等于 0。
这可能看起来很熟悉——一个介于 1 和 -1 之间的衡量标准似乎描述了两个向量之间的关系?那不是 Pearson’s r 吗?
那么——这正是它的解释!通过将数据视为高维空间中的箭头向量,我们可以用它们之间的角度 ϴ 作为相似度的衡量。
A) 正相关向量;B) 负相关向量;C) 不相关向量
该角度 ϴ 的余弦在数学上与皮尔逊相关系数相等。当被视为高维箭头时,正相关向量将指向一个相似的方向。负相关向量将指向相反的方向。而不相关向量将指向直角。
就我个人而言,我认为这是一个理解相关性的非常直观的方法。
统计显著性?
正如频率统计一样,重要的是询问从给定样本计算的检验统计量实际上有多重要。Pearson's r 也不例外。
不幸的是,PCC 估计的置信区间不是完全直接的。
这是因为 Pearson's r 被限制在 -1 和 1 之间,因此不是正态分布的。而估计 PCC,例如 0.95 之上只有很少的容错空间,但在其之下有大量的容错空间。
幸运的是,有一个解决方案——用一个被称为 Fisher 的 Z 变换的技巧:
- 像平常一样计算 Pearson's r 的估计值。
- 用 Fisher 的 Z 变换将 r→z,用公式 z = arctanh(r) 完成。
- 现在计算 z 的标准差。幸运的是,这很容易计算,由 SDz = 1/sqrt(n-3) 给出,其中 n 是样本大小。
- 选择显著性阈值,alpha,并检查与此对应的平均值有多少标准差。如果取 alpha = 0.95,用 1.96。
- 通过计算 z (1.96 × SDz) 找到上限,通过计算 z - (1.96 × SDz) 找到下限。
- 用 r = tanh(z) 将这些转换回 r。
- 如果上限和下限都在零的同一侧,则有统计显著性!
这里是在 Python 中的实现:
r = Pearsons(x,y) z = math.atanh(r) SD_z = 1 / math.sqrt(len(x) - 3) z_upper = z 1.96 * SD_z z_lower = z - 1.96 * SD_z r_upper = math.tanh(z_upper) r_lower = math.tanh(z_lower)
当然,当给定一个包含许多潜在相关变量的大数据集时,检查每对的相关性可能很吸引人。这通常被称为「数据疏浚」——在数据集中查找变量之间的任何明显关系。
如果确实采用这种多重比较方法,则应该用适当的更严格的显著性阈值来降低发现错误相关性的风险(即找到纯粹偶然相关的无关变量)。
一种方法是使用 Bonferroni correction。
小结
到现在为止还好。我们已经看到 Pearson's r 如何用来计算两个变量之间的相关系数,以及如何评估结果的统计显著性。给定一组未知的数据,用于开始挖掘变量之间的重要关系是很有可能的。
但是,有一个重要的陷阱——Pearson's r 只适用于线性数据。
看下面的图。它们清楚地展示了一种看似非随机的关系,但是 Pearson's r 非常接近于零。