import numpy as np
import pandas as pd
from linearmodels.iv import IV2SLS
import statsmodels.api as sm
import warnings
warnings.filterwarnings('ignore')
# 设置随机种子
np.random.seed(42)
n = 1000
# 生成数据:D 是内生的,Z 是工具变量
Z = np.random.normal(0, 1, n) # 工具变量(外生)
U = np.random.normal(0, 1, n) # 未观测混淆变量
# 第一阶段:D 受 Z 和 U 影响
D = 0.5 * Z + 0.8 * U + np.random.normal(0, 0.5, n)
# 真实因果效应
true_effect = 2.0
# 结果变量:Y 受 D 和 U 影响(U 造成内生性)
Y = true_effect * D + 1.5 * U + np.random.normal(0, 0.5, n)
# 创建数据框
data = pd.DataFrame({
'Y': Y,
'D': D,
'Z': Z,
'U': U # 现实中不可观测
})
print(f"样本量: {n}")
print(f"真实处理效应: {true_effect}")样本量: 1000
真实处理效应: 2.0
