Eu tenho 10 anos de dados de retornos diários para 28 moedas diferentes. Desejo extrair o primeiro componente principal, mas, em vez de operar o PCA nos 10 anos completos, quero aplicar uma janela de 2 anos, porque os comportamentos das moedas evoluem e, portanto, desejo refletir isso. No entanto, tenho um grande problema: as funções princomp () e prcomp () geralmente saltam de cargas positivas para negativas nas análises PCA adjacentes (ou seja, com um dia de intervalo). Veja a tabela de carregamento da moeda EUR:
Claramente, não posso usar isso porque os carregamentos adjacentes saltam de positivo para negativo; portanto, minha série que os utiliza será errônea. Agora, veja o valor absoluto do carregamento da moeda em euros:
Obviamente, o problema é que ainda não posso usar isso, porque você pode ver no gráfico superior que o carregamento passa de negativo para positivo e, às vezes, volta, uma característica que preciso preservar.
Existe alguma maneira de resolver esse problema? Posso forçar a orientação do vetor próprio para ser sempre a mesma em PCAs adjacentes?
A propósito, esse problema também ocorre com a função FactoMineR PCA (). O código para a aplicação cumulativa está aqui:
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
eEUR +0.21 ZAR -0.79 USD -0.4
são muito, muito parecidos. Você simplesmente inverte o sinal em qualquer um dos dois resultados.Respostas:
Sempre que o gráfico saltar demais, inverta a orientação. Um critério eficaz é este: calcule a quantidade total de saltos em todos os componentes. Calcule a quantidade total de saltos se o próximo vetor próprio for negado. Se o último for menor, negue o próximo vetor próprio.
Aqui está uma implementação. (Não estou familiarizado
zoo
, o que pode permitir uma solução mais elegante.)Como exemplo, vamos fazer um passeio aleatório em um grupo ortogonal e instale-o um pouco por interesse:
Aqui está o PCA rotativo:
Agora a versão fixa:
fonte
A @whuber tem razão em não haver uma orientação intrínseca aos dados, mas você ainda pode garantir que seus autovetores tenham correlação positiva com algum vetor de referência.
Por exemplo, você pode tornar as cargas para USD positivas em todos os seus vetores próprios (ou seja, se a carga de USD for negativa, inverta os sinais do vetor inteiro). A direção geral do seu vetor ainda é arbitrária (já que você poderia ter usado EUR ou ZAR como referência), mas os primeiros eixos do seu PCA provavelmente não vão pular tanto - especialmente porque suas janelas são tão grandes.
fonte
O que fiz foi calcular a distância L1 entre os autovetores sucessivos. Depois de normalizar essa matriz, escolho o limiar de pontuação az, por exemplo, 1, para que, em qualquer rolagem nova, a mudança esteja acima desse limiar, inverta o vetor próprio, os fatores e as cargas para ter consistência na janela de rolagem. Pessoalmente, eu não gosto de forçar sinais dados em algumas correlações, pois elas podem ser muito voláteis, dependendo dos drivers de macro.
fonte