Yitzhaki 指数需要准备两个矩阵,一个是超过个体 i 的个体 j 的收入矩阵,另外一个是 0 1 矩阵,表示是否超过:
mata: mata clear inc = st_data(., "fincome1") n = rows(inc) m1 = J(n, n, .) m2 = J(n, n, .) for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (inc[j, 1] - inc[i, 1] > 0) { m1[i, j] = inc[j, 1] m2[i, j] = 1 } else { m1[i, j] = 0 m2[i, j] = 0 } } } m3 = rowsum(m2) / n m_mean = rowsum(m1) :/ rowsum(m2) - inc m4 = m3 :* m_mean
stata("cap drop Yitzhaki_index") st_addvar("double", "Yitzhaki_index") st_store(., "Yitzhaki_index", m4) end
代码里面的 m1 是超过个体 i 的个体 j 的收入矩阵,计算行和就是计算超过 yi 的样本收入总和;m2 表示个体 i 的收入是否被个体 j 超过,所以 m2 的行和就是超过 yi 的样本数,两者对应元素相除以就得到了群组中收入超过个体 i 的样本的平均收入。再减去个体 i 的收入乘以百分比就得到 Yitzhaki 指数。
再检查下趋势:
sc Yitzhaki_index fincome1
同样符合预期。
循环计算所有的组
由于循环中不能出现 end,所以还是需要编写两个函数,然后在循环里调用:
*- 循环计算所有组的 clear all usetest, clear labeldrop _all
*- 由于循环中不能出现 end,所以还是需要编写两个函数:
mata: void Kakwani_index() { inc = st_data(., "fincome1") n = rows(inc) m1 = J(n, n, .) for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (inc[j, 1] - inc[i, 1] > 0) { m1[i, j] = inc[j, 1] - inc[i, 1] } else { m1[i, j] = 0 } } } colsum(m1) m_mean = rowsum(m1) / mean(inc) / n
stata("cap drop Kakwani_index") st_addvar("double", "Kakwani_index") st_store(., "Kakwani_index", m_mean) }
void Yitzhaki_index() { inc = st_data(., "fincome1") n = rows(inc) m1 = J(n, n, .) m2 = J(n, n, .) for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (inc[j, 1] - inc[i, 1] > 0) { m1[i, j] = inc[j, 1] m2[i, j] = 1 } else { m1[i, j] = 0 m2[i, j] = 0 } } } m3 = rowsum(m2) / n m_mean = rowsum(m1) :/ rowsum(m2) - inc m4 = m3 :* m_mean
stata("cap drop Yitzhaki_index") st_addvar("double", "Yitzhaki_index") st_store(., "Yitzhaki_index", m4) } end
void 表示无返回值,我们这里并不需要返回值,只是希望调用函数的时候运行下函数里面的代码即可。
然后就可以循环计算各个组的了:
capmkdir"res" egen group = group(year countyid) levelsof group, local(grouplist) foreachgin`grouplist' { di"`g'" preserve qui { keepif group == `g' mata: Kakwani_index() mata: Yitzhaki_index() save"res/`g'", replace } restore }
再合并分组计算的结果:
local files: dir"res" files "*.dta" di`"`files'"'
local firstfile: word 1 of `files' use res/`firstfile', clear dropin 1/`=_N' foreach f in`files' { append using "res/`f'" } save 计算结果, replace
评论