1

我有一些看起来像这样的面板数据(输入我的数据集的代码在最后):

  countrycode year X
1         ARG 2015 2
2         ARG 2016 2
3         ARG 2017 1
4         AUS 2015 1
5         AUS 2016 3
6         AUS 2017 2
7         USA 2015 6
8         USA 2016 5
9         USA 2017 8

我想区分 X 变量(即从今年的 X 中减去去年的 X)。当我不使用管道时,它可以完美运行:

library(tidyverse)
library(plm)

pdf <- pdata.frame(df, index = c("countrycode", "year"))

# This works perfectly
pdf <- mutate(pdf, dX = pdf$X - lag(pdf$X))

结果正是我想要的:每个 2015 年的 dX 值都是 NA,因为没有 2014 年的 X 值可以比较。

  countrycode year X dX
1         ARG 2015 2 NA
2         ARG 2016 2  0
3         ARG 2017 1 -1
4         AUS 2015 1 NA
5         AUS 2016 3  2
6         AUS 2017 2 -1
7         USA 2015 6 NA
8         USA 2016 5 -1
9         USA 2017 8  3

但是当我尝试使用 %>% 时:

pdf <- pdf %>% mutate(dX2 = X - lag(X))

结果不再考虑面板结构。看看 dX2 如何在不同国家/地区尝试差异化?所以 2015 年美国的 dX2 应该是 NA,但实际上是 4。

  countrycode year X dX dX2
1         ARG 2015 2 NA  NA
2         ARG 2016 2  0   0
3         ARG 2017 1 -1  -1
4         AUS 2015 1 NA   0
5         AUS 2016 3  2   2
6         AUS 2017 2 -1  -1
7         USA 2015 6 NA   4
8         USA 2016 5 -1  -1
9         USA 2017 8  3   3

有没有办法在 plm 或面板数据中使用管道?

完整代码在这里:

library(tidyverse)
library(plm)

df <- data.frame(stringsAsFactors=FALSE,
   countrycode = c("ARG", "ARG", "ARG", "AUS", "AUS", "AUS", "USA", "USA",
                   "USA"),
          year = c(2015L, 2016L, 2017L, 2015L, 2016L, 2017L, 2015L, 2016L,
                   2017L),
             X = c(2L, 2L, 1L, 1L, 3L, 2L, 6L, 5L, 8L)
)
df

# using panel
pdf <- pdata.frame(df, index = c("countrycode", "year"))

# This works perfectly
pdf <- mutate(pdf, dX = pdf$X - lag(pdf$X))
pdf

# Pipe doesn't work across the panel
pdf <- pdf %>% mutate(dX2 = X - lag(X))
pdf
4

2 回答 2

2

您需要指定您使用的是来自 dplyr(而不是 plm)的延迟。

pdf <- pdf %>% 
  group_by(countrycode) %>%
  mutate(dX2 = X - dplyr::lag(X))

结果:

  countrycode year X dX dX2
1         ARG 2015 2 NA  NA
2         ARG 2016 2  0   0
3         ARG 2017 1 -1  -1
4         AUS 2015 1 NA   NA
5         AUS 2016 3  2   2
6         AUS 2017 2 -1  -1
7         USA 2015 6 NA   NA
8         USA 2016 5 -1  -1
9         USA 2017 8  3   3
于 2018-10-09T14:18:01.407 回答
1

我相信这与为什么

with(pdf, X - lag(X))

没有按预期给出答案(尊重面板结构),但是:

[1] NA  0 -1  0  2 -1  4 -1  3

评估with()发生在第一个参数内部,通过像这样访问 pdata.frame,pdata.frame 的内部结构用于列不是pseries对象而是裸骨类型(例如数字)的地方。通过使用访问器访问 pdata.frame 的列,该列在那一刻$变成了一个,并且使用了可以尊重面板结构的正确方法。pserieslag

我的猜测是,eval管道运算符 ( %>%) 定义中的构造以相同的方式评估其第一个参数。

(这是当前pdata.frame对象定义的一个缺点)。

于 2018-10-09T21:21:44.347 回答