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

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)"))

代码说明

  1. 提取cv值:通过matrix cv_mat = e(cv)获取svy: tab计算得到的变异系数矩阵,矩阵每一行对应变量的一个类别。
  2. 添加自定义标量:用循环将每个类别的cv值作为标量cv_1、cv_2...添加到当前estimates中,确保后续能被esttab调用。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:25:53