Функция временного ряда в dplyr
Я работаю с данными, которые останавливаются в конкретном году, а потом становятся NA. И мне нужно рассчитать множество переменных на основе запаздывающих значений других переменных. Я хотел бы найти способ, которым вычисляется целый ряд, а не каждый раз один год, когда одной из переменных является NA. Я смотрел на dplyr, учитывая, что я работаю с данными панели и, следовательно, нужно сгруппировать их по идентификатору.
Я приведу пример ниже:
set.seed(1)
df <- data.frame( year = c(seq(2000, 2018), seq(2000, 2018)) , id = c(rep(1, 19),rep(2, 19)), varA = floor(rnorm(38)*100), varB= floor(rnorm(38)*100), varC= floor(rnorm(38)*100))
df <- df %>% mutate(varA = if_else(year>2010, as.double(NA) , varA) ,
varB = if_else(year>2010, as.double(NA) , varB),
varC = if_else(year>2010, as.double(NA) , varC)) %>% group_by(id) %>% arrange(year)
Я хотел бы найти способ вычислить переменную, которая равна переменной C, когда она доступна, но впоследствии равна формуле, основанной на запаздывающих значениях переменных C, B и A. При выполнении кода ниже, varResult и D рассчитываются только на один год, учитывая, что лаги доступны только на один год:
df <- df %>% mutate( varD = lag(varA)*lag(varB),
varRESULT = if_else(is.na(varC), lag(varC, 1)/lag(varD, 2)*lag(varD, 1), varC))
Но я хотел бы найти способ посчитать сразу все серии (с учетом размерности данных на панели) вместо того, чтобы повторять код 7 раз. Желательно решение, в котором вы можете рассчитывать varD отдельно от varResults, учитывая, что в конечном приложении у меня есть несколько переменных, которые связаны друг с другом.
1 ответ
Предложенное решение:
Начиная с первого NA
"рекурсивный" lags
из вар varA
, varB
, а также varC
равны последнему значению этих переменных.
Таким образом, начиная с этих исходных переменных, мы можем создавать новые переменные: varA1
, varB1
, а также varC1
где мы заполняем NA
с последним значением id
:
library(dplyr)
library(tidyr) # for the function `fill`
df <- df %>%
mutate(varA1 = varA, varB1 = varB, varC1 = varC) %>%
group_by(id) %>%
arrange(year) %>%
fill(varA1, varB1, varC1) # fills with last value
Затем мы применяем формулу:
df <- df %>%
mutate( varD = lag(varA1)*lag(varB1),
varRESULT = if_else(is.na(varC), lag(varC1, 1)/lag(varD, 2)*lag(varD, 1), varC)) %>%
select(-varA1, -varB1, -varC1)