You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

滞后变量系数偏差估计: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)
问题分析与修正代码

问题根源拆解

  1. 偏差异常且一致:
    • mcprog程序固定expand 5,循环时未传入时间维度参数,所有模拟都用5期数据;
    • 计算偏差时错误取了x_it的系数,而非滞后因变量l.y_it的系数;
    • 直接用replace生成滞后项逻辑错误,导致y_it递归计算失效。
  2. 模拟结果命名混乱:未指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:17:44