Tengo 10 años de datos de devoluciones diarias para 28 monedas diferentes. Deseo extraer el primer componente principal, pero en lugar de operar PCA en los 10 años completos, quiero implementar una ventana de 2 años, porque los comportamientos de las monedas evolucionan y, por lo tanto, deseo reflejar esto. Sin embargo, tengo un problema importante, que es que tanto las funciones princomp () como prcomp () a menudo saltan de cargas positivas a negativas en los análisis de PCA adyacentes (es decir, con 1 día de diferencia). Eche un vistazo a la tabla de carga para la moneda EUR:
Claramente, no puedo usar esto porque las cargas adyacentes saltarán de positivo a negativo, por lo que mi serie que las usa será errónea. Ahora eche un vistazo al valor absoluto de la carga de divisas EUR:
Por supuesto, el problema es que todavía no puedo usar esto porque puedes ver en la tabla superior que la carga va de negativa a positiva y viceversa, una característica que necesito preservar.
¿Hay alguna forma de evitar este problema? ¿Puedo forzar que la orientación del vector propio sea siempre la misma en PCA adyacentes?
Por cierto, este problema también ocurre con la función FactoMineR PCA (). El código para el rollapply está aquí:
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
yEUR +0.21 ZAR -0.79 USD -0.4
son muy muy parecidos. Simplemente invierte el signo en cualquiera de los dos resultados.Respuestas:
Siempre que la trama salte demasiado, invierta la orientación. Un criterio efectivo es este: calcule la cantidad total de saltos en todos los componentes. Calcule la cantidad total de saltos si se niega el siguiente vector propio. Si este último es menor, niegue el siguiente vector propio.
Aquí hay una implementación. (No estoy familiarizado
zoo
, lo que podría permitir una solución más elegante).Como ejemplo, corramos una caminata aleatoria en un grupo ortogonal y vibremos un poco por interés:
Aquí está el PCA rodante:
Ahora la versión fija:
fuente
@whuber tiene razón en que no hay una orientación que sea intrínseca a los datos, pero aún podría asegurar que sus vectores propios tengan una correlación positiva con algún vector de referencia.
Por ejemplo, puede hacer que las cargas de USD sean positivas en todos sus vectores propios (es decir, si la carga de USD es negativa, cambie los signos de todo el vector). La dirección general de su vector sigue siendo arbitraria (ya que podría haber usado EUR o ZAR como referencia), pero los primeros ejes de su PCA probablemente no salten tanto, especialmente porque sus ventanas corredizas son tan largo.
fuente
Lo que hice fue calcular la distancia L1 entre sucesivos vectores propios. Después de normalizar esta matriz, elijo un umbral de puntaje az, por ejemplo, 1, de modo que si en cualquier nueva rotación el cambio está por encima de este umbral, volteo el vector propio, los factores y las cargas para tener consistencia en la ventana móvil. Personalmente, no me gusta forzar los signos dados en algunas correlaciones, ya que pueden ser muy volátiles dependiendo de los controladores de macro.
fuente