在 Stata 里把“工具变量 IV × 年份虚拟变量”变成一组随时间变化的工具变量,只需三步即可:生成年份虚拟 → 循环或 forvalues 批量交互 → 在 2SLS 里一次性调用。下面给出完整模板,可直接复制使用。
✅ 场景示例
截面 IV:城市地形起伏度 terrain(不随时间变)
面板数据:city-year 维度
目标:为地形 × 年份交互项生成 2000-2020 年 21 个工具变量
① 生成年份虚拟变量
stata
tab year, gen(dyear) // 自动生成 dyear1, dyear2, …
② 批量生成交互工具变量(两种写法)
写法 A:循环生成(最直观)
stata
// 假设年份范围 2000-2020forvalues y = 2000/2020 {
gen iv_`y' = terrain * (year == `y')}
写法 B:一行到位(因子变量交互)
stata
// 生成 dyear#c.terrain 交互组,变量名形如 c.terrain#2000.yearfvset base none year* 下面用因子变量写法即可,无需手动批量 gen
③ 在 2SLS / GMM 中调用
传统 ivreg2
stata
ivreg2 y controls (x = iv_2000-iv_2020), cluster(city)
因子变量写法(更简洁)
stata
ivreg2 y controls (x = c.terrain#i.year), cluster(city)
解释:Stata 会把 c.terrain#i.year 自动展开成 terrain×year 的 21 个交互项,并全部视为工具变量。
④ 检查工具变量个数 & 过度识别
stata
estat firststage // 查看第一阶段 F 值estat overid // Hansen J 检验
✅ 一行总结
用 tab year, gen(dyear) 生成年份哑元,再用 gen iv_y' = IV * dyear或c.IV#i.year即可批量得到 **随时间变化的工具变量**,随后直接喂给ivreg2/xtivreg2`,无需额外循环。