【python因果推断库1】协方差分析(ANCOVA)用于处理前/后非等效组设计
目录
生成合成数据
分析
这是一个基于合成数据的初步示例。希望不久之后能用真实研究的数据进行更新。
在只有一次预处理测量和一次后处理测量的情况下,我们可以使用类似于协方差分析(ANCOVA)的方法来分析非等效组设计(NEGD)实验的数据。基本模型是:
i指第i个样本,指给样本i的treatment,是pre treatment,是post treatment,是一个截距项。非零值表示未经处理组随时间的变化,是斜率。是残差。
import matplotlib.pyplot as plt
import seaborn as sns
import causalpy as cp
%load_ext autoreload
%autoreload 2
%config InlineBackend.figure_format = 'retina'
seed = 42
生成合成数据
df = cp.load_data("anova1")
df.head()
让我们以两种不同的方式来可视化这些数据。
_, ax = plt.subplots(1, 2, figsize=(11, 5))
# ANCOVA plot
ax[0].axline((7, 7), (15, 15), color="k")
sns.scatterplot(x="pre", y="post", hue="group", alpha=0.5, data=df, ax=ax[0])
ax[0].set_title("ANCOVA style plot")
# Difference-in-difference plot
df_did = df.assign(unit=lambda x: x.index).melt(
id_vars=["group", "unit"], var_name="time", value_name="value"
)
sns.lineplot(
df_did,
x="time",
y="value",
hue="group",
units="unit",
estimator=None,
alpha=0.25,
ax=ax[1],
)
ax[1].set_title("Difference-in-difference style plot");
左侧的图对于进行类似协方差分析 (ANCOVA) 的分析最为相关。预处理测量和后处理测量分别位于 x 轴和 y 轴上。这张图展示了以下几点:
- 控制组的预处理测量值低于处理组,这与我们有非随机分配单位到处理组和控制组的想法一致。
- 控制组的点落在单位线上,表明控制组未受到处理的影响。
- 处理组在后处理得分上更高,这一点通过它们位于单位线之上的点显示出来。因此,从视觉上看,我们怀疑处理导致了结果指标的增加。
- 当然,可能有许多不同的结果模式,但我们可以通过同样的方法快速地对数据进行直观解释。
右侧的图展示的是完全相同的数据,但以一种清晰展示其与差分-in-差分 (Difference-in-Differences, DID) 分析方法相似的方式绘制。这里我们不再深入探讨差分-in-差分分析,更多相关信息可以参考差分-in-差分的例子。
分析
result = cp.pymc_experiments.PrePostNEGD(
df,
formula="post ~ 1 + C(group) + pre",
group_variable_name="group",
pretreatment_variable_name="pre",
model=cp.pymc_models.LinearRegression(sample_kwargs={"random_seed": seed}),
)
fig, ax = result.plot()
result.summary()
==================Pretest/posttest Nonequivalent Group Design=================== Formula: post ~ 1 + C(group) + pre Results: Causal impact = 1.9, $CI_{94%}$[1.7, 2.1] Model coefficients: Intercept -0.48, 94% HDI [-1.2, 0.23] C(group)[T.1] 1.9, 94% HDI [1.7, 2.1] pre 1, 94% HDI [0.98, 1.1] sigma 0.51, 94% HDI [0.46, 0.56]