R中的部分互相关

时间:2016-08-24 20:09:16

标签: r cross-correlation

我认为标题是相当不言自明的。我想计算两个时间序列之间的互相关,控制其他滞后的值。我无法找到任何现有的R代码来执行此操作,而且我对统计数据(或R)的自信心不足以尝试自己编写内容。它类似于部分自相关函数,仅用于互相关而不是自相关。

如果它有所帮助,我的更大目标是寻找物理系统的不同测量值之间的滞后相关性(首先是来自爆炸物的伽马射线测量的通量和光子指数),目标是建立一般的线性试图预测燃烧事件的模型。

2 个答案:

答案 0 :(得分:0)

查看我的answer 我自己的问题(与您发布的问题相同)。

您可以使用R中的pacf函数,将其扩展为包含2个或更多时间序列的矩阵。我检查了多变量acfccf函数之间的结果,它们会产生相同的结果,因此可以得出关于多变量pacf和不存在的pccf的相同结论

答案 1 :(得分:0)

我相信这项工作

  pccf <- function(x,y,nlags=7,partial=TRUE){
  
  # x (numeric): variable that leads y
  # y (numeric): variable of interest
  # nlags (integer): number of lags (uncluding zero)
  # partial (boolean): partial or absolute correlation
    
  # trim y
  y <- y[-(1:(nlags-1))]
  
  # lagged matrix of x
  x_lagged <- embed(x,nlags)
  
  # process for each lag
  rho <- lag <- NULL
  for(i in 1:(nlags)){
    
    if(partial){
      # residuals of x at lag of interest regressed on all other lags of x
      ex <- lm(x_lagged[,i] ~ x_lagged[,-i])$residuals
      
      # residuals of y regressed on all lags of x but the one of interest
      ey <- lm(y ~ x_lagged[,-i])$residuals
    }else{
      ex <- x_lagged[,i]
      ey <- y
    }
    
    # calculate correlation
    rho[i] = cor(ex,ey, use="pairwise.complete.obs")
    lag[i] = i-1
  }
  
  return(
    tibble(lag=lag, rho=rho) %>%
           arrange(lag)
    )
  
}

# test
n <- 200 # count
nlag <- 6 # number of lags
x <- as.numeric(arima.sim(n=n,list(ar=c(phi=0.9)),sd=1)) # simulate times series x
y <- lag(x,nlag) + rnorm(n,0,0.5) # simulate y to lag x
y <- y[(nlag+1):n] # remove NAs from lag
x <- x[(nlag+1):n] # align with y

pccf(x,y,nlags=10,partial=FALSE) %>%
 mutate(type='Cross correlation') %>%
 bind_rows(
  pccf(x,y,nlags=10,partial=TRUE) %>%
  mutate(type='Partial cross correlation') 
) %>%
ggplot() +
geom_col(aes(-lag,rho),width=0.1) +
facet_wrap(~type,scales='free_y', ncol=1) +
scale_x_continuous(breaks=-10:0) +
theme_bw(base_size=20)