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'
}
}
我正在查看 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'
}
}