Stata 中的固定成分权重

Fixed Compositional Weighting in Stata

我正在查看 Stata 中的当前人口调查,尽管这个问题可能适用于任何具有个人权重的调查。

生成一个 table 显示变量的平均值很简单 - 比如工资 - 随着时间的推移给定个人权重:

table qtr [aw=pworwgt], contents(mean wage)

我想自动显示工资的平均水平,在这个例子中,但某些类别的比例固定到一个日期。

例如,假设我有 6 个教育类别(低于 HS、HS、一些大学、AA、BA/BS、研究生院)...我想看看工资是多少如果我将劳动力的受教育比例固定为 2005 年的水平,情况就会不同。

理想情况下,该解决方案不会对大量类别占用大量资源。例如,我可能想对 CPS 的详细职业指标做一些类似的事情,它有数百个级别。

我的直觉告诉我 "margins" 可能是解决方案的一部分,但我对该命令还不够熟悉...另外,我希望能够生成 table 输出这样我就可以在其他软件中绘图了。

预计到达时间:这是我尝试按年龄和性别确定权重的方法:循环遍历所有数据,将同期比例与基本四分之一比例进行比较,然后相应地调整个人权重。然而,这需要很长时间才能循环。

local start = tq(1994q1)
local end = tq(2014q4)

local base = tq(2006q1)
tempvar pop2006
tempvar cohort2006
tempvar poptemp
gen pworwgt_a = pworwgt

levelsof pesex, local(sex)

sum pworwgt if qtr == `base'
gen `pop2006' = r(N)*r(mean)
gen `cohort2006' = .
gen `poptemp' = .

forvalues age = 16/85 {
foreach s in `sex' {
    sum pworwgt if age == `age' & pesex == `s' & qtr == `base'
    replace `cohort2006' = r(N)*r(mean)/`pop2006'
    forvalues q = `start'/`end' {
        sum pworwgt if qtr == `q'
        replace `poptemp' = r(N)*r(mean)
        sum pworwgt if age == `age' & pesex == `s' & qtr == `q'
        replace pworwgt_a = pworwgt_a*`cohort2006'/((r(N)*r(mean))/`poptemp') if age == `age' & pesex == `s' & qtr == `q'
    }
}
}

我没有足够的空间对此进行测试,但这里建议对代码段进行简化。我没有解决我不理解的主要问题,部分原因是问题中没有对数据结构的精确描述。

总结建议:

在您需要时使用 summarize, meanonly,并使用 r(sum) 同上。

对常量使用标量而不是变量。

将重复计算转为变量的一次性计算。我认为你可以做更多,但我会在这里停下来。

   local start = tq(1994q1)
   local end = tq(2014q4)
   local base = tq(2006q1)
   tempname pop2006 cohort2006 
   tempvar qassum qsum 

   // quarter-age-sex sums in a single variable 
   bysort qtr age pesex : gen double `qassum` = sum(pworwgt) 
   by qtr age pesex : replace `qassum` = `qassum`[_N] 

   // quarterly sums in a single variable 
   by qtr: gen double `qsum' = sum(pworwgt) 
   by qtr: replace `qsum` = `qsum'[_N] 

   gen pworwgt_a = pworwgt

   levelsof pesex, local(sex)

   sum pworwgt if qtr == `base', meanonly 
   scalar `pop2006' = r(sum)

   forvalues age = 16/85 {
       foreach s in `sex' {
           sum pworwgt if age == `age' & pesex == `s' & qtr == `base', meanonly 
           scalar `cohort2006' = r(sum)/`pop2006'
           replace pworwgt_a = pworwgt_a*`cohort2006'/`qassum'/`qsum' if age == `age' & pesex == `s'                
       }
   }