面板数据中的重复序列
Repeat sequence in 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 年的准确结果复制到以后的所有年份。有没有人知道如何解决这个问题?
您可以利用 egen
命令下的函数通常会忽略缺失值这一事实:
egen totalva = total(VA), by(year)
gen temp = VA/totalva if year == 1970
by sector: egen nominalshare = mean(temp)
drop temp
另请注意cond()
函数的使用范围:
egen totalva = total(VA), by(year)
gen temp = cond(year == 1970, VA/totalva, 0)
by sector: egen nominalshare = max(temp)
drop temp
如果使用 do
文件,您还可以使用 tempvar
命令,这样就不需要 drop temp
行。
注意:此版本得益于@ander2ed 的评论。
我同意@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]
我正在处理 1970 年至 2005 年劳动生产率的面板数据,并将其定义为 xtset sector year
。当我在基准年寻找固定权重的平均年生产率增长时,我试图将 1970 年的权重 (nominalshare
) 复制到所有其他年份。请注意,顺序非常重要,因为不同的扇区具有不同的值。
我的代码如下:
egen totalva = sum(VA), by(year)
by sector: gen nominalshare = VA/totalva if year == 1970
手动复制权重不是一种选择,因为我有 35 年的观察结果并且我正在研究不同的基准年。
所以我试图将 1970 年的准确结果复制到以后的所有年份。有没有人知道如何解决这个问题?
您可以利用 egen
命令下的函数通常会忽略缺失值这一事实:
egen totalva = total(VA), by(year)
gen temp = VA/totalva if year == 1970
by sector: egen nominalshare = mean(temp)
drop temp
另请注意cond()
函数的使用范围:
egen totalva = total(VA), by(year)
gen temp = cond(year == 1970, VA/totalva, 0)
by sector: egen nominalshare = max(temp)
drop temp
如果使用 do
文件,您还可以使用 tempvar
命令,这样就不需要 drop temp
行。
注意:此版本得益于@ander2ed 的评论。
我同意@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]