## principal component analysis
## données .25,2,3,5,10,30 ans USGG pris sur Bloomberg

## librairies
library("xtable")

yc <- data.matrix(read.table("usgg.csv",header=T, sep=";",na.strings = "#NA"))[,-1]
dt <- yc[,7]
yc <- yc[,-7]
time <- c(.25,2,3,5,10,30)
yc.center <- t(t(yc)-apply(yc,2,mean))

## plot des séries
pdf("PCA-tseries.pdf")
par(mfrow=c(3,2))
ts.plot(yc[,1], main="90 jours")
ts.plot(yc[,2], main="2 ans")
ts.plot(yc[,3], main="3 ans")
ts.plot(yc[,4], main="5 ans")
ts.plot(yc[,5], main="10 ans")
ts.plot(yc[,6], main="30 ans")
dev.off()

## plot de l'observation 1
pdf("PCA-observation1.pdf")
plot(time,yc[1,],type="l")

## plot de l'observation 1 avec spline
lines(spline(time,yc[1,]),type="l", col="red")
dev.off()
## différenciation
yc.diff <- diff(yc.center)

##
## Approche #1 (cov)
##

## matrice de variance covariance des différences
yc.diff.vcov <- cov(yc.diff)

## matrice P (vecteurs propres)
P <- eigen(yc.diff.vcov)$vectors
sink("PCA-Pcov.tex",append=FALSE,split=FALSE)
xtable(P,digits=4)
sink()
## valeurs propres (variance par composant)
lambda <- eigen(yc.diff.vcov)$values
sink("PCA-lambdacov.tex",append=FALSE,split=FALSE)
xtable(t(as.matrix(lambda)),digits=4)
sink()
## écart-type par composant
sq.lambda <- sqrt(lambda)

## variance totale (trace de la matrice de valeurs propres)
totvar <- sum(lambda)

## fraction expliquée par composante
lambda/totvar
sink("PCA-prcov.tex",append=FALSE,split=FALSE)
xtable(t(as.matrix(lambda/totvar)),digits=4)
sink()

##
## Approche #2 (corr)
##

## matrice de corrélations des différences
yc.diff.corr <- cor(yc.diff)
## matrice P (vecteurs propres)
Pcorr <- eigen(yc.diff.corr)$vectors
sink("PCA-Pcorr.tex",append=FALSE,split=FALSE)
xtable(Pcorr,digits=4)
sink()
## valeurs propres (variance par composant)
lambda.corr <- eigen(yc.diff.corr)$values
sink("PCA-lambdacorr.tex",append=FALSE,split=FALSE)
xtable(t(as.matrix(lambda.corr)),digits=4)
sink()
## écart-type par composant
sq.lambda.corr <- sqrt(lambda.corr)
## variance totale (trace de la matrice de valeurs propres)
totvar.corr <- sum(lambda.corr)
## fraction expliquée par composante
lambda.corr/totvar.corr
sink("PCA-prcorr.tex",append=FALSE,split=FALSE)
xtable(t(as.matrix(lambda.corr/totvar.corr)),digits=4)
sink()

## graphiques (3 premieres composantes: parallel shift, tilt, curvature)
pdf("PCA-composantes1-2-3.pdf")
par(mfrow=c(2,3))
plot(time,P[,1],col="blue", ylim=c(-1,1), type="l")
plot(time,P[,2],col="blue", ylim=c(-1,1), type="l")
plot(time,P[,3],col="blue", ylim=c(-1,1), type="l")
plot(time,Pcorr[,1],col="red", ylim=c(-1,1), type="l")
plot(time,Pcorr[,2],col="red", ylim=c(-1,1), type="l")
plot(time,Pcorr[,3],col="red", ylim=c(-1,1), type="l")
dev.off()

## produits Score (volatilité expliquée par composante)
Score <- yc.center %*% P
Scorecorr <- yc.center %*% Pcorr
pdf("PCA-score.pdf")
par(mfrow=c(2,1))
ts.plot(Score,col="blue")
ts.plot(Scorecorr,col="red")
dev.off()

## utilisation de la fonction princomp pour fins de comparaison
yc.princomp <- prcomp(yc.diff)
pdf("PCA-verif-princomp.pdf")
plot(yc.princomp, type="l")
dev.off()
