使用R构造一组时间序列

时间:2016-02-02 17:30:51

标签: r time-series

我想找到一种处理一组时间序列数据的最佳方法。在我的数据集中有几个对象(数千个,一个连续),每个对象具有一组属性(具有中值和方差),用于几个不规则间隔的日期(十进制)。表格的第一行如下所示:

"2012-08-14_ari-1_median" "2012-08-14_ari-1_variance" "2012-08-14_bai_median" "2012-08-14_bai_variance" "2012-08-14_blue_median" "2012-08-14_blue_variance" ... 
"1" 20.388762 3.1271796 0.2533784 0.0374 0.89685684 0.054375805 ...
"2" 25.483303 5.3743725 0.37641725 0.0323 0.89529204 0.05524634 ...
"3" 10.6717825 5.784709 0.52881724 0.0724 0.5804015 0.3661
...

我的目标是对数据属性进行时间分析。因此,我想创建最有效的方法来存储数据。使用所有数据创建数据框很容易。我的问题是如何包括时间。目前的想法是创造这样的东西:

    ari-1                                  bai
    2012-08-14 2012-08-21 2012-09-01 ...   2012-08-14 2012-08-21 2012-09-01 ...
"1" 
"2" 
"3" 
...

另一种选择是:

    2012-08-14         2012-08-21         2012-09-01
    ari-1 bai blue ... ari-1 bai blue ... ari-1 bai blue ...
"1" 
"2" 
"3" 
...

这有可能实现吗?这甚至是一个好方法吗?还有哪些更好的选择?

我尝试使用xts并从数据框的一部分创建了一个对象(首先转发df):

           "1"       "2"       "3" ...
2012-08-14 0.9804026 0.8968568 0.8952920 0.5804015 0.3915596
2012-08-21 0.8128355 0.8878272 0.8045192 0.8428068 0.8696688
2012-09-01 0.6153219 0.4710921 0.4936159 0.5018827 0.7701396

这意味着我的xts只有几行(几十个日期),但很多(数千)列。这仅适用于一个属性。

非常感谢R新手的任何帮助。

3 个答案:

答案 0 :(得分:1)

正如您可能怀疑的那样,有很多方法可以做到这一点,并且都有好处和缺点。

三维数据结构

创建数据对象时最简单的方法可能是保持数据框的结构不变,并通过制作数据框列表来添加时间组件,列表中的每个项目都是及时的快照。

frame_time <- function(t) {
    a = rnorm(5, t, 1)
    b = rnorm(5, t, 2)
    c = rnorm(5, t, 3)
    data.frame(a, b, c)
}
d <- lapply(1:10, frame_time)

如果您是R的新手,从这个对象中提取时间序列数据可能会很麻烦。但您可以使用以下事实:使用[建立索引实际上是一个函数(运行`[`(x, y, z)x[y,z]相同),并将其传递给apply函数之一,像这样:

sapply(d, "[", 1, 1)

(其中"["是因为sapply可以通过名称查找函数以及传递实际函数 - 在这种情况下很有用。)这会使元素处于1,1位置存储在数据框列表中的每个项目。

还有其他几种方法可以做同样的事情,即将数据置于三维结构中。在创建数据集的便利性与以后访问数据集的便利性之间进行权衡时,您选择了哪些边距,因此您应该选择最适合您的边距。

长格式数据

完全不同的方法是使用长格式数据集。这种类型的数据结构依赖于每个数据点的ID变量;在您的情况下,这些可能是时间,对象编号和度量(例如ari-1_median)。数据集的简化版本可能如下所示:

  time variable object         value
1    1        a      1  0.0003081319
2    2        a      1 -1.3294403879
3    1        b      1 -0.1419320288
4    2        b      1 -0.9520839796
5    1        a      2 -0.8922036126
6    2        a      2 -1.8102263590
7    1        b      2 -1.1126900256
8    2        b      2 -0.2621680731

获取长格式数据的时间序列是使用ID变量的简单问题(这里我将上面的长格式数据放入数据框e):

 e$value[e$variable == "a" & e$object == 1]

reshape2软件包提供了许多工具,用于处理长格式数据以及在长格式和宽格式之间转换,这种格式更具人性化。

答案 1 :(得分:0)

如果您尝试对数据进行分析,则应尝试遵循重塑库中最佳描述的数据格式标准。基本上,尝试使用Oracle或任何其他SQL表提供的相同样式。

在您的情况下,我相信数据框架看起来像这样:

variable   measurment      measurment_number       date          value
 ari         median               1              2012-08-14    20.388762
 ari        variance              1                 ...           ....
 ari         median               2              2012-08-14     20.111

等。 这样,您就可以轻松使用dplyr等库来汇总和分析数据。 要以这种方式整理您的数据,我强烈建议您查看reshape library,特别是功能融化

答案 2 :(得分:0)

@ user164385和@Zakkery都建议使用长格式数据集。在对主数据框进行子设置后,$.post(url, { 'data' : 'qdewde' }, function(data) { var vd = $('<div>', {html:data}); alert(vd.find('.entry').length); }, 'html'); 中的一个简单melt和一些列重新格式化以适合分析的形式提供了数据集。

reshape2