由于是不可观察的,因此onInterest_in_Acme的平均因果效应是不可识别的。但是,该规则有一个重要的例外,即 if与完全相关(或)。如果这两个变量完全相关(即包含相同的信息),则可以对其进行调整并用于识别平均因果效应。Loyalty Club MembershipSpendInterest_in_Acmer=1.0r=0.0Spend_in_Prev_YearSpend_in_Prev_Year
Interest_in_Acme在与有点相关的更有可能的情况下Spend_in_Prev_Year,可以获得对平均因果效应的有点偏颇的估计。两者相关的越多,调整后的估计偏差就越小Spend_in_Prev_Year。
一个简单的模拟研究
为了演示这个概念,下面是一个简单的模拟研究(Python 3.5+ 代码)。令 be , be , be ,是治疗计划下的潜力,是观察到的支出。为简单起见,我的模拟使用二进制变量。为了减少样本量的可变性,我设置了。对于平均因果效应的估计,我使用了标准化的平均差(即 g-formula、do-calculus 等)LInterest_in_AcmeL∗Spend_in_Prev_YearALoyalty Club MembershipY(a)SpendaYn=1,000,000
import numpy as np
import pandas as pd
# Simulation parameters
n = 1000000
correlation = 1.0
np.random.seed(20191223)
# Simulating data set
df = pd.DataFrame()
df['L'] = np.random.binomial(n=1, p=0.25, size=n)
df['L*'] = np.random.binomial(n=1, p=correlation*df['L'] + (1-correlation)*(1-df['L']), size=n)
df['A'] = np.random.binomial(1, p=(0.25 + 0.5*df['L']), size=n)
df['Ya0'] = np.random.binomial(1, p=(0.75 - 0.5*df['L']), size=n)
df['Ya1'] = np.random.binomial(1, p=(0.75 - 0.5*df['L'] - 0.1*1 -0.1*1*df['L']), size=n)
df['Y'] = (1-df['A'])*df['Ya0'] + df['A']*df['Ya1']
# True causal effect
print("True Causal Effect:", np.mean(df['Ya1'] - df['Ya0']))
# Standardized Mean Estimator
l1 = np.mean(df['L*'])
l0 = 1 - l1
r1_l0 = np.mean(df.loc[(df['A']==1) & (df['L*']==0)]['Y'])
r1_l1 = np.mean(df.loc[(df['A']==1) & (df['L*']==1)]['Y'])
r0_l0 = np.mean(df.loc[(df['A']==0) & (df['L*']==0)]['Y'])
r0_l1 = np.mean(df.loc[(df['A']==0) & (df['L*']==1)]['Y'])
rd_stdmean = (r1_l0*l0 + r1_l1*l1) - (r0_l0*l0 + r0_l1*l1)
print('Standardized Mean Risk Difference:', rd_stdmean)
下面是一些各种相关性的结果(您也可以运行此代码并更改correlation参数以查看各种更改的结果。注意是没有相关性r=0.50
真实平均因果效应:-0.124
r=1.0:-0.123
r=0.99:-0.136
r=0.50:-0.347
r=0.05:-0.180
概括
作为一个理由,您可能相信Interest_in_Acme并且Spend_in_Prev_Year高度相关,这意味着您可能接近真正的平均因果效应。虽然您无法完全确定,但您可能认为这两个变量高度相关,因此您的估计接近事实。最后一点,对于连续变量,这个问题变得更加复杂,因为变量的函数形式可能不同。