R语言自定义CCF函数分组计算结果与单独计算不一致求助
问题原因排查及修正方案
核心差异原因
- 变量顺序颠倒导致滞后方向反转:
ccf(x, y)函数的参数顺序直接决定滞后的物理意义:正滞后k代表x序列领先y序列k期的相关性。你单独测试时传入顺序是ccf(Discharge, CPUE),而分组自定义函数fccf里传入的是ccf(CPUE, Discharge),二者的正滞后结果刚好反向对应,所以数值完全匹配不上。如果你的业务逻辑本来就是要计算CPUE领先Discharge的相关性,保持fccf参数不变的前提下,单独测试时使用相同参数顺序,结果也会对齐。 - 时间序列未按日期排序:CCF计算要求输入序列严格按时间先后顺序排列,原数据集的
Date列为乱序,分组后每个物种的子数据未做排序处理,直接计算也会导致结果错误。
修正后的代码
如果要对齐你单独测试的计算逻辑,调整自定义函数参数顺序,同时增加分组前按日期排序的逻辑即可:
library(tidyverse) # 调整fccf的变量顺序和单独测试时一致,确保滞后方向对齐 fccf = function(data) ccf(data$Discharge, data$CPUE, lag.max = 5, plot = FALSE) facf = function(acf) tibble(aacf = acf$acf[,,1], lag = acf$lag[,,1]) test.df <- df %>% # 先按日期全局排序,分组后子序列自然也是有序的 arrange(Date) %>% group_by(Commonname) %>% nest() %>% mutate(ccf = map(data, ~fccf(.x))) %>% mutate(acf = map(ccf, ~facf(.x))) %>% unnest(acf) %>% # 直接在管道里处理列筛选和负滞后移除 select(Commonname, aacf, lag) %>% filter(lag > 0) test.df
修正后提取Black Sea Bass的正滞后2阶结果,就会和你单独计算绘图的结果一致。
内容的提问来源于stack exchange,提问作者Johnny5ish
相关产品推荐
相关产品推荐

