%% TESTO
% Importare in formato table (utilizzare come nomi delle righe le
% etichette delle province) i dati presenti nel file benessere.xlsx
% Effettuare la scomposizione in valori singolari (svd) della matrice degli
% scostamenti standardizzati. Z= U \Gamma V'
% Utilizzando le informazioni presenti nella svd.
% Costruire un biplot in cui:
%% BIPLOT A
% i punti riga sono rappresentati dalle componenti principali
% standardizzate e i punti colonna tramite frecce la cui lunghezza
% rappresenta la correlazioni tra le variabili originarie e le componenti
% principali;
%% BIPLOT B
% i punti riga sono rappresentati dalle componenti principali non
% standardizzate e i punti colonna tramite frecce la cui lunghezza
% rappresenta gli autovettori;
%% BIPLOT C
% I punti riga sono rappresentati dalle coordinate della matrice nx2
% $\sqrt(n-1)^\omega *U_(2)*\Gamma_(2)^\alpha$
% e i punti colonna tramite frecce le cui coordinate sono date dalla
% matrice
% $\sqrt(n-1)^(1-\omega) *Gamma_(2)^(1-\alpha) *V_(2)^T$.
% con $\omega$ scalare che può assumere valori, 0, 0.1, 0.2, ..., 1
% e con $\alpha$ scalare che può assumere valori, 0, 0.1, 0.2, ..., 1
% Mostrare che il caseo A) si ottiene ponendo \alpha=0 e \omega=1 e che
% il caso B) si ottiene ponendo \alpha=1 e \omega=1
%% Trovare le componenti principali utilizzando la funzione MATLAB pca
% Trovare gli autovettori, gli score non standardizzati e gli autovalori della matrice di correlazione utilizzando direttamente la funzione MATLAB pca
%% CARICAMENTO DATI

Xtable=readtable('benessere.xlsx','ReadRowNames',true);
% X = matrice di double senza nomi delle righe e nomi delle colonne
X=table2array(Xtable);
[n,p]=size(X);

% Standardizzo i dati
Z=zscore(X);

[U,Gammastar,V]=svd(Z,'econ');
% Controllo sulla svd
max(max(abs(Z-U*Gammastar*V')))
sqn1=sqrt(n-1);
Gamma=Gammastar/sqn1;

%
%% A. BIPLOT CON CP STANDARDIZZATE E CORRELAZIONI
% i punti riga sono rappresentati dalle componenti principali standardizzate e i punti colonna tramite frecce la cui lunghezza rappresenta la correlazioni tra le variabili originarie e le componenti principali;

close all
hold('on')
plot(sqn1*U(:,1),sqn1*U(:,2),'o')
text(sqn1*U(:,1),sqn1*U(:,2),Xtable.Properties.RowNames)

Vgam=V*Gamma;
zeroes = zeros(p,1); 
quiver(zeroes,zeroes,Vgam(:,1),Vgam(:,2))
varlabs=Xtable.Properties.VariableNames;
dx=0.02;
dy=0.03;
text(Vgam(:,1)+dx,Vgam(:,2)+dy,varlabs,'Color','b');

axislim=axis;
% Aggiungo l'asse x
line([axislim(1);axislim(2)], [0;0], 'Color','black');
% Aggiungo l'asse y
line([0;0],[axislim(3);axislim(4)], 'Color','black');

%
%% B. BIPLOT CON ON CP NON STANDARDIZZATE E AUTOVETTORI
% i punti riga sono rappresentati dalle componenti principali non standardizzate e i punti colonna tramite frecce la cui lunghezza rappresenta gli autovettori;

close all
hold('on')
plot(sqn1*U(:,1)*Gamma(1,1),sqn1*U(:,2)*Gamma(2,2),'o')
text(sqn1*U(:,1)*Gamma(1,1),sqn1*U(:,2)*Gamma(2,2),Xtable.Properties.RowNames)

Vgam=V;
zeroes = zeros(p,1); 
quiver(zeroes,zeroes,Vgam(:,1),Vgam(:,2))
varlabs=Xtable.Properties.VariableNames;
dx=0.02;
dy=0.03;
text(Vgam(:,1)+dx,Vgam(:,2)+dy,varlabs,'Color','b');

axislim=axis;
% Aggiungo l'asse x
line([axislim(1);axislim(2)], [0;0], 'Color','black');
% Aggiungo l'asse y
line([0;0],[axislim(3);axislim(4)], 'Color','black');

%
%% C. BIPLOT DINAMICO
% i punti riga sono rappresentati dalle coordinate della matrice nx2  \sqrt(n-1)^\omega  *U_(2)*\Gamma_(2)^\alpha e i punti colonna tramite frecce le cui coordinate sono date dalla matrice \sqrt(n-1)^(1-\omega) *Gamma_(2)^(1-\alpha) *V_(2)^T. con \omega scalare che può assumere valori, 0, 0.1, 0.2, ..., 1 e con \alpha scalare che può assumere valori, 0, 0.1, 0.2, ..., 1 Mostrare che il caso a) si ottiene ponendo \alpha=0 e \omega=1 e che il caso b) si ottiene ponendo \alpha=1 e \omega=1 i punti riga sono rappresentati dalle componenti principali non standardizzate e i punti colonna tramite frecce la cui lunghezza rappresenta gli autovettori;

close all
hold('on')
omega = 0.6;
alpha= 0.5;

PuntiRiga=sqn1^omega*U(:,1:2)*Gamma(1:2,1:2)^alpha;
PuntiColonna=V(:,1:2)*(Gamma(1:2,1:2)^(1-alpha))*sqn1^(1-omega);

plot(PuntiRiga(:,1),PuntiRiga(:,2),'o')
text(PuntiRiga(:,1),PuntiRiga(:,2),Xtable.Properties.RowNames)

zeroes = zeros(p,1); 
quiver(zeroes,zeroes,PuntiColonna(:,1),PuntiColonna(:,2))
varlabs=Xtable.Properties.VariableNames;
dx=0.02;
dy=0.03;
text(PuntiColonna(:,1)+dx,PuntiColonna(:,2)+dy,varlabs,'Color','b');

axislim=axis;
% Aggiungo l'asse x
line([axislim(1);axislim(2)], [0;0], 'Color','black');
% Aggiungo l'asse y
line([0;0],[axislim(3);axislim(4)], 'Color','black');

%
%% UTILIZZO FUNZIONE MATLAB PCA
% Trovare gli autovettori, gli score non standardizzati e gli autovalori della matrice di correlazione utilizzando direttamente la funzione MATLAB pca

% Analisi in componenti principali tramite la funzione pca
% V=  è la matrice degli autovettori
% score = componenti principali non standardizzate
% latent = autovalori ordinati dal più grande al più piccolo
[V,score,latent]=pca(Z);