执行独立性检验#
考虑以下包含三个变量的数据集。
>>> import numpy as np, pandas as pd
>>>
>>> X = np.random.normal(loc=0, scale=1, size=1000)
>>> Y = 2 * X + np.random.normal(loc=0, scale=1, size=1000)
>>> Z = 3 * Y + np.random.normal(loc=0, scale=1, size=1000)
>>> data = pd.DataFrame(data=dict(X=X, Y=Y, Z=Z))
假设提供的因果图是 \(X \rightarrow Y \rightarrow Z\)。此图表明在给定 \(Y\) 的情况下,\(X\) 应该独立于 \(Z\)。要使用核依赖度量来检验 \(X\) 在给定 \(Y\) 的情况下是否条件独立于 \(Z\),您只需执行以下操作:
>>> import dowhy.gcm as gcm
>>>
>>> # Null hypothesis: x is independent of y given z
>>> p_value = gcm.independence_test(X, Z, conditioned_on=Y, method='kernel')
>>> p_value
0.48386151342564865
例如,如果我们定义一个阈值为 0.05,那么只有当 p 值低于此阈值时,我们才会拒绝独立性。请注意,严格来说,我们只能拒绝独立性,而不能在 p 值高于阈值时接受它。然而,在实践中,人们可能仍会将上述结果视为变量条件独立的证据。鉴于我们使用因果图 \(X \rightarrow Y \rightarrow Z\) 生成数据,其中 \(Z\) 在给定 \(Y\) 的情况下条件独立于 \(X\),这也符合我们的预期。
假设我们得到的不是真实图,而是数据集的以下图:\(X \rightarrow Y \leftarrow Z\)。根据该图,Y 是一个对撞点(collider),因此该图暗示 \(X\) 和 \(Z\) 是独立的。为了测试 \(X\) 是否独立于 \(Z\)(不以 \(Y\) 为条件),我们使用同一个函数,但不带第三个参数。
>>> # Null hypothesis: x is independent of y
>>> p_value = gcm.independence_test(X, Z, method='kernel')
>>> p_value
0.0
同样,我们可以定义一个阈值为 0.05,但这次 p 值明显低于此阈值,我们可以明确拒绝独立性的原假设。也就是说,\(X\) 和 \(Z\) 是相互依赖的。因此,该图是不正确的,在使用它执行任何因果任务之前需要进行修改。同样,这也符合我们的预期,因为在我们的数据集中,\(Z\) 依赖于 \(Y\),而 \(Y\) 依赖于 \(X\),但我们没有以 \(Y\) 为条件。