编辑:尝试实施以下答案中提供的解决方案。
我正在提供新的样本数据,因为它非常适合我的数据。
> 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,因此无法正常工作。上述解决方案似乎不会发生这种情况。这有什么区别?
答案 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