在 Python 中测试随机变量的独立性

数据挖掘 Python 统计数据 特征选择
2021-09-15 15:30:50

Python中是否有任何工具可以测试两个随机变量(数据列)的独立性?我有两列数据XY. 它们都可以是离散的,具有值{0,1}或者其中之一可以是连续的。我想进行一些统计测试以确保它们是独立的。我正在使用 Python,所以很高兴实现一些现成的工具。如果不难的话,我也会使用 R。

3个回答

正如Mephy的 Cross-Validated SO 的链接中所讨论的,这不是一件容易的事。

如果它们是独立的,您可能会期望变量对之间的相关性接近于零。这意味着对这两个变量之一的任何了解都不会让您对第二个变量的行为有任何了解。为此,这里有一个很好的答案,它展示了如何计算 Pandas DataFrame 中所有列的成对 pearson 相关性(具有相应的 p 值)。

Pearson 相关性确实假设您的随机变量是正态分布的,因此在解释结果时请记住这一点。或者,您可以将该pearsonr函数换成 Spearman Rank 相关函数:spearmanr,它不假定变量的正态性。

仅使用 Pandas DataFrame 的另一种(可能更简单)方法是使用内置方法corr:这需要一个关键字method,它允许您指定以下三个之一:

方法:{'pearson', 'kendall', 'spearman'}


如果你的随机变量是时间序列的(你没有提到它),另一个可能的工具是Granger Causality这也可以跨变量成对(或成批)执行。它测试当模型中包含不同变量的历史值时,是否可以更好地预测变量的未来值。例如,如果StockA的价格可以使用它自己前 5 天的价格以 52% 的准确率预测,格兰杰检验将有一个零假设,即包括来自StockB的一些滞后不会提高准确性。因此,如果在包括 StockB 的滞后价格时,准确率确实上升到 53%(并且检验是显着的),则拒绝原假设,我们说 StockB Granger-cause StockA。

这是vars在 R 的包中实现的(还有其他的)。作为奖励,此版本还可以对预测变量和目标变量的误差过程中的相关性执行 Wald 检验。

这是一个很难解决的问题,有许多测试试图回答它。. 测试它的一种方法是使用互信息,在 scikit-learn 上可用于连续变量离散变量对于自变量,它返回零,并且值越高,变量之间的依赖性就越大(使得更难将某些东西称为“独立/依赖”,但更容易通过它们的独立性对特征进行排名)。

from sklearn.feature_selection import mutual_info_regression
import numpy as np

x = np.linspace(0, 10, 50)
y = x + np.random.randn(50)
z = np.random.randn(50)

# reshape necessary because the function accepts many
# features at once to be compared with the right-hand side
print(mutual_info_regression(x.reshape(-1, 1), y))
print(mutual_info_regression(x.reshape(-1, 1), z))

> 1.20832658
> 0

为了那些寻找更多关于测试独立性的信息的流浪者,在这种情况下是有条件的,我参考了我最近阅读的一篇论文,尽管它可能不是 OP 正在寻找的。

加州理工学院的研究人员提出了一种有趣的方法,他们在这里使用决策树来测试条件独立性

对应的仓库在这里

与其他方法相比,这种方法的一个明显优势是它的速度。我说很明显,因为我还没有尝试过。尽管如此,论文中包含的基准测试仍然令人印象深刻。