在面板数据中重复序列

时间:2016-04-08 12:04:43

标签: sequence stata repeat panel-data

我正在处理1970年至2005年劳动生产率的面板数据,并将其定义为xtset sector year。由于我正在寻找基准年内固定权重的平均年度生产率增长,我试图将1970年的权重(nominalshare)复制到所有其他年份。请注意,序列非常重要,因为不同的扇区具有不同的值。

我的代码如下:

egen totalva = sum(VA), by(year)
by sector: gen nominalshare = VA/totalva if year == 1970

手动复制重量不是一种选择,因为我有35年的观察,而且我正在研究不同的基准年。

所以我试图将我1970年的确切结果复制到以后的所有年份。有没有人知道如何解决这个问题?

1 个答案:

答案 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 == 1970year时,真或假比较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]