Разностное уравнение R data.table (данные динамической панели)

У меня есть таблица данных со столбцом v2 с «начальными значениями» и столбцом v1 с темпом роста. Я хотел бы экстраполировать v2 на годы, превышающие доступное значение, увеличив предыдущее значение на коэффициент v1. В обозначении «временных рядов» v2(t+1)=v2(t)*v1(t), учитывая v2(0).

Проблема в том, что год начального значения может варьироваться в зависимости от группы x в наборе данных. В некоторых группах версия 2 может быть доступна через несколько лет или вообще не будет доступна. Кроме того, количество лет в группе может варьироваться (несбалансированная панель). Использование функции сдвига не помогает, поскольку она сдвигает v2 один раз и не ссылается на ранее обновленное значение.

        x year        v1       v2
     1: a 2012 0.8501072       NA
     2: a 2013 1.0926093 39.36505
     3: a 2014 1.2084379       NA
     4: a 2015 0.8921997       NA
     5: a 2016 0.8023251       NA
     6: b 2012 1.1005287       NA
     7: b 2013 1.0139800       NA
     8: b 2014 1.1539676       NA
     9: b 2015 1.2282501       NA
    10: b 2016 0.8052265       NA
    11: c 2012 0.8866425       NA
    12: c 2013 0.9952566 44.30377
    13: c 2014 0.9092020       NA
    14: c 2015 1.0295864 15.04948
    15: c 2016 0.8812966       NA

Значение V2, x=a, year=2014 должно быть 39,36*1,208, а в 2015 году этот ответ умножается на 0,89.

Следующий код в наборе циклов работает и делает то, что я хочу:

    ivec<-unique(DT[,x])
    for (i in 1:length(ivec)) {
       tvec<-unique(DT[x==ivec[i] ,y])
         for (t in 2:length(tvec)) {
           if (is.na(DT[x==ivec[i] & y==tvec[t], v2])) {
              DT[x==ivec[i] & y==tvec[t],v2:=DT[x==ivec[i] & y==tvec[(t-1)],v2]*v1]
           }
         }
      }

person ejb    schedule 10.08.2017    source источник
comment
Что делать, если v2 доступен через несколько лет?   -  person CPak    schedule 10.08.2017
comment
В случае нескольких значений v2, доступных в группе, необходимо обновить только отсутствующее, а следующее доступное v2 запускает новую последовательность для обновления.   -  person ejb    schedule 10.08.2017
comment
Следующий код в наборе циклов работает и делает то, что мне нужно: ivec‹-unique(DT[,x]) for (i in 1:length(ivec)) { tvec‹-unique(DT[x== ivec[i], y]) for (t in 2:length(tvec)) { if (is.na(DT[x==ivec[i] & y==tvec[t], v2])) { DT [x==ivec[i] & y==tvec[t],v2:=DT[x==ivec[i] & y==tvec[(t-1)],v2]*v1] } } }   -  person ejb    schedule 10.08.2017


Ответы (1)


Попробуй это:

DT[, v2:= Reduce(`*`, v1[-1], init=v2[1], acc=TRUE), by=.(x, cumsum(!is.na(v2)))]

#     x year        v1       v2
#  1: a 2012 0.8501072       NA
#  2: a 2013 1.0926093 39.36505
#  3: a 2014 1.2084379 47.57022
#  4: a 2015 0.8921997 42.44213
#  5: a 2016 0.8023251 34.05239
#  6: b 2012 1.1005287       NA
#  7: b 2013 1.0139800       NA
#  8: b 2014 1.1539676       NA
#  9: b 2015 1.2282501       NA
# 10: b 2016 0.8052265       NA
# 11: c 2012 0.8866425       NA
# 12: c 2013 0.9952566 44.30377
# 13: c 2014 0.9092020 40.28108
# 14: c 2015 1.0295864 15.04948
# 15: c 2016 0.8812966 13.26306
person sirallen    schedule 11.08.2017
comment
Это замечательно. Я действительно не понимаю, как и почему это работает, или как я мог решить это самостоятельно. Пора действительно читать руководства. (Я начал работать с R неделю назад, после 35 лет работы в SAS. Каким-то образом это связано с «Сохранением» в SAS.) - person ejb; 11.08.2017