Stata 16表格生成异常求助:仅导出首个局部变量数据问题排查
Stata 16与17兼容性问题:esttab仅导出首个局部变量对应结果
问题背景
代码在Stata 17中可正常运行,但在Stata 16执行时,esttab仅基于首个创建的局部变量生成表格;调整局部变量顺序后,仍只导出首个变量对应的数据。
问题代码
local sample_openx "Full" local sample_first_offer_x_gets "Decider Opens" // Electronic vs Face-to-Face regression foreach var of varlist $outcomes { eststo `var': reg `var' Forced##face i.round_dummy /// if $sample_reg, vce(cluster Participant_id) qui test 1.face+1.Forced#1.face==0 local combined = `r(p)' local combined: display %9.4f `combined' qui estadd local combined "`combined'" qui sum `var' if e(sample)==1 qui estadd scalar meanc r(mean) local sample_text "`sample_`var''" qui estadd local Sample "`sample_text'" } esttab $outcomes /// using "$latex/table_reg_face.tex", replace /// keep (1.Forced 1.face 1.Forced#1.face) /// b(2) se(2) star(* 0.10 ** 0.05 *** .01) /// mtitles("Decider Opens" "Decider's First Claim") collabels(none) /// varlabels(1.Forced "Forced" 1.face "Face-to-Face" 1.Forced#1.face "Forced $*$ Face-to-Face") /// noobs nocons booktabs nonotes /// stats(N N_clust meanc combined Sample, fmt(%9.0fc 0 2 0) labels("Observations" "Num. Clusters" "Dep. Var. Mean" "\beta_2+\beta_3=0" "Sample")) eststo clear
问题原因
Stata 16及更早版本中,estadd local存在局部宏作用域限制:在foreach循环内使用该命令时,后续循环的宏赋值会覆盖之前的宏,最终所有估计结果都会引用最后一次循环的宏值,部分场景下甚至仅保留首次循环的宏值(取决于Stata内存管理逻辑)。而Stata 17优化了estadd的作用域处理,解决了宏覆盖问题。
另外,代码中local sample_text "sample_var''"的嵌套宏引用方式,在Stata 16中存在解析延迟,导致宏无法正确绑定到对应估计模型,进一步加剧结果异常。
解决办法
1. 替换estadd local为estadd scalar(数值型内容)
对于combined这类数值型统计量,改用estadd scalar存储,规避局部宏作用域问题:
qui test 1.face+1.Forced#1.face==0 qui estadd scalar combined = r(p)
后续在esttab的stats选项中直接调用combined,通过fmt(4)控制格式即可。
2. 显式传递宏值到estadd(字符串型内容)
对于Sample这类字符串型内容,使用estadd local时需确保宏值在循环内即时解析并绑定到当前模型,避免嵌套引用的延迟解析:
// 替换原有的sample_text赋值和estadd local local sample_macro_name "sample_`var'" qui estadd local Sample "``sample_macro_name''"
3. 升级estout包(可选)
若坚持原有写法,可执行ssc install estout, replace升级包,部分旧版本estout在Stata 16中存在宏处理bug,升级后可能修复问题。
调整后的代码示例
local sample_openx "Full" local sample_first_offer_x_gets "Decider Opens" // Electronic vs Face-to-Face regression foreach var of varlist $outcomes { eststo `var': reg `var' Forced##face i.round_dummy /// if $sample_reg, vce(cluster Participant_id) qui test 1.face+1.Forced#1.face==0 // 用scalar存储p值 qui estadd scalar combined = r(p) qui sum `var' if e(sample)==1 qui estadd scalar meanc r(mean) // 显式解析sample宏 local sample_macro "sample_`var'" qui estadd local Sample "``sample_macro''" } esttab $outcomes /// using "$latex/table_reg_face.tex", replace /// keep (1.Forced 1.face 1.Forced#1.face) /// b(2) se(2) star(* 0.10 ** 0.05 *** .01) /// mtitles("Decider Opens" "Decider's First Claim") collabels(none) /// varlabels(1.Forced "Forced" 1.face "Face-to-Face" 1.Forced#1.face "Forced $*$ Face-to-Face") /// noobs nocons booktabs nonotes /// stats(N N_clust meanc combined Sample, fmt(%9.0fc 0 2 4 0) labels("Observations" "Num. Clusters" "Dep. Var. Mean" "\beta_2+\beta_3=0" "Sample")) eststo clear
内容的提问来源于stack exchange,提问作者Francisco olivero
相关产品推荐
相关产品推荐

