You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)))

代码说明

  1. 对每个acf类对象,根据自身的n.used计算对应的显著性临界值2/√T;
  2. 使用any()函数判断该对象的acf数值数组中,是否存在任意一个值超出[-2/√T, 2/√T]的范围;
  3. keep()函数会保留所有满足上述条件的列表元素,即存在显著互相关的结果。

内容的提问来源于stack exchange,提问作者LuCama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:27:01