【问题标题】:adding lagged variables (t+1), (t+2), (t-1) in panel data在面板数据中添加滞后变量 (t+1), (t+2), (t-1)
【发布时间】:2014-09-02 11:03:12
【问题描述】:

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

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

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

【问题讨论】:

  • 您想将一个单一值与另一个单一值“回归”吗?这真的没有意义。
  • 抱歉不清楚,但我在收益旁边还有其他变量作为自变量。
  • 但是如果您只使用单个观察作为响应,则无法进行任何估计(添加其他协变量时更不可能)。您用于回归的值向量是什么?
  • 目的是推导出模型的系数以生成盈利预测。

标签: r plm


【解决方案1】:

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

因此,鉴于您的数据,类似于

 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 等添加其他切片。

【讨论】:

  • 谢谢!有必要修剪数据吗?不是仅包含“NA”自变量或 NA 作为因变量的行会自动删除/被 lm 忽略吗?或者我在这里完全错了。另一个不错的功能是,如果我可以根据 id 删除某些行(例如删除整个公司)或删除所有公司的某些年份(例如缩短数据的长度)。提取函数可以使用吗?最好的问候
  • 修剪不是绝对必要的,但我认为它可以让你更清楚你在做什么(而不是假设lm 魔法会为你做这件事)。相对于你关于公司的问题,很容易按公司过滤——你可以使用subset,例如,或者如果你有很多数据/操作并且需要担心性能,data.table 包可以提供更高效过滤。
  • 再次感谢您的帮助。我现在正在尝试与滞后变量相同的方法,我尝试相反,但它无法正常工作。这是我所做的:z
  • 我编辑了发布的问题,以便读者更容易理解。如何回应人?该领域以某种方式忽略了我的@carl
  • @Gritti - 我不确定我是否理解你在问“如何回应人们?”您的意思是,确保已回答的人看到您已更新问题?我不确定 SO 是否提供该功能,但您总是对答案发表评论以提醒该用户。
【解决方案2】:

感谢 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

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多