【问题标题】:Auto-correlation of multivariate time series in RR中多元时间序列的自相关
【发布时间】:2017-07-21 11:06:57
【问题描述】:

我有一个包含 12 个变量的矩阵,每个变量有 1343 个观察值。我希望计算每个变量的自相关并使用数据的全长来执行此操作,即lag.max = 1343

使用 acf() 函数我可以计算单个变量的自相关,但我希望将所有 12 个变量都绘制在一个矩阵图中 (3 x 4)。

使用acf(linear[,1],lag.max = (length(linear))) 产生:

我的数据如下:

> class(linear)
[1] "matrix"

> str(linear)
 num [1:1343, 1:12] -102 -101 -101 -101 -101 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:1343] "2017-01-20 16:30:00" "2017-01-20 16:45:00" "2017-01-20 17:00:00" "2017-01-20 17:15:00" ...
  ..$ : chr [1:12] "DO0182U09A3" "DO0182U09B3" "DO0182U09C3" "DO0182U21A1" ...

我已经尝试在线性矩阵中传递列的范围

acf(linear[,1:12], lag.max = 1343)

但它似乎产生了一种 acf 图,但每个图中的标题似乎表明了一个相关图,见下图。

通过阅读?acf 中的详细信息,我看到您可以传递一个多元时间序列,我相信我的linear 对象是,但我得到了如下所示的相关图。

我的问题可能是在创建 linear 之前我有一个名为 wideRawXTS 的对象。

> str(wideRawXTS)
An ‘xts’ object on 2017-01-20 16:30:00/2017-02-03 16:00:00 containing:
  Data: num [1:1343, 1:12] -102 -101 -101 -101 -101 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:12] "DO0182U09A3" "DO0182U09B3" "DO0182U09C3" "DO0182U21A1" ...
  Indexed by objects of class: [POSIXlt,POSIXt] TZ: 
  xts Attributes:  
 NULL

由于某些变量中存在缺失值,因此我执行了如下线性插值:

linear <- apply(wideRawXTS, 2, na.interpolation, option = "linear")

是否需要将linear 的第一列重新转换为 XTS 对象?

任何人都可以就我在制作自相关矩阵图时可能出错的地方提供一些指导吗?

> head(linear)
                    DO0182U09A3 DO0182U09B3 DO0182U09C3 DO0182U21A1 DO0182U21A2 DO0182U21A3 DO0182U21B1 DO0182U21B2 DO0182U21B3
2017-01-20 16:30:00     -101.50     -103.37     -103.86     -104.78     -104.95     -105.33     -102.50      -99.43     -104.05
2017-01-20 16:45:00     -101.32     -102.75     -104.22     -104.51     -103.94     -105.29     -102.82     -101.99     -103.94
2017-01-20 17:00:00     -101.45     -103.30     -103.93     -104.70     -104.82     -105.13     -103.72     -103.95     -104.25
2017-01-20 17:15:00     -100.91      -95.92      -99.22     -103.83     -104.72     -105.19     -103.57     -101.36     -104.09
2017-01-20 17:30:00     -100.91     -103.04     -104.09     -102.15     -104.91     -105.18     -103.88     -104.09     -103.96
2017-01-20 17:45:00     -100.97     -103.67     -104.12     -105.07     -104.23      -97.48     -103.92     -103.89     -104.01
                    DO0182U21C1 DO0182U21C2 DO0182U21C3
2017-01-20 16:30:00     -104.51     -104.42     -105.17
2017-01-20 16:45:00     -104.74     -104.65     -105.25
2017-01-20 17:00:00     -105.02     -105.04     -105.32
2017-01-20 17:15:00     -103.90     -102.95     -105.16
2017-01-20 17:30:00     -104.75     -105.07     -105.23
2017-01-20 17:45:00     -105.08     -105.14     -104.89

根据@eipi10 的反馈,这里是他们建议的输出。我的笔记本电脑花了大约 20 分钟来计算这个,但我不知道它代表什么!!所有的情节看起来都是一样的。

【问题讨论】:

  • 这是否符合您的要求:par(mfrow=c(3,4)); sapply(linear, acf, lag.max=nrow(linear))
  • @eipi10 感谢您的回复,您的 cmets 确实生成了矩阵图,但我不知道它代表什么!水平刻度似乎搞砸了。我不知道如何将图片添加到 cmets 但我将使用输出修改原始帖子。

标签: r matrix time-series


【解决方案1】:

linear 是一个矩阵。要使我的第一条评论中的代码正常工作,linear 需要转换为数据框,或者需要显式引用每一列。下面的代码采用后一种方法:

par(mfrow=c(3,4))

set.seed(2)
linear = matrix(cumsum(rnorm(12*50)), ncol=12)

sapply(1:ncol(linear), function(i) {
  acf(linear[,i], main=paste("Column:", i), lag.max=nrow(linear))
  })

【讨论】:

  • 再次感谢,这对我有用。我不知道的一件事是如何在循环遍历每一列时传递新数据框的列名。我尝试了linearDF &lt;- as.data.frame(linear) sapply(1:ncol(linearDF), function(i) { acf(linearDF[,i], main=colnames(linearDF[,i]), lag.max = nrow(linearDF)) }),但是对于每个子图标题,我都会得到一个所有列名的列表,而不是它正在循环的特定列。有什么建议吗?
  • 知道如何将列名传递给每个矩阵图吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 2010-12-15
  • 2018-05-27
  • 2016-06-12
  • 2018-05-19
  • 1970-01-01
  • 2017-02-21
相关资源
最近更新 更多