R: данные панели plm: как использовать трубы? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть некоторые данные панели, которые выглядят так (код для ввода моего набора данных в конце):

  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 изХ этого года)Он отлично работает, когда я не использую каналы:

library(tidyverse)
library(plm)

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

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

Результаты - это именно то, что я хотел бы: каждое значение dX в 2015 году равно NA, потому что нет значения X для сравнения в 2014 году.

  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 пытается различие между странами?Таким образом, dX2 для США в 2015 году должно быть 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

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Я полагаю, что это имеет ту же причину, что и

with(pdf, X - lag(X))

не дает ожидаемого ответа (с учетом структуры панели), но:

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

Оценка с with()происходит внутри первого аргумента, и при таком доступе к pdata.frame используется очень внутренняя структура pdata.frame, где столбец - это не объект pseries, а голый тип кости (например, числовой).При доступе к столбцу pdata.frame с помощью метода доступа $ столбец становится pseries в этот момент, и используется правильный метод lag, который может учитывать структуру панели.

Я предполагаю, чтоконструкция eval в определении оператора канала (%>%) оценивает свой первый аргумент таким же образом.

(Это недостаток текущего определения объекта pdata.frame).

0 голосов
/ 09 октября 2018

Необходимо указать, что вы используете лаг из 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
...