Stata中使用esttab输出加权频率时变异系数(cv)列为空的解决问询
问题:Stata中esttab输出变异系数(cv)为空的解决办法
我在Stata中对EVR_CIGS、P12M_CIGS、CUR_CIGS三个变量进行加权频率制表,使用estout包将加权结果导出至Excel。运行esttab时需要同时输出变异系数(cv)、cell、lb、ub和obs,但cv列始终为空。已知cv不属于默认保存的向量,求可行解决办法。
尝试过的代码
svyset [pweight=ES04WGT], brr(ES04WGT1 - ES04WGT100) vce(brr) mse fay(.3) eststo clear foreach var in EVR_CIGS P12M_CIGS CUR_CIGS { estpost svy, sub(if inrange(AGE,16,17)): tab `var', ci obs percent cv format(%9.1fc) stubwidth(25) eststo } esttab using "${nugget}Table1_09122023.csv", replace cv cell("cell cv lb ub obs") varwidth(20) wide plain page nostar unstack varlabels(`e(labels)') mtitle("EVR_CIGS" "P12M_CIGS" "CUR_CIGS")
解决思路与修改后代码
问题核心是svy: tab计算的cv结果不会自动存入estpost的统计量集合中,需要手动提取e(cv)中的值并添加到estimates对象里,再在esttab中调用这些自定义统计量。
完整修改代码
svyset [pweight=ES04WGT], brr(ES04WGT1 - ES04WGT100) vce(brr) mse fay(.3) eststo clear // 存储estimates名称的宏 local eststo_list "" foreach var in EVR_CIGS P12M_CIGS CUR_CIGS { estpost svy, sub(if inrange(AGE,16,17)): tab `var', ci obs percent cv format(%9.1fc) stubwidth(25) // 提取变异系数矩阵 matrix cv_mat = e(cv) local n_cats = rowsof(cv_mat) // 循环将每个类别的cv值添加为标量 forvalues i = 1/`n_cats' { estadd scalar cv_`i' = cv_mat[`i',1] } // 为当前estimates命名并加入列表 eststo `var' local eststo_list "`eststo_list' `var'" } // 导出结果,调用自定义cv标量 esttab `eststo_list' using "${nugget}Table1_09122023.csv", replace cell("cell lb ub obs") /// varwidth(20) wide plain page nostar unstack varlabels(`e(labels)') /// mtitle("EVR_CIGS" "P12M_CIGS" "CUR_CIGS") /// stats(cv_1 cv_2, label("CV(类别1)" "CV(类别2)"))
代码说明
- 提取cv值:通过
matrix cv_mat = e(cv)获取svy: tab计算得到的变异系数矩阵,矩阵每一行对应变量的一个类别。 - 添加自定义标量:用循环将每个类别的cv值作为标量
cv_1、cv_2...添加到当前estimates中,确保后续能被esttab调用。 - esttab调用cv:在
stats()选项中指定这些自定义标量,并设置对应标签,让输出表格更易读。
适配多类别变量的优化版
如果不同变量的类别数量不一致,可以动态生成统计量列表,避免手动指定cv_1、cv_2:
svyset [pweight=ES04WGT], brr(ES04WGT1 - ES04WGT100) vce(brr) mse fay(.3) eststo clear local eststo_list "" foreach var in EVR_CIGS P12M_CIGS CUR_CIGS { estpost svy, sub(if inrange(AGE,16,17)): tab `var', ci obs percent cv format(%9.1fc) stubwidth(25) matrix cv_mat = e(cv) local n_cats = rowsof(cv_mat) local cv_stats "" local cv_labels "" // 动态生成cv统计量和对应标签 forvalues i = 1/`n_cats' { estadd scalar cv_`i' = cv_mat[`i',1] local cv_stats "`cv_stats' cv_`i'" local cv_labels "`cv_labels' ""CV(类别`i')""" } eststo `var' local eststo_list "`eststo_list' `var'" // 为当前estimates存储cv统计量列表 estadd local cv_stats "`cv_stats'" estadd local cv_labels "`cv_labels'" } // 导出时调用动态生成的统计量 esttab `eststo_list' using "${nugget}Table1_09122023.csv", replace cell("cell lb ub obs") /// varwidth(20) wide plain page nostar unstack varlabels(`e(labels)') /// mtitle("EVR_CIGS" "P12M_CIGS" "CUR_CIGS") /// stats(${`var'.cv_stats}, label(${`var'.cv_labels}))
内容的提问来源于stack exchange,提问作者kgarciar
相关产品推荐
相关产品推荐

