【发布时间】:2023-01-19 01:16:51
【问题描述】:
我正在尝试使用面板数据(ID 和年份)生成滞后变量。根据每个 ID,它可能有不同年份的面板,有时 ID 组内的年份不连续。例如,我们有以下数据集:
| ID | Year | x |
|---|---|---|
| 1 | 2001 | 3 |
| 1 | 2002 | 1 |
| 1 | 2006 | 2 |
| 1 | 2007 | 2 |
| 2 | 2002 | 1 |
| 2 | 2003 | 5 |
| 3 | 2006 | 2 |
| 3 | 2007 | 2 |
| 3 | 2008 | 4 |
我要生成的 x 的滞后变量是:
| ID | Year | x | x_lag |
|---|---|---|---|
| 1 | 2001 | 3 | . |
| 1 | 2002 | 1 | 3 |
| 1 | 2006 | 2 | . |
| 1 | 2007 | 2 | 2 |
| 2 | 2002 | 1 | . |
| 2 | 2003 | 5 | 1 |
| 3 | 2006 | 2 | . |
| 3 | 2007 | 2 | 2 |
| 3 | 2008 | 4 | 2 |
我找到了一些关于如何按组创建滞后变量的其他答案,但它对我不起作用,因为我的数据集中的某些 ID 具有不连续的年份(例如上例中的第 2-3 行)。
所以,我正在使用我在下面写下的功能:
function lagged(data,x)
for c in x
data[:,c*"_lag"] .= 0.0
end
allowmissing!(data)
for row in eachrow(data)
for c in x
if filter(y -> y.id == row.id && y.year == row.year - 1, data)[:,c] == []
row[c*"_lag"] = missing
else
row[c*"_lag"] = filter(y -> y.id == row.id && y.year == row.year - 1, data)[:,c][1]
end
end
end
return data
end
但它非常慢......有没有更快的方法在不连续年份的面板数据中创建滞后变量?谢谢!
【问题讨论】: