Как я могу динамически рассчитать корреляцию в kdb

#kdb

Вопрос:

У меня есть таблица возвратов, в которой я хочу рассчитать корреляцию для каждых n строк, но я не уверен, как это сделать. Чтобы быть более наглядным, моя таблица t является

sym1 sym2 sym3 sym4
3 4 5 1
0 -1 6 4
-3 10 8 9
-4 19 -1 6

Как я могу рассчитать корреляцию между sym1 и sym2/sym3/sym4 для строки 1-3, затем строки 2-4 и т.д.?

В настоящее время я могу только указать столбец, а затем вычислить, но я пытаюсь найти способ исправить sym1 и выполнить итерацию через sym2-4. Вот мой текущий код

 (cor).'flip flip each {(til x)xprev:y}[3;]each (sym1;sym2) from t
 

Комментарии:

1. Работает ли этот код для вас? По-моему, это не для меня.

2. Это работает только тогда, когда я вычисляю корреляцию между столбцами sym1 и sym2, и мне нужно удалить первые 2 строки.

3. можете ли вы привести пример того, к каким значениям вы хотите применить cor ? например, если вы хотите найти корреляцию между sym1 и sym2 , эквивалентно ли (t`sym1)cor t`sym2 это, т. Е. 3 0 -3 -4 cor 4 -1 10 19 ?

4. для sym1 и sym2 первая корреляция составляет (3 0-3) cor (4 -1 10), затем (0 -3 -4) cor (-1 10 19), в основном каждый раз, когда я вычисляю корреляцию из 3 строк. То же самое относится к sym1 и sym3, sym1 и sym4. Заранее благодарю вас!!

Ответ №1:

Вот решение, которое может сработать для вас.

 q)update s1s2:(cor).'flip{-3#'reverse{-1_x}[x;y]}[-1 count i]each(sym1;sym2)from t
sym1 sym2 sym3 sym4 s1s2
------------------------------
3    4    5    1
0    -1   6    4    1
-3   10   8    9    -0.5447048
-4   19   -1   6    -0.9751578
 

Это только одна корреляция, найденная между столбцами, а именно sym1 amp; sym2 . Первые два результата можно отбросить, так как они не имеют 3 значений, необходимых для корреляции.