我正在处理1970年至2005年劳动生产率的面板数据,并将其定义为xtset sector year
。由于我正在寻找基准年内固定权重的平均年度生产率增长,我试图将1970年的权重(nominalshare
)复制到所有其他年份。请注意,序列非常重要,因为不同的扇区具有不同的值。
我的代码如下:
egen totalva = sum(VA), by(year)
by sector: gen nominalshare = VA/totalva if year == 1970
手动复制重量不是一种选择,因为我有35年的观察,而且我正在研究不同的基准年。
所以我试图将我1970年的确切结果复制到以后的所有年份。有没有人知道如何解决这个问题?
答案 0 :(得分:2)
我同意@lmo的回答和@ ander2ed关于egen
的评论,但这是另一种方式,提供各种两线解决方案,因此更短。
请注意,虽然egen
' sum()
函数运行良好,但由于Stata 9已经没有记录,因此现在有一个等效的total()
函数。这样做是为了更清楚地与Stata函数sum()
的区别,后者产生累计或运行总和。
数据,甚至虚假数据,都有帮助。在Statalist上,人们被要求使用dataex
(SSC)列出示例数据,这在Stack Overflow上也是一个好主意。以下是一些愚蠢的数据,因为我没有OP提取的数据集:
clear
input sector year va
1 1970 40
1 1971 70
2 1970 60
2 1971 30
end
关于问题:我们可以直接去那里,而不是获得总数并除以它来获得比例分配。
egen pcva = pc(va), by(year) prop
我们可以通过这种方式将1970年的价值观传播到所有其他年份:
egen pcva1970 = total(pcva * (year == 1970)), by(sector)
list, sepby(sector)
+--------------------------------------+
| sector year va pcva pcva1970 |
|--------------------------------------|
1. | 1 1970 40 .4 .4 |
2. | 1 1971 70 .7 .4 |
|--------------------------------------|
3. | 2 1970 60 .6 .6 |
4. | 2 1971 30 .3 .6 |
+--------------------------------------+
total()
可以提供表达式,而不仅仅是变量名称,表达式为pcva * (year == 1970)
。当且仅当year == 1970
为year
时,真或假比较1970
才会产生1,否则为0。效果是产生一个仅为所选值的总和,并将其放在每个相关的观察中。
除了1970年的价值观之外,还有两种忽视一切的方法:
egen pcva1970 = total(pcva / (year == 1970)), by(sector)
egen pcva1970 = total(cond(year == 1970, pcva, .)), by(sector)
与@lmo的答案一样,这些解决方案都取决于Stata忽略大多数(并非所有!)目的的缺失。
http://www.stata-journal.com/sjpdf.html?articlenum=dm0055
对此类技术进行了审核注意在这个特定的例子中,1970年是第一年,所以这是另一个解决方案:
egen pcva = pc(va), by(year) prop
bysort sector (year) : gen pcva1970 = pcva[1]