【问题标题】:Constructing a set of time series using R使用 R 构建一组时间序列
【发布时间】:2016-05-11 15:30:58
【问题描述】:

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

"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 新手的任何帮助。

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    如果您尝试对数据进行分析,则应尝试遵循 reshape 库中最佳描述的数据格式标准。基本上,尝试使用 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,尤其是melt函数。

    【讨论】:

      【解决方案2】:

      您可能会怀疑,有很多方法可以做到这一点,并且都有优点和缺点。

      三维数据结构

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

      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 包提供了许多用于处理长格式数据以及在长格式和宽格式之间转换的工具,这更易于人类阅读。

      【讨论】:

        【解决方案3】:

        @user164385 和@Zakkery 都建议使用长格式数据集。在对主数据框进行子集化后,reshape2 中的一个简单的melt 和一些列重新格式化以适合分析的形式提供了数据集。

          REGION_ID       date   var   stat      value
        1         1 2012-08-14 ari-1 median         NA
        2         2 2012-08-14 ari-1 median         NA
        3         3 2012-08-14 ari-1 median 108.190330
        4         4 2012-08-14 ari-1 median  20.388762
        5         5 2012-08-14 ari-1 median  25.483303
        6         6 2012-08-14 ari-1 median   8.646864
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-14
          • 2019-02-05
          • 2015-05-29
          • 2019-09-06
          • 1970-01-01
          相关资源
          最近更新 更多