按季度插入矩阵中的每日时间序列

时间:2016-10-26 14:10:20

标签: r matrix merge time-series interpolation

我已阅读以下帖子以及相关帖子,我发现它非常有用: Interpolate / Extend quarterly to monthly series

我有类似但更普遍/扩展的问题,我仍然无法解决如何解决问题。得到了七个时间序列的矩阵(名为value1,...,value7,以下),包括63个日期的季度数据以及NA。

> str(test) 
'data.frame':      63 obs. of  8 variables: 
$ Date  : Date, format: "2001-03-30" "2001-06-29" "2001-09-28" ... 
$ value1: num 320 181.1 19.7 133.1 160.6 ... 
$ value2: num 4741 4556 4115 3892 3605 ... 
$ value3: num 146.8 -163.9 73.2 111.6 210.5 ... 
$ value4: num -135 -383.3 104.3 74.7 -75.4 ... 
$ value5: num 21.6 20.2 NA NA NA ... 
$ value6: num -19.1 -82.4 85 134.6 111 ... 
$ value7: num -163 -215 -164 -137 -199 ...


> test
          Date   value1   value2   value3   value4  value5   value6   value7 
1  2001-03-30  319.952 4740.905  146.756 -134.998  21.645  -19.0611 -162.713 
2  2001-06-29  181.103 4555.732 -163.867 -383.334  20.199   -82.3660 -215.105 
3  2001-09-28   19.724 4115.053   73.189  104.300      NA    84.9740 -164.073 
4  2001-12-31  133.134 3891.754  111.567   74.683      NA   134.6460 -136.974 
5  2002-03-28  160.564 3605.080  210.533  -75.351      NA   110.9770 -199.083 
6  2002-06-28 -111.902 3220.115 -107.759  -22.624      NA   408.4770 -172.327 
7  2002-09-30 -127.751 2962.472  -93.616  241.749      NA   687.2240 -195.772 
8  2002-12-31  -59.553 2697.029  -98.068  119.288      NA   903.8211 -137.965 
9  2003-03-31   86.427 2509.511  -78.662 -124.428      NA  1130.9380 -180.496 
10 2003-06-30   90.070 2554.473  -14.345 -66.764      NA   925.9010 -103.080 
11 2003-09-30  246.801 3000.005    0.001 -244.487      NA  1005.6370 -123.959 
12 2003-12-31  325.088 3519.168  388.592  129.915      NA   739.5460 -162.781 
13 2004-03-31  359.263 4041.043  206.260 -101.966      NA   745.8810 -202.047 
14 2004-06-30  367.347 4657.622  254.678  -59.913      NA   852.4181 -360.963 
15 2004-09-30  373.089 4943.322  263.395  -37.116      NA   857.8670 -406.748 
16 2004-12-31  351.817 5001.434  362.188  118.842      NA   663.5370 -470.379 
17 2005-03-31  287.224 4991.632  251.327  39.029  24.245   785.3220 -518.472 
18 2005-06-30  311.324 4989.710  265.163   11.546  25.653   676.1650 -303.265 
19 2005-09-30  369.478 5273.006  429.086  133.030  30.615   667.2330 -362.296 
20 2005-12-30  482.974 5847.577  537.279   63.616  24.447  -265.5200 -329.140 
21 2006-03-31  432.157 5953.107  566.349  196.971  -4.915 -1807.2560 -310.326 
22 2006-06-30  295.014 5909.556  218.850   -6.842 -17.449 -1837.8140 -455.364 
23 2006-09-29  318.926 5714.423  230.185   14.135 -13.551 -1667.5960 -424.892 
24 2006-12-29  232.784 5649.147  271.616  142.736  46.000  2256.0000 -666.418 
25 2007-03-30 -190.000 5549.989   41.000  373.000  62.000  2674.0000 -586.000 
26 2007-06-29  -70.000 5642.622 -635.000 -412.000  80.000  3943.0000 -414.000 
27 2007-09-28  153.000 5873.000  223.000  168.000  76.000  3807.0000 -419.000 
28 2007-12-31  234.000 5858.000   61.000 -153.000  76.000  3380.0000 -266.000 
29 2008-03-31   83.000 6112.000   16.000  110.000  86.000  3534.0000 -323.000 
30 2008-06-30  -18.000 6165.000 -242.000  -82.000  91.000  3694.0000 -106.000 
31 2008-09-30  426.000 6404.000 -216.000 -497.000  87.000  3799.0000  -82.000 
32 2008-12-31 -237.000 5808.000 -250.000  110.000  88.000  3680.0000 -113.000 
33 2009-03-31  -18.000 5498.000 -391.000 -252.000  94.000  2844.0000  -84.000 
34 2009-06-30   33.000 5320.000 -144.000 -120.000 102.000  3107.0000 -112.000 
35 2009-09-30  205.000 4919.000 -142.000 -288.000 110.000  3059.0000 -97.000 
36 2009-12-31 1572.000 5403.000 1150.000 -361.000 116.000  1884.0000 -174.000 
37 2010-03-31  282.000 5800.000   23.000 -237.000  46.000   672.0000  -48.000 
38 2010-06-30  221.000 6269.000  -98.000 -279.000  52.000   684.0000  -31.000 
39 2010-09-30  217.000 6491.000 -124.000 -343.000  53.000   671.0000  -31.000 
40 2010-12-31  511.000 6494.000 -213.000 -647.000  37.000   632.0000  -38.000 
41 2011-03-31  142.000 6533.000 -168.000 -326.000  45.000   485.0000  -38.000 
42 2011-06-30  185.000 6454.000  174.000   17.000  45.000   338.0000 -67.000 
43 2011-09-30  217.000 6526.000  189.000   -5.000  39.000   203.0000  -58.000 
44 2011-12-30  140.000 6568.000  187.000   63.000  41.000   102.0000  -87.000 
45 2012-03-30 -517.000 6540.000  107.000  384.000  41.000   306.0000  -40.000 
46 2012-06-29  142.000 6379.000   81.000  -49.000  41.000   262.0000  -39.000 
47 2012-09-28  -65.000 5958.000 -240.000 -185.000  42.000   560.0000  -32.000 
48 2012-12-31 -356.000 5422.000 -286.000   82.000  43.000   859.0000  -22.000 
49 2013-03-28  -32.000 4925.000 -155.000 -159.000  43.000   861.0000 -20.000 
50 2013-06-28   30.000 4673.000  -35.000   -8.000  40.000   930.0000  -28.000 
51 2013-09-30  152.000 4865.000   21.000  -61.000  46.000   868.0000  -15.000 
52 2013-12-31  189.000 5299.000   21.000 -128.000  43.000   871.0000  -21.000 
53 2014-03-31  102.000 5608.000 -204.000 -277.000  46.000  1156.0000  -21.000 
54 2014-06-30  116.000 5888.000  -28.000 -118.000  46.000  1262.0000  -23.000 
55 2014-09-30  112.000 5856.000   18.000  -65.000  42.000  1270.0000  -29.000 
56 2014-12-31 -282.000 5506.000  116.000  170.000  40.000  1172.0000 -22.000 
57 2015-03-31  -91.000 5139.000 -172.000 -129.000  40.000  1362.0000  -22.000 
58 2015-06-30  -92.000 4640.000  -57.000   55.000      NA  1440.0000  -17.000 
59 2015-09-30 -116.000 4272.000  -59.000 64.000      NA  1505.0000  -25.000 
60 2015-12-31  -15.000 3991.000   53.000  112.000      NA  1477.0000  -32.000 
61 2016-03-31  -35.000 3793.000  -42.000   19.000      NA  1520.0000  -26.000 
62 2016-06-30   25.000 3878.000  -85.000  -67.000      NA  1281.0000  -21.000 
63 2016-09-30 -260.000 4124.000   29.000   67.000      NA   374.0000 -9.000

