【问题标题】:How to create a regular time series in R, and how to interpretate unit time in CCF function in R如何在 R 中创建常规时间序列,以及如何在 R 中的 CCF 函数中解释单位时间
【发布时间】:2015-08-12 22:15:04
【问题描述】:

首先,一些上下文。代码的主要目标是在变量通量与其预测变量(传感器 1、…、传感器)之间建立滞后相关性。可变通量在过程结束时,因此每个传感器的测量必须在某个时移(滞后)与可变通量相关。为了检测这种滞后,CCF 和 prewhiten 被计算,在变量通量和传感器 1、通量和传感器 2 之间等等......

可变通量和传感器每 5m 采样一次,但由于某种原因,有时这种采样不规律,因此时间序列不规律。

我的代码有两个主要问题。

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

  1. 第二个问题:当我计算CCF时我不知道滞后是什么意思,例如如果我得到滞后-300作为最大滞后,这个时间是多少?有什么方法可以将我的时间序列采样与我的滞后联系起来?我可以用分钟来表达我的滞后吗?**

我的数据大约是一年的测量值,所以我采样了 2 天,在这几天里我计算了所有的计算;当我采样 2 天并使用预白化计算 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)
}

#这个函数并不优雅,但现在可以工作了

生成具有至少 1 天数据的 2 个直径的矩阵的函数

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)

  }

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

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)
  }
}

#函数为每个时间序列创建一个滞后矩阵

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 分钟)之间没有关系,那么我得到的滞后也是无法解释的

欢迎任何建议

提前致谢,

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    我找到了一种使用此功能将我的数据转换为常规 5m 时间序列的方法

    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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 2019-02-05
      • 1970-01-01
      • 2021-10-27
      • 2021-12-09
      • 1970-01-01
      • 2012-09-19
      • 2020-07-04
      相关资源
      最近更新 更多