按时间序列的线性脊椎插值

时间:2019-01-16 18:00:56

标签: r interpolation zoo linear-interpolation

我正在处理1990-2018年数千家上市公司的资产负债表的时间序列。在某些年份,我只有年度资产负债表,而在另一些年份,我拥有5个资产负债表,其中包括1个年度资产负债表和4个季度资产负债表。我正在尝试使用所有可用信息。资产负债表的日期始终为xxxx-01-01 / xxxx-03-31 / xxxx-06-30 / xxxx-09-30 / xxxx-12-31。我选择代码编号,日期,长期责任和短期责任。我想首先将长期负债和短期负债之和作为新列计算,并按每月的代码编号对新列进行线性脊柱插值。日期采用月份年份的形式。

code       date type           cl        ll       
 1   1990-12-31    A     56280000         0        
 1   1991-12-31    A     77230000         0        
 1   1992-12-31    A    195893200         0        
 1   1993-01-01    A            0         0        
 1   1994-06-30    A            0         0        
 1   1994-12-31    A            0         0        
 1   1996-12-31    A            0         0        
 2   1991-12-31    A    374334527   3500000   
 2   1992-12-31    A    688472115  19820785  
 2   1993-12-31    A   1135584690  70268722  
 2   1994-12-31    A   1442120726  85175588  
 2   1995-06-30    A   1571620470         0 

我知道如何使用splinefun和na.approx在时间间隔恒定时执行此操作。但是我不知道如何处理非恒定时间间隔。谢谢!

1 个答案:

答案 0 :(得分:0)

我刚得到了想要的结果。这个想法来自类似的问题https://stackoverflow.com/a/31383995/10714457。值得注意的一件事是月份列采用字符形式。我需要as.numeric(month)首先将它们转换为数字。

 DF$month <- format(as.Date(DF$date), "%m")
 DF$year <- format(as.Date(DF$date), "%Y")
 res <- setDT(DF)[, .SD[match(1:12, as.numeric(month))], by = .(year, code)]
 cols <- c("ll", "cl", "ncl")
 Interpolation <- res[, (cols) := 
 lapply(.SD, na.approx, na.rm = FALSE), .SDcols = cols]