滞后变量系数偏差估计:Stata蒙特卡洛模拟问题排查
研究背景与实验设计
我们通过数据生成过程构建面板数据集,引入滞后变量以探究不同时间维度下的估计偏差。个体滞后变量首年取值为0,仅从第二期开始,$y_{it}$依赖于$l.y_{it}$。计划采用固定效应估计器开展100次蒙特卡洛模拟,生成表格展示滞后变量系数(真实值为0.5)的估计偏差随时间维度(5、10、20、50期)的变化规律。
现存问题
当前编写的Stata代码存在两个核心问题:
- 得到的偏差值过大(达1.43),且4种时间维度下偏差完全一致;
- 模拟结果显示变量为
_sim_1和_sim_4,而非预期的_b_l.y_it和_se_l.y_it。
原代码
clear all set seed 345398 capture program drop mcprog program mcprog clear set seed 345398 drawnorm alpha_i, n(200) gen persnr = _n expand 5 bysort persnr: g year = _n drawnorm nu_it e_it, n(1000) g x_it=nu_it+alpha_i drop nu_it g y_it=3+alpha_i+2*x_it+e_it xtset persnr year replace y_it = 3+alpha_i+2*x_it+e_it + 0.5*l.y_it if year > 1 xtreg y_it l.y_it x_it , fe end simulate _b _se, reps(100): mcprog sum local time_periods 5 10 20 50 * Create an empty matrix to store bias results matrix results = J(4, 1, .) * Loop through different time periods local row = 1 foreach t in `time_periods' { clear simulate _b _se, reps(100): mcprog return list * Store the estimated coefficient for l_y_it in a local macro local estimated_coefficient = _b[x_it] * Calculate bias as the difference between the estimated and true coefficient local bias = `estimated_coefficient' - 0.5 * Store bias in the results matrix matrix results[`row', 1] = `bias' * Increment row index local row = `row' + 1 } * Display the results in a table matlist results, format(%9.6f)
问题分析与修正代码
问题根源拆解
- 偏差异常且一致:
mcprog程序固定expand 5,循环时未传入时间维度参数,所有模拟都用5期数据;- 计算偏差时错误取了
x_it的系数,而非滞后因变量l.y_it的系数; - 直接用
replace生成滞后项逻辑错误,导致y_it递归计算失效。
- 模拟结果命名混乱:未指定
simulate输出变量名,默认生成无意义的_sim_*变量。
修正后的代码
clear all set seed 345398 capture program drop mcprog * 定义带时间维度参数的模拟程序,返回指定统计量 program mcprog, rclass args t clear drawnorm alpha_i, n(200) gen persnr = _n expand `t' bysort persnr: gen year = _n drawnorm nu_it e_it, n(200*`t') gen x_it = nu_it + alpha_i drop nu_it * 递归生成y_it,确保滞后项计算正确 gen y_it = 3 + alpha_i + 2*x_it + e_it if year == 1 forvalues i = 2/`t' { replace y_it = 3 + alpha_i + 2*x_it + e_it + 0.5*l.y_it if year == `i' } xtset persnr year xtreg y_it l.y_it x_it, fe * 返回滞后因变量的系数与标准误 return scalar b_lag = _b[l.y_it] return scalar se_lag = _se[l.y_it] end local time_periods 5 10 20 50 matrix results = J(4, 2, .) * 第一列存偏差,第二列存平均标准误 local row = 1 foreach t in `time_periods' { * 指定模拟结果变量名,对应程序返回值 simulate b_lag=r(b_lag) se_lag=r(se_lag), reps(100): mcprog `t' * 计算平均系数与偏差 sum b_lag local avg_b = r(mean) local bias = `avg_b' - 0.5 * 计算平均标准误 sum se_lag local avg_se = r(mean) * 存入结果矩阵 matrix results[`row', 1] = `bias' matrix results[`row', 2] = `avg_se' local row = `row' + 1 } * 添加行列标签,优化结果展示 matrix colnames results = "偏差" "平均标准误" matrix rownames results = "5期" "10期" "20期" "50期" matlist results, format(%9.6f)
修正说明
- 给模拟程序添加时间维度参数,确保循环时使用对应期数的数据集;
- 递归生成
y_it,保证滞后项计算逻辑正确; - 通过
return scalar指定返回统计量,simulate时映射为自定义变量名,解决命名混乱问题; - 修正偏差计算逻辑,取滞后因变量系数进行偏差计算;
- 为结果矩阵添加行列标签,提升可读性。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