我想使用三次样条或线性关系插入每日值(输出总共包括5664天)。上面链接中提供的解决方案很好,但只有当我分别在每个时间序列上应用它时,它才有效,我总是需要将其与#34; Date" column:(Date,value1); (日期,价值2); ......,如下所示,这非常耗时:

DateSeq <- seq(test$Date[1],tail(test$Date,1),by="1 day")   
test1 <- test[1:2] 
test2 <- test[c(1,3)] 
...   
test1Daily <- data.frame(test=DateSeq, Interp.Value=spline(test1, method="natural", xout=DateSeq)$y) 
test2Daily <- data.frame(test=DateSeq, Interp.Value=spline(test2, method="natural", xout=DateSeq)$y) 
...
merge1 <- merge(test1, testDaily1, by='Date', all.y = T) 
merge2 <- merge(test2, testDaily2, by='Date', all.y = T)
...

...然后最终合并上面的所有合并变量。 有谁知道如何将插值应用到整个矩阵(意味着每列,或时间序列)?

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

我找到了以下解决方案,以及绘制它以验证事情运作良好的方法。希望它对其他人有用!

test_z1 <- zoo(test, order.by = test$Date, frequency = 1)
test_t1 <- as.ts(x=test_z1)
test_t2 <- as.zoo(test_t1)
index(test_t2) <- as.Date(index(test_t2), origin = '1970-01-01')
test_t2_ncol <- test_t2[,-c(1)]
test_g <- na.spline(test_t2_ncol)

现在我将每个时间序列(&#34; value1,value2,...&#34;,在&#34; test&#34;中)放在一起,并在#34; test_g&#中使用自己的插值时间序列34;并绘制它们以通过眼睛验证插值的优点:

interp_val1 <- test_g[,-c(2:7)]
orig_val1 <- test[,-c(3:8)]
orig_val1_z <- read.zoo(orig_val1)
merge_val1 <- merge(orig_val1_z, interp_val1)
options(stringsAsFactors = FALSE) # to avoid conversion to factors
merge_val1_df <- data.frame(Date=time(merge_val1), merge_val1, check.names=FALSE, row.names=NULL)
plot(merge_val1_df$orig_val1_z, lwd=2)
lines(merge_val1_df$interp_val1, lwd=1, col="green")

似乎插值效果很好!