Функция временного ряда в dplyr - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю с данными, которые останавливаются в конкретном году, а потом становятся 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 Ответ

0 голосов
/ 10 декабря 2018

Предлагаемое решение:

Начиная с первого 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)
...