在面板数据中添加滞后变量(t + 1),(t + 2),(t-1)

时间:2014-07-11 18:28:30

标签: r plm

编辑:尝试实施以下答案中提供的解决方案。

我正在提供新的样本数据,因为它非常适合我的数据。

> head(Grunfeld, 25)
   firm year    inv  value capital
1     1 1935  317.6 3078.5     2.8
2     1 1936  391.8 4661.7    52.6
3     1 1937  410.6 5387.1   156.9
4     1 1938  257.7 2792.2   209.2
5     1 1939  330.8 4313.2   203.4
6     1 1940  461.2 4643.9   207.2
7     1 1941  512.0 4551.2   255.2
8     1 1942  448.0 3244.1   303.7
9     1 1943  499.6 4053.7   264.1
10    1 1944  547.5 4379.3   201.6
11    1 1945  561.2 4840.9   265.0
12    1 1946  688.1 4900.9   402.2
13    1 1947  568.9 3526.5   761.5
14    1 1948  529.2 3254.7   922.4
15    1 1949  555.1 3700.2  1020.1
16    1 1950  642.9 3755.6  1099.0
17    1 1951  755.9 4833.0  1207.7 
18    1 1952  891.2 4924.9  1430.5
19    1 1953 1304.4 6241.7  1777.3
20    1 1954 1486.7 5593.6  2226.3
21    2 1935  209.9 1362.4    53.8
22    2 1936  355.3 1807.1    50.5
23    2 1937  469.9 2676.3   118.1
24    2 1938  262.3 1801.9   260.2
25    2 1939  230.4 1957.3   312.7



library(plm)
data("Grunfeld", package="plm")

Grunfeld$firm <- as.factor(Grunfeld$firm)

#adding lagged variable (+1)
Grunfeld$inv.plus1 <- NA
for (f in levels(Grunfeld$firm)) {
 Grunfeld[which(Grunfeld$firm == f),]$inv.plus1 <- c(Grunfeld[which(Grunfeld$firm == f),]$inv[-1],NA)
}

#adding lagged variable (+2)
Grunfeld$inv.plus2 <- NA
for (f in levels(Grunfeld$firm)) {
  Grunfeld[which(Grunfeld$firm == f),]$inv.plus2 <- c(Grunfeld[which(Grunfeld$firm == f),]$inv[-c(1,2)],NA)
}

#adding lagged variable (-1)
Grunfeld$inv.minus1 <- NA
for (f in levels(Grunfeld$firm)) {
  Grunfeld[which(Grunfeld$firm == f),]$inv.minus1 <- c(Grunfeld[which(Grunfeld$firm == f),]NA,$inv[-1],)
}

虽然它适用于(+1)变量,但我无法导出(+2)或(-1)的正确代码。我做错了什么?


我正在使用plm包,我想回归以下:lm(inv(t + 1)~inv(t)+其他变量(t))以及lm(“inv(t + 2) )“~inv(t)+其他变量(t))和lm(”inv(t + 3)“~inv(t)+其他变量(t))

是否有一种方便的方法可以在两个方向上添加滞后变量(即inv(t + 1),inv(t-1),最多3年的时间范围?我的数据采用平衡格式,尽管有很多“NA”。我不知道它是否仍被认为是一个平衡的面板。是否有任何包装或配方?提前感谢您的帮助。

编辑:我尝试的做法与下面提供的答案相同:

dd$earnings.plus1 <- c(dd$earnings[-1], NA)
dd$earnings.plus2 <- c(dd$earnings[-c(1:2)], NA, NA)

但我试图定义dd $ earnings.minus1

z<- nrows(set)
dd$earnings.minus1 <- c(NA, dd$earnings[-z])

但由于公司1的最后一个值被转移到公司2,因此无法正常工作。上述解决方案似乎不会发生这种情况。这有什么区别?

2 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是简单地复制列,偏移您想要的t,假设每一行都是特定时间(它似乎是基于您的问题),并且差异行之间是相同的(确切地说,你想要的滞后,似乎也是基于你的问题)。

所以给出你的数据,比如

 dd$earnings.plus1 <- c(dd$earnings[-1], NA)
 dd$earnings.plus2 <- c(dd$earnings[-c(1:2)], NA, NA)
 # ...etc

然后按适当的行数修剪lm数据:

 lm(earnings.plus1 ~ earnings + year + firm, data=head(dd,-1))
 lm(earnings.plus2 ~ earnings + year + firm, data=head(dd,-2))
 # ...etc

显然可以在实现中更加通用(例如,使用embed),但对于小的,不重复的分析,复制 - 粘贴 - 调整方法可能已经足够了。

编辑:

所以,我的不好:我不确定为什么这不会发生加班,但它应该是。我忽略了这样一个事实,即您的数据被切割为各种其他参数 - 实际上,您可能会得到像employee_id这样的列。在制作这些滞后变量(或您编辑的替代变量)之前,您需要对数据进行分组,以便您只是滞后于相关项目。

以下是我在公司上进行子集化所做的工作:

dd$firm <- as.factor(dd$firm)
dd$earnings.plus1 <- NA
for (f in levels(dd$firm)) {
  dd[which(dd$firm == f),]$earnings.plus1 <- c(dd[which(dd$firm == f),]$earnings[-1],NA)
}

您可以为.plus2等添加其他切片

答案 1 :(得分:0)

感谢carl,我可以在面板数据中导出在两个方向上添加滞后变量的代码。

library(plm)
data("Grunfeld", package="plm")

Grunfeld$firm <- as.factor(Grunfeld$firm)



#adding lagged variable (+1)
Grunfeld$inv.plus1 <- NA
for (f in levels(Grunfeld$firm)) {
 Grunfeld[which(Grunfeld$firm == f),]$inv.plus1 <- c(Grunfeld[which(Grunfeld$firm == f),]$inv[-1],NA)
}

#adding lagged variable (+2)
Grunfeld$inv.plus2 <- NA
for (f in levels(Grunfeld$firm)) {
 Grunfeld[which(Grunfeld$firm == f),]$inv.plus2 <- c(Grunfeld[which(Grunfeld$firm == f),]$inv[-c(1,2)],NA, NA)
}


#adding lagged variable (-1)
Grunfeld$inv.minus1 <- NA
for (f in levels(Grunfeld$firm)) {
 Grunfeld[which(Grunfeld$firm == f),]$inv.minus1 <- c(NA,Grunfeld[which(Grunfeld$firm == f),]$inv[-nrow(Grunfeld[which(Grunfeld$firm == f),])])
}

让我知道是否有一种更简单的方法,因为它需要大量代码才能实现相当简单的操作。但我该判断谁:D