如何在R中保留达到个体ACF截断值的列表元素?
筛选ACF对象列表:保留存在显著互相关的元素
我有一个包含650个来自ccf()函数的互相关结果的列表,每个元素都是acf类对象,结构如下:
str(d_posts_ccf_10_10) List of 650 $ Europa_Teles_BTR :List of 6 ..$ acf : num [1:61, 1, 1] 0.01628 -0.00581 -0.04069 -0.16275 0.35689 ... ..$ type : chr "correlation" ..$ n.used: int 148 ..$ lag : num [1:61, 1, 1] -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 ... ..$ series: chr "X" ..$ snames: chr ".$Posts_game & .$Posts_stop" ..- attr(*, "class")= chr "acf" $ Polonpo :List of 6 ..$ acf : num [1:61, 1, 1] -0.05826 0.13355 -0.06989 -0.00596 -0.05827 ... ..$ type : chr "correlation" ..$ n.used: int 127 ..$ lag : num [1:61, 1, 1] -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 ... ..$ series: chr "X" ..$ snames: chr ".$Posts_game & .$Posts_stop" ..- attr(*, "class")= chr "acf" $ derchefz :List of 6 ..$ acf : num [1:61, 1, 1] 0 0.0587 -0.0744 0.2663 -0.268 ... ..$ type : chr "correlation" ..$ n.used: int 143 ..$ lag : num [1:61, 1, 1] -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 ... ..$ series: chr "X" ..$ snames: chr ".$Posts_game & .$Posts_stop" ..- attr(*, "class")= chr "acf"
每个元素都有独立的n.used(即时间序列长度T),我需要保留列表中至少有一个ACF值超出±2/√T范围的所有元素,无需手动查看ACF图。以下是我尝试的purrr包代码,寻求正确实现方法:
library(purrr) test_499 <- d_posts_ccf_10_10 %>% keep(.x$acf < 2/sqrt(x$n.used)) %>% keep(.x$acf > -2/sqrt(x$n.used)) test_500 <- d_posts_ccf_10_10 %>% map(~ .x$acf) %>% keep(function(x) x > 2/sqrt(.x$n.used))
问题分析
test_499逻辑完全颠倒:连续调用keep会先保留所有ACF值小于上临界值的元素,再从中筛选ACF值大于下临界值的元素,最终得到的是所有ACF值都在±2/√T范围内的元素,和需求相反;同时存在变量引用错误(x$n.used应为.x$n.used)。test_500丢失关键信息:map(~ .x$acf)把列表转换成了仅含ACF数值的结构,无法再获取每个元素对应的n.used来计算临界值;且只判断了ACF值大于上临界值的情况,遗漏了小于下临界值的情况。
正确实现代码
方法一:匿名函数写法
library(purrr) filtered_ccf <- d_posts_ccf_10_10 %>% keep(function(acf_obj) { # 计算当前元素的显著性临界值 critical_value <- 2 / sqrt(acf_obj$n.used) # 判断是否存在任意一个ACF值超出临界范围 any(acf_obj$acf > critical_value | acf_obj$acf < -critical_value) })
方法二:简洁lambda表达式写法
filtered_ccf <- d_posts_ccf_10_10 %>% keep(~ any(.x$acf > 2/sqrt(.x$n.used) | .x$acf < -2/sqrt(.x$n.used)))
代码说明
- 对每个
acf类对象,根据自身的n.used计算对应的显著性临界值2/√T; - 使用
any()函数判断该对象的acf数值数组中,是否存在任意一个值超出[-2/√T, 2/√T]的范围; keep()函数会保留所有满足上述条件的列表元素,即存在显著互相关的结果。
内容的提问来源于stack exchange,提问作者LuCama
相关产品推荐
相关产品推荐

