如何在R中创建常规时间序列,以及如何在R中的CCF函数中解释单位时间

时间:2015-05-29 22:12:02

标签: r time-series

首先,一些背景。该代码的主要目标是建立变量通量与其预测变量(sensor1,...,sensor)之间的滞后相关性。可变通量处于过程的最后,因此每个传感器的测量值必须与可变通量在某个时移(滞后)相关。为了检测这个滞后,计算CCF和prewhiten之间,变量通量和传感器1,磁通和传感器2之间......等等。

每5米对可变通量和传感器进行采样,但由于某种原因,有时这种采样不规则,因此时间序列不规则。

我的代码存在两个主要问题。

** 1。第一个问题:我必须将我的不规则数据帧转换为每5米采样一次的常规数据帧,这意味着重复最后一个值(我不想插值),例如,如果传感器每60米采样一次,我想传播这个值12时间为每5米测量一次。

  1. 第二个问题:当我计算CCF时,我不知道滞后的含义是什么,例如,如果我得到滞后-300作为最大滞后,这是多少时间?有一些方法可以将我的时间序列采样与我的滞后相关联,我可以在几分钟内表达我的延迟吗?**
  2. 我的数据大约是一年的测量结果,所以我抽样2天,在那些天我计算所有的计算;当我抽样2天并且我用prewhiten计算CCF时,最大滞后并不总是相同所以我重复这个过程大约1000次然后我可以估计平均最大滞后和它的分散。

    以下是我的数据示例(仅40个样本)。

           row.names  fecha                 flujo   sensor1 sensor2
    
    2   38465   2012-07-10 03:45:00 0.9617  0.0000  0
    3   38466   2012-07-10 03:50:00 0.9587  0.0000  0
    4   38467   2012-07-10 03:55:00 0.9638  0.0000  0
    5   38468   2012-07-10 04:00:00 0.9653  0.0000  0
    6   38469   2012-07-10 04:05:00 0.9678  0.0000  0
    7   38470   2012-07-10 04:10:00 1.0209  0.0000  0
    8   38471   2012-07-10 04:15:00 0.9573  0.0000  0
    9   38472   2012-07-10 04:20:00 0.9740  0.0000  0
    10  38473   2012-07-10 04:25:00 0.9678  0.0000  0
    11  38474   2012-07-10 04:30:00 0.9743  0.0000  0
    12  38479   2012-07-10 04:55:00 0.9647  0.0000  0
    13  38480   2012-07-10 05:00:00 1.0342  0.0000  0
    14  38485   2012-07-10 05:25:00 1.1007  0.0000  0
    15  38486   2012-07-10 05:30:00 1.0962  0.0000  0
    16  38489   2012-07-10 05:45:00 1.0918  0.0000  0
    17  38490   2012-07-10 05:50:00 1.0918  0.0000  0
    18  38491   2012-07-10 05:55:00 1.1018  0.0000  0
    19  38493   2012-07-10 06:05:00 0.8414  0.0000  0
    20  38494   2012-07-10 06:10:00 1.0406  0.7862  0
    21  38495   2012-07-10 06:15:00 1.0614  0.8123  0
    22  38496   2012-07-10 06:20:00 1.0619  0.7966  0
    23  38497   2012-07-10 06:25:00 1.0557  0.7713  0
    24  38500   2012-07-10 06:40:00 0.8487  0.8541  0
    25  38506   2012-07-10 07:10:00 0.8478  0.9849  0
    26  38515   2012-07-10 07:55:00 1.0776  1.0056  0
    27  38516   2012-07-10 08:00:00 1.0807  0.9735  0
    28  38517   2012-07-10 08:05:00 1.0801  1.0088  0
    29  38518   2012-07-10 08:10:00 1.0737  1.0576  0
    30  38519   2012-07-10 08:15:00 1.01. 
    

    %函数生成2个随机连续日样本

    matriz = function(datos){
    n <- nrow(datos)
    dia.aleatorio <- sample(1:(n/2), 1, replace=F)
    dia.aleatorio
    dia1 <- datos$fecha[dia.aleatorio]
    dia1
    t1 <- dia1$mda
    t1
    dia2 <- dia1 + 86400
    dia2 <- as.POSIXlt(as.character(dia2),format="%Y-%m-%d %H:%M:%S")
    t2 <- dia2$mday
    t1
    t2
    mes.aleatorio <- sample(1:12, 1, replace=F)
    mes.aleatorio
    ifelse(t1>9, p1<-t1, p1 <- paste("0",t1,sep="") )
    ifelse(t2>9, p2<-t2, p2 <- paste("0",t2,sep="") )
    ifelse(mes.aleatorio>9, m2<-mes.aleatorio, m2 <- paste("0",mes.aleatorio,sep="") )
    fecha.elejida1 <- paste(m2,p1, sep ="-")
    fecha.elejida1
    fecha.elejida2 <- paste(m2,p2, sep ="-")
    fecha.elejida2
    molienda.dia1 <- subset(datos, format(datos$fecha,'%m-%d')== fecha.elejida1)
    molienda.dia2 <- subset(datos, format(datos$fecha,'%m-%d')== fecha.elejida2)
    molienda2dias <- rbind(molienda.dia1,molienda.dia2)
    molienda2dias$fecha <- as.POSIXlt(molienda2dias$fecha,format="%Y-%m-%d %H:%M:%S")
    return(molienda2dias)
    }
    

    #此功能不优雅但现在正在使用

    用于生成具有2个dias且具有至少1天数据

    的矩阵的函数
    generar.matriz <- function(matriz.datos) {
      repeat {
        matriz.generada <- matriz(matriz.datos)
        numero.filas <- nrow(matriz.generada)
        # exit if the condition is met
        if (numero.filas > 290) break
    }
      return(matriz.generada)
    
      }
    

    计算最大滞后相关性的函数,仅考虑abs值。

    Find_Max_CCF<- function(a,b){
      d <- ccf(a, b, plot = FALSE)
      cor = d$acf[,,1]
      lag = d$lag[,,1]
      cor.abs = abs(cor)
      res = data.frame(cor,cor.abs,lag)
      res_max = res[which.max(res$cor.abs),]
      return(res_max)
    } 
    

    预先设定两个时间序列

    的功能
    gen.lag2 = function(datos,columna){
     repeat {
        molienda.dia <- generar.matriz(datos)
        y <- xts(molienda.dia[2],molienda.dia$fecha)
        x <- xts(molienda.dia[columna],molienda.dia$fecha)
        m2a=auto.arima(x,lambda =TRUE, ic ="bic", stepwise=FALSE,approx=FALSE)
        bestOrder <- c(m2a$arma[1],m2a$arma[5],m2a$arma[2])
        m2b=arima(y,order=bestOrder,xreg=1:length(y),method="ML", optim.control = list(maxit = 1000))
        maximo.lag <- Find_Max_CCF(residuals(m2b), residuals(m2a))    
        if (maximo.lag$lag < 0) break
    }
    return(maximo.lag$lag)
    }
    
    I only use negative lags because my proceses must be causal 
    

    有时候prewhiting的解决方案导致一个奇异的矩阵和一个函数停止所以我创建了其他函数来使用trycatch来避免这个问题,重复这些过程直到我得到一个解决方案

    lag.filter = function(datos,col,p,q){  
      repeat{
        er <- tryCatch(desf <- gen.lag1(datos,col,p,q), error = function(e) "este es un error")
        if (desf < 0 | class(er) == "numeric")
          return(desf)
      }
    }
    

    #function为每次系列创建一个滞后矩阵

    matriz.desfase = function(data,nrep)
    # se debe ingresar la data normal
    desfases <- numeric()
    for (i 3:ncol(data)){  
    desfase[i-2] <- replicate(nrep, lag.filter2(data,i))
    }
    

    所有这些功能都有效,但我的矩阵不是常规时间序列,所以我必须找到从矩阵中创建常规5m时间系列的方法。如果我在ccf和我的时间序列步骤之间没有关系(在我的情况下是5分钟),那么我得到的滞后是不可解释的

    欢迎任何建议

    提前感谢,

1 个答案:

答案 0 :(得分:0)

我找到了一种方法,可以使用此功能将我的数据转换为常规的5米时间系列

regular = function(x){
    index <- molienda.dia$fecha
    delta.5m <- as.POSIXct(index[1])+(0:576)*60*5
    aux.5m <- xts(rep(NA,length(delta.5m)), order.by=delta.5m)
    #x1 <-na.locf(merge(aux.5m, x)[,2])
    x2 <- merge(aux.5m, na.locf(merge(aux.5m, x)[,2]), join="inner")[,2]
    return(x2)
    }
    x <- regular(x)
    y <- regular(y)

关于我猜的时间单位是秒,因为是我的时间单位基数