如何在 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
的列表,您可以取消嵌套以获得包含三列的数据框:id
、lag
和 ccf
.
然后可以按 id
分组以获得最大值 ccf
和发生这种情况的 lag
:
out %>%
unnest(ccfout) %>%
group_by(id) %>%
summarise(max_ccf = max(ccf),
max_ccf_lag = lag[which.max(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
的列表,您可以取消嵌套以获得包含三列的数据框:id
、lag
和 ccf
.
然后可以按 id
分组以获得最大值 ccf
和发生这种情况的 lag
:
out %>%
unnest(ccfout) %>%
group_by(id) %>%
summarise(max_ccf = max(ccf),
max_ccf_lag = lag[which.max(ccf)])