Лаги не любят Трендов

#r #dplyr #lag #plm

#r #dplyr #отставание #plm

Вопрос:

Давайте возьмем данные

 library(plm)
library(dplyr)
data("EmplUK", package="plm")
dep_var<-EmplUK['capital']
df1<-EmplUK[-6]
df1<-df1[-c(1:5),]
head(df1)
   firm year sector    emp    wage   output
6     1 1982      7  3.166 14.8681  98.6151
7     1 1983      7  2.936 13.7784 100.0301
8     2 1977      7 71.319 14.7909  95.7072
9     2 1978      7 70.643 14.1036  97.3569
10    2 1979      7 70.918 14.9534  99.6083
11    2 1980      7 72.031 15.4910 100.5501
 

Я хочу написать функцию, которая будет учитывать отставание от третьей переменной (столбца) и тенденцию по годам. После этого я хочу выполнить групповую случайную регрессию отдельных эффектов.

Моя работа до сих пор

 fit_panel_lr <- function(y, x) {
  x <- x %>%
    group_by_at(1) %>%
    mutate(across(colnames(x)[3], dplyr::lag, n = 2, default = NA))

  x[, length(x)   1] <- y
  x <- na.omit(x)

  x <- cbind(x, "Trend" = as.numeric(as.factor(x[, 2])))


  varnames <- names(x)[3:(length(x))]
  varnames <- varnames[!(varnames == names(y))]
  form     <- paste0(varnames, collapse = " ")
  x_copy   <- data.frame(x)
  model    <- plm(as.formula(paste0(names(y), "~", form)), data = x_copy,
                  model = "random", effect = "individual")
}
 

Но теперь, когда я пытаюсь выполнить свою регрессию :

 fit_panel_lr(dep_var, df1)
 

Я вижу ошибку :

Ошибка в plm.fit(data, model, effect, random.method, random.models, random.dfcor, : 0 (не NA) случаев

Однако, если я удалю из своей функции функцию задержки, все будет работать.

Очень вероятно, что проблема на самом деле заключается в том, что когда я беру лаг 2, я полностью опускаю фирму 1.

Комментарии:

1. Логика «задержки 2», когда у вас есть только две строки, — это то, что вам нужно сначала выяснить. Одна из идей заключается в group_by_at(1) %>% filter(n() > 2) том, чтобы удалить firm 1 и избежать ошибки. Ваша проблема не в том, что вы опускаете фирму 1, а в том, что данные фирмы 1 — это все NA из-за того, что вы отстали от ее размера. (Вам может потребоваться более 2 наблюдений / строк, так как регрессия по одному наблюдению может быть затруднена; в зависимости от количества зависимых переменных, возможно n() > 4 , или больше. Опять же, это зависит.)

2. Спасибо за ваш комментарий! Ты прав. Может быть, вы знаете, как я могу получить индексы, какие строки были удалены функцией фильтра? Интуитивно что-то вроде «который. deleted.by (фильтр(n()>2)’

3. Не изначально для dplyr или R, вам нужно включить это в свой процесс. Например, если у вас есть уникальное поле идентификатора, вы можете использовать anti_join on x (original) и ваш новый фрейм данных, чтобы найти отсутствующие строки. Или вы можете отфильтровать второй раз %>% group_by_at(1) %>% filter(n() <= 2) (или что бы вы ни изменили 2 ), чтобы получить недостающие строки. Кстати, x_copy меня это смущает; поскольку R работает с копированием при записи, и вы больше не ссылаетесь на оригинал x , зачем вам его копировать? Вы ничего не защищаете и удваиваете использование памяти (если это вызывает беспокойство).

4. Почему вы не используете функцию задержки plm?