固定Stata中的成分加权

时间:2015-02-13 17:49:16

标签: stata

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

生成一个表格可以直接显示一个变量的平均值 - 比如工资 - 随着时间的推移给出个别权重:

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

我想自动做的是显示工资的平均水平,但是某些类别的比例固定为某个日期。

例如,假设我有6个教育类别(低于HS,HS,某些学院,AA,BA / BS,Grad School)......如果我修好了,我想看看工资会有多大差异劳动力的教育比例,比如2005年的水平。

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

我的直觉告诉我“边缘”可能是解决方案的一部分,但我对该命令不够熟悉......此外,我希望能够生成表格输出,以便我可以在其他软件中绘图。

ETA:这是我尝试按年龄和性别来固定重量的方法:通过循环所有数据,将同期比例与基础四分之一比例进行比较,然后相应地调整个体权重。然而,这需要很长时间才能循环。

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'
    }
}
}

1 个答案:

答案 0 :(得分:1)

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

总结建议:

在您需要的时候使用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'                
       }
   }