如何在 R (ccf) 的互相关列表中找到最大滞后?

How to find the maximum lag in a list of cross correlations in R (ccf)?

这是我的数据示例:

id <- c(1,1,1,1,2,2,3,3,3,3,4,4,4)
Affect <- c(0.8, 0.5, NA, 0.8, 0.2, 0.1, 0.7, 1.1, 0.9, 0.5, 0.3, NA, 0.9)
Paranoia <-  c(0.9, 0.6, 0.4, 0.2, 0.1, NA, 0.3, 0.1, 0.9, 1.5, 0.4, 0.1, 0.6)
both <- data.frame(id, Affect, Paranoia)

现在我分别为每个 ID 计算互相关,这给了我一个列表:

library(tseries)
library(dplyr)
library(tidyr)
out <- both %>%
  group_by(id) %>%
  filter(!(all(is.na(Affect))|all(is.na(Paranoia)))) %>% 
  mutate_at(vars(Affect, Paranoia), replace_na, 0) %>% 
  dplyr::summarise(ccfout = list(ccf(Affect, Paranoia, ylim=c(-10, 10), lag.max=5)))

我现在想做的是找到相关性达到最大值时的滞后以及每个 ID 在该点的相关性值 - 试过了,但没有成功,可能是因为我有列表对于每个 ID:

Find_Max_CCF <- function(Affect,Paranoia)
{
  d<- both %>%
    group_by(id) %>%
    filter(!(all(is.na(Affect))|all(is.na(Paranoia)))) %>% 
    mutate_at(vars(Affect, Paranoia), replace_na, 0) %>% 
    dplyr::summarise(ccfout = list(ccf(Affect, Paranoia, ylim=c(-10, 10))))
  cor = d$acf[,,1]
  lag = d$lag[,,1]
  res = data.frame(cor,lag)
  res_max = res[which.max(res$cor),]
  return(res_max)
}

Find_Max_CCF(both)

错误信息是:

1: Unknown or uninitialised column: 'acf'. 
2: Unknown or uninitialised column: 'lag'. 
3: Unknown or uninitialised column: 'acf'. 
4: Unknown or uninitialised column: 'lag'

你有什么想法吗? 提前致谢。

问题是您创建的 ccfout 列包含 acf 个对象的列表,而您希望它们是数据帧以便能够按照您尝试的方式进行切片。
我通过从 acf 对象 ccf() returns.

ccf_as_df <- function(x, y) {
  # calculate ccf and return it as a list of a dataframe
  # with columns `lag` and `acf`
  ccf_obj <- ccf(x, y, ylim=c(-10, 10), lag.max=5, plot = F)
  ccf_df <- data.frame(lag = as.vector(ccf_obj$lag), ccf = as.vector(ccf_obj$acf))
  return(list(ccf_df))
}

out <- both %>%
  group_by(id) %>%
  filter(!(all(is.na(Affect))|all(is.na(Paranoia)))) %>% 
  mutate_at(vars(Affect, Paranoia), replace_na, 0) %>% 
  summarise(ccfout = ccf_as_df(Affect, Paranoia))

现在,ccfout 列包含 dataframe 的列表,您可以取消嵌套以获得包含三列的数据框:idlagccf.
然后可以按 id 分组以获得最大值 ccf 和发生这种情况的 lag

out %>% 
  unnest(ccfout) %>% 
  group_by(id) %>% 
  summarise(max_ccf = max(ccf),
            max_ccf_lag = lag[which.max(ccf)])