R中多变量时间序列的自相关

时间:2017-03-01 22:25:14

标签: r matrix time-series

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

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

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

auto-correlation of a single variable

我的数据如下:

> 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

odd plot

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

enter image description here

1 个答案:

答案 0 :(得分:1)

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)) }) 需要转换为数据框,或者需要明确引用每列。下面的代码采用后一种方法:

public static String matchCase(String model, String source){
    boolean o = true;
    if(model.toUpperCase().equals(model)){
      source = source.toUpperCase();
    }
    if(Character.isUpperCase(model.charAt(0))){
      for(int i=1;i<model.length();i++){
         if(Character.isLowerCase(model.charAt(i)) == false){
           o = false;
         }
      }
     // if(o == model.length()-1){
      if(o == true){
        String can = "";
        for(int j=0;j<source.length();j++){
          if(j==0){
            can += Character.toUpperCase(source.charAt(j)); }
          else{
            can += source.charAt(j);
          }
        }
        source = can;
//    Character.toUpperCase(source.charAt(0));
       
  }
    }
    
    return source;
  }
}

enter image description here