#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
onx
(original) и ваш новый фрейм данных, чтобы найти отсутствующие строки. Или вы можете отфильтровать второй раз%>% group_by_at(1) %>% filter(n() <= 2)
(или что бы вы ни изменили2
), чтобы получить недостающие строки. Кстати,x_copy
меня это смущает; поскольку R работает с копированием при записи, и вы больше не ссылаетесь на оригиналx
, зачем вам его копировать? Вы ничего не защищаете и удваиваете использование памяти (если это вызывает беспокойство).4. Почему вы не используете функцию задержки plm?