nihao111 发表于 2013-1-29 22:56
谢仁兄,就是不会把两个变量合做一个组变量啊
解决了利用这个下面的也就解决了。。。
gini-prov-age.zip
(34.68 KB)
use data,clear
gen gini=0
qui levelsof prov, local(prov)
foreach i of local prov {
qui levelsof headage if prov=="`i'", local(age)
foreach j of local age {
qui ineqdeco income if prov=="`i'" & inrange(headage,`j'-10,`j'+10)
replace gini=`r(gini)' if prov=="`i'" & headage==`j'
}
}
以上程序经测可行,就是慢(因为嵌套循环,一步步的,只两个省,样本大小:10127,
A省观测值有5236个,年龄不同值有93个;
B省观测值有4891个,年龄不同值有89个 ,
execute了近1分钟吧),
另外因为没有数据,我随便找了一个数据集,所以headage有小于10的,就当是orphan吧
没有像之前说的那样设置组(以配合ineqdeco的option-bygroup(...)),因为设置组的话必然会有重叠overlapped的(由于正负10的范围,这个就跟“分”组的概念冲突了,没分开,叠着呢);
另,生成很多新变量(做组判定条件)的话有些麻烦;
再,每步限定观测值生成目标值gini,存出去到新数据集,再合并merge回来,
不如用本地宏local macro来做当前数据集的内部调整来得方便。
后记:
通过解这个问题,我发现了levelsof的新用法,就是与foreach .. of local ... {...}的连用,比我之前用egen .. =group(varlist)新生成组变量,然后循环取组变量值,便捷多了。
查看不同值的程式:bysort prov: distinct headage
结果:
-> prov = A
| Observations
| total distinct
---------+----------------------
headage | 5236 93
-> prov = B
| Observations
| total distinct
---------+----------------------
headage | 4891 89
作图:
qui levelsof prov, local(prov)
foreach i of local prov{
line gini headage if prov=="`i'", saving(`i',replace) ///
title("Province `i'")
}
graph combine `prov', ///
title("Gini for each age group in each province") ///
note("for each level of headage, the gini corresponds to the group of households" ///
"with the head members aged within the range of current headage+/-10.")
graph export gini-age.pdf,replace