计算两个布尔向量之间的 Pearson 或 Spearman 相关是否有意义?

机器算法验证 相关性 二进制数据 皮尔逊-r 斯皮尔曼罗
2022-02-03 02:47:14

有两个布尔向量,它们只包含 0 和 1。如果我计算 Pearson 或 Spearman 相关性,它们是否有意义或合理?

4个回答

只要两个二元变量(例如和一些 ,就定义了 Pearson 和 Spearman 相关性。通过考虑两个变量的散点图,很容易对它们的含义有一个很好的定性概念。显然,只有四种可能性(因此为了可视化而抖动相同的点是个好主意)。例如,在两个向量相同的任何情况下,每个向量都有一些 0 和一些 1,那么根据定义并且相关性必然是类似地,01yx(0,0),(0,1),(1,0),(1,1)y=x1y=1x然后相关性为1

对于这种设置,没有非线性的单调关系的范围。的等级时,等级只是原始的线性变换,并且 Spearman 相关必然与 Pearson 相关相同。因此,这里没有理由单独考虑 Spearman 相关性,或者根本就没有理由。0101

对于一些涉及 s 和 s 的问题,例如在时间或空间中的二元过程研究中,相关性自然会出现。然而,总体而言,将有更好的方式来思考这些数据,这在很大程度上取决于此类研究的主要动机。例如,相关性很有意义这一事实并不意味着线性回归是对二元响应建模的好方法。如果其中一个二元变量是响应,那么大多数统计人员会从考虑 logit 模型开始。01

二元向量有专门的相似度度量,例如:

  • 杰卡德-李约瑟
  • 骰子
  • 圣诞节
  • 罗素-饶
  • 索卡尔-米切纳
  • 罗杰斯-谷本
  • 库尔津斯基

等等

有关详细信息,请参阅此处

我不建议对二进制数据使用 Pearson 的相关系数,请参见以下反例:

set.seed(10) 
a = rbinom(n=100, size=1, prob=0.9) 
b = rbinom(n=100, size=1, prob=0.9)

在大多数情况下,两者都给出 1

table(a,b)

> table(a,b)
   b
a    0  1
  0  0  3
  1  9 88

但相关性并未表明这一点

cor(a, b, method="pearson")

> cor(a, b, method="pearson")
[1] -0.05530639

然而,诸如Jaccard 指数之类的二元相似性度量显示了更高的关联:

install.packages("clusteval")
library('clusteval')
cluster_similarity(a,b, similarity="jaccard", method="independence")

> cluster_similarity(a,b, similarity="jaccard", method="independence")
[1] 0.7854966

为什么是这样?在这里看到简单的二元回归

plot(jitter(a, factor = .25), jitter(b, factor = .25), xlab="a", ylab="b", pch=15, col="blue", ylim=c(-0.05,1.05), xlim=c(-0.05,1.05))
abline(lm(a~b), lwd=2, col="blue")
text(.5,.9,expression(paste(rho, " = -0.055")))

下图(添加小噪音以使点数更清晰) 双变量回归线

Arne 上面的回答并不完全正确。相关性是变量之间相关性的度量。样本 A 和 B 都是独立的抽取,尽管它们来自相同的分布,所以我们应该期望 ~0 相关性。

运行类似的模拟并创建一个取决于 a 值的新变量 c:

from scipy import stats
a = stats.bernoulli(p=.9).rvs(10000)
b = stats.bernoulli(p=.9).rvs(10000)

dep = .9
c = []
for i in a:
    if i ==0:
        # note this would be quicker with an np.random.choice()
        c.append(stats.bernoulli(p=1-dep).rvs(1)[0])
    else:
        c.append(stats.bernoulli(p=dep).rvs(1)[0])

我们可以看到

stas.pearsonr(a,b) ~= 0
stas.pearsonr(a,c) ~= 0.6
stats.spearmanr(a,c) ~=0.6
stats.kendalltau(a,c) ~=0.6