【问题标题】:R data.table difference equation (dynamic panel data)R data.table 差分方程(动态面板数据)
【发布时间】:2018-01-18 11:31:42
【问题描述】:

我有一个数据表,其中包含带有“初始值”的列 v2 和具有增长率的列 v1。我想通过将先前的值增加因子 v1 来推断 v2 超过可用值的年份。在“时间序列”表示法中,v2(t+1)=v2(t)*v1(t),给定一个 v2(0)。

问题是,初始值的年份可能因数据集中的 x 组而异。在某些组中,v2 可能会在多年后可用,或者根本不可用。此外,每组的年数可能会有所不同(不平衡面板)。使用 shift 函数没有帮助,因为它移动了 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]
           }
         }
      }

【问题讨论】:

  • v2多年可用怎么办?
  • 如果一个组中有多个v2可用的值,只需要更新缺失的,下一个可用的v2开始一个新的更新序列。
  • 下面的代码,在一组循环中,工作并做我想做的事: ivec

标签: r data.table panel-data


【解决方案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

【讨论】:

  • 这很棒。我真的不明白这是如何或为什么起作用的,或者我怎么能自己解决这个问题。是时候真正阅读手册了。 (在 SAS 工作了 35 年后,我一周前开始使用 R。不知何故,这与 SAS 中的“保留”有关。)
猜你喜欢
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2017-09-01
相关资源
最近更新 更多