113 lines
3 KiB
R
Executable file
113 lines
3 KiB
R
Executable file
## 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()
|