У меня есть 10-дневные данные ежедневных возвратов по 28 различным валютам. Я хотел бы извлечь первый основной компонент, но вместо того, чтобы использовать PCA в течение всех 10 лет, я хочу перенести двухлетнее окно, потому что поведение валют меняется, и поэтому я хочу это отразить. Однако у меня есть серьезная проблема, заключающаяся в том, что функции princomp () и prcomp () часто переходят от положительной к отрицательной нагрузке в смежных анализах PCA (то есть с интервалом в 1 день). Посмотрите на график загрузки для валюты EUR:
Понятно, что я не могу использовать это, потому что смежные загрузки будут переходить с положительного на отрицательный, поэтому моя серия, которая их использует, будет ошибочной. Теперь посмотрим на абсолютное значение загрузки валюты в евро:
Проблема, конечно, в том, что я до сих пор не могу использовать это, потому что из верхней диаграммы видно, что загрузка действительно меняется с отрицательной на положительную и временами обратно, и эту характеристику мне нужно сохранить.
Есть ли способ, которым я могу обойти эту проблему? Могу ли я заставить ориентацию собственного вектора всегда быть одинаковой в смежных PCA?
Кстати, эта проблема также возникает с функцией FactoMineR PCA (). Код для rollapply здесь:
rollapply(retmat, windowl, function(x) summary(princomp(x))$loadings[, 1], by.column = FALSE, align = "right") -> princomproll
EUR -0.2 ZAR +0.8 USD +0.41
иEUR +0.21 ZAR -0.79 USD -0.4
это очень и очень похожи. Вы просто инвертируете знак в любом из двух результатов.Ответы:
Всякий раз, когда сюжет прыгает слишком сильно, поменяйте ориентацию. Один из эффективных критериев заключается в следующем: вычислить общее количество переходов по всем компонентам. Вычислите общее количество прыжков, если следующий собственный вектор отрицается. Если последний меньше, отрицание следующего собственного вектора.
Вот реализация. (Я не знаком с
zoo
, что может позволить более элегантное решение.)В качестве примера, давайте запустим случайное блуждание в ортогональной группе и немного дрожим для интереса:
Вот скользящий PCA:
Теперь исправлена версия:
источник
@whuber прав в том, что нет ориентации, присущей данным, но вы все равно можете убедиться, что ваши собственные векторы имеют положительную корреляцию с некоторым опорным вектором.
Например, вы можете сделать нагрузки для USD положительными на всех ваших собственных векторах (т. Е. Если загрузка в USD отрицательна, переверните знаки всего вектора). Общее направление вашего вектора все еще произвольно (так как вы могли бы вместо этого использовать EUR или ZAR в качестве ориентира), но первые несколько осей вашего PCA, вероятно, не будут перепрыгивать почти столько же - особенно потому, что ваши скользящие окна так длинная.
источник
Что я сделал, так это вычислил расстояние L1 между последовательными собственными векторами. После нормализации этой матрицы я выбираю порог оценки по азимуту, например, 1, так что если в любом новом цикле изменение превышает этот порог, я переворачиваю собственный вектор, коэффициенты и нагрузки, чтобы иметь согласованность в окне прокрутки. Лично я не люблю навязывать данные знаки в некоторых корреляциях, поскольку они могут быть очень изменчивыми в зависимости от макропрограмм.
источник