0

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

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

> 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) + other variables(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。上述解决方案似乎不会发生这种情况。这里有什么区别?

4

2 回答 2

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

于 2014-07-15T09:10:28.610 回答
0

实现此目的的一种方法是简单地复制列,由您想要t的 s 偏移,假设每一行都是特定时间(这似乎基于您的问题),并且行之间的差异是相同的(并且完全您想要的滞后似乎再次基于您的问题)。

所以给定你的数据,比如

 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等。

于 2014-07-11T19:44:53.487 回答