如何在KDB+中实现类似sums的累加相关系数函数cors?
实现kdb+中滚动扩展窗口的相关系数函数
cors 直接重载\运算符无法实现cor的滚动计算,因为相关系数的累积计算依赖于历史的均值、平方和等统计量,而非前一次的相关系数结果。我们可以基于总体协方差和标准差的公式,手动实现类似covs的滚动相关系数函数:
步骤1:实现cors函数
cors:{[x;y] n: til count x + 1; // 滚动窗口大小:1到count x // 计算滚动总体均值 mean_x: sums x % n; mean_y: sums y % n; // 计算滚动总体协方差 cov_pop: sums x*y % n - mean_x*mean_y; // 计算滚动总体方差与标准差 var_x: sums x*x % n - mean_x*mean_x; var_y: sums y*y % n - mean_y*mean_y; std_x: sqrt var_x; std_y: sqrt var_y; // 计算滚动相关系数,将单元素窗口的结果设为0(可选,因单元素无定义) res: cov_pop % (std_x*std_y); @[res; 0; :; 0] }
步骤2:在示例表中测试
使用你提供的测试表:
t: ([] time: 0 1 2 3; col_a: 9 8 20 30; col_b: 3 7 1 60)
执行更新语句:
update running_cor: cors[col_a; col_b] from t
得到结果:
time col_a col_b running_cor ------------------------------ 0 9 3 0 1 8 7 -1 2 20 1 0.9761871 3 30 60 0.9287565
说明
- 函数中使用总体统计量计算,与你示例中
covs的行为一致(单元素协方差为0,双元素协方差为-1)。 - 若需要使用样本统计量(除以
n-1),只需将n替换为til[count x](窗口大小从1到count x,对应分母为n-1),调整公式即可。
内容的提问来源于stack exchange,提问作者tommylicious
相关产品推荐
相关产品推荐

