Escolar Documentos
Profissional Documentos
Cultura Documentos
p
r
i
o
s
(
Recta = 1
3
1 2 3 4
0
10
20
30
40
50
60
70
80
90
100
Principal Components
V
a
r
i
a
n
c
e
E
x
p
l
a
i
n
e
d
(
%
)
0%
10%
20%
30%
40%
50%
60%
70%
80%
90%
100%
Pela anlise do grfico da figura 1, baseando no critrio valor prprio-1, o nmero de
componentes principais a reter ser, ento, de quatro (4) componentes principais.
Figura 2 Varincia explicada pelos 4 componentes principais.
A partir da figura 2 e da tabela dos valores prprios (ver anexo I), pode verificar-se que o
primeiro componente por si s, explica 77.60% da varincia total, o segundo componente
9.42%, o terceiro componente 4.91% e por fim o quarto componente explica 3.97%. Isto
significa que a percentagem da varincia cumulativa dos componentes 1, 2, 3 e 4 de 95.91%.
Na figura 3 e 4, esto representados os valores de loadings e scores autoescalonadas,
respectivamente, obtidos pelo modelo PCA.
4
0.12
0.14
0.16
0.18
0.2
0.22
-0.4
-0.2
0
0.2
0.4
0.6
-0.2
0
0.2
0.4
0.6
PC1(77.60%)
PC2(9.42%)
P
C
3
(
4
.
9
1
%
)
Figura 3 Representao grfica dos loadings combinados.
Os loadings contem informao sobre a relao entre as variveis. Estes valores para cada
componente principal escolhido traduzem-se no co-seno do ngulo que o eixo correspondente
a cada varivel faz com o componente principal em questo. As variveis importantes para um
certo comonente principal apresentam um pequeno ngulo com o seu eixo e por outro lado as
variveis que fazem ngulos de 90 com um componente principal no so importantes para
este componente principal.
As variveis distantes da origem so importantes no modelo de PCA.
5
-10
-5
0
5
10
-4
-2
0
2
4
-3
-2
-1
0
1
2
3
PC1(77.60%)
PC2 (9.42%)
P
C
3
(
4
.
9
1
%
)
Figura 4 Representao grfica dos Scores combinados.
Os scores correspondem s direces ortogonais de maior variabilidade das variveis e
permitem conhecer as relaes entre as amostras, bem como identificar possveis outliers.
Como se pode verificar na figura 4, no existe nenhuma observao distante do centro dos
dados face s distncias das restantes observaes, o que nos permite concluir que a partida
no h existncia de qualquer outilier. Este facto pode ser comprovado, analisando o grfico da
figura 5.
As observaes que no so bem explicadas pelo modelo PCA podem ser identificadas pela
representao grfica do quadrado da distncia ao subespao PCA (quadrado residual) como
representado na figura 5.
6
0 5 10 15 20 25
0
0.5
1
1.5
2
2.5
3
3.5
4
Observaes
Q
r
e
s
25
9
Figura 5 Quadrado dos resduos em funo do nmero de observaes.
Pela anlise do grfico da figura 5, pode verificar que existem duas observaes suspeitas de
outliers, nomeadamente a observao nmero 9 e nmero 25, respectivamente. Neste caso
seria necessrio recorrer a uma anlise mais aprofundada para a sua confirmao. Contudo,
no se considerou que estas observaes se traduzem em outliers.
Regresso Linear Mltipla (RLM)
Uma regresso linear ilustra a relao entre a varivel dependente e a varivel dependente
baseando na seguinte equao:
(1)
Onde:
Intercepo na origem;
7
] = [
] [
] + [
]
Como temos mais variveis do que observaes, ento a matriz X no invertvel, por isso
impossvel determinar os coeficientes de regresso (
j
) por este modelo se considerarmos
todas as variveis e tambm porque h elevada colinearidade nos dados, uma vez que obteve-
se pelo menos um valor de VIF superior a 10 (VIF> 10), o que faz com que os parmetros
tenham maior varincia (so mais instveis).
VIF (Variance Inflation Factor):
(
)
(2)
O problema de colinearidade pode ser contornado utilizando vrios mtodos como:
Mtodos de seleco de variveis;
Mtodos de projeco;
Mtodos de encolhimento.
No presente trabalho foi utilizado o mtodo de seleco de variveis, onde o princpio baseia-se
em seleccionar apenas as variveis que explicam melhor a variabilidade de y. Para isso
recorreu-se a funo interna do MATLAB stepwisefit.
As variveis seleccionadas pela funo stepwisefit foram: x [:, 1 3 4 7 11 14 16 21 22 23 24], ou
seja, apenas estas variveis sero utilizadas no modelo de previso.
8
0 2 4 6 8 10 12 14 16 18 20
0
0.02
0.04
0.06
0.08
0.1
0.12
Number of dimensions
R
M
S
E
C
,
R
M
S
E
C
V
RMSEC
RMSECV
Regresso dos Componentes Principais (PCR)
O procedimento semelhante com o mtodo de RLM, s que desta feita o x substitudo por T
(scores). O modelo de PCR baseia na regresso, mas sem o problema de colinearidade dado que
os scores so perpendiculares entre si.
Como no mtodo de Regresso Linear Mltipla, foi utilizado a funo interna stepwisefit do
MATLAB, mas neste caso em vez das variveis foram o scores. E os scores seleccionados foram:
T [:, 5 6 7 8 9 10 21].
Partial Least Squares (PLS)
Neste mtodo fez-se, primeiramente, o processamento dos dados de treino e teste,
respectivamente. Seguidamente utilizou-se a funo sp_crossval _pls (programa distribudo
pelo professor), ou seja, utilizando a metodologia de validao cruzada, para a seleco do
nmero mximo de dimenses a considerar, como se pode verificar no esquema da figura 7.
Figura 7 RMSEC e RMSECV em funo do nmero de dimenses.
9
A partir da anlise do valor de RMSECV da figura 7, pode-se verificar que o nmero de variveis
latentes a utilizar de 8.
Comparao dos vrios modelos de estimao (RLM, PCR e PLS)
Na tabela 1 esto apresentadas os parmetros obtidos dos vrios modelos de regresso (RLM,
PCR e PLS) para o conjunto treino e os parmetros da sua capacidade de previso da resposta
no conjunto de dados de teste.
Tabela 1 Parmetros obtidos dos vrios modelos de regresso utilizados para o conjunto
treino e a sua capacidade de previso da resposta y no conjunto de teste.
Treino Teste
R
2
RMSEC R
2
prev
RMSEP
RLM 0.9626 0.0109 0.4541 0.0418
PCR 0.9204 0.0160 0.1282 0.0528
PLS 0.9290 0.0151 0.7801 0.0265
Pela comparao dos parmetros obtidos dos diversos mtodos utilizados, verificou-se que o
mtodo RLM foi aquele que apresentou melhor capacidade de ajuste, com R
2
= 0.9626 e RMSEC
= 0.0109. Em relao a capacidade de previso da resposta (Y) no conjunto de teste, o mtodo
de PLS foi aquele que exibiu os melhores valores, ou seja, R
2
prev
mais elevado (R
2
prev
= 0.7801) e
menor valor de RSMEP (RSMEP = 0.0265).
10
Anexo I
11
Tabela 1 Valores prprios, varincia e varincia acumulada obtidos para os valores
componentes.
Componentes Valores prprios % Varincia % Varincia acumulada
1 20.95 77.60 77.60
2 2.54 9.42 87.03
3 1.33 4.91 91.94
4 1.07 3.97 95.91
5 0.61 2.26 98.16
6 0.23 0.85 99.02
7 0.08 0.31 99.32
8 0.07 0.24 99.57
9 0.04 0.14 99.70
10 0.03 0.12 99.82
11 0.02 0.07 99.90
12 0.01 0.05 99.95
13 0.01 0.02 99.97
14 0.00 0.01 99.98
15 0.00 0.01 99.99
16 0.00 0.00 99.99
17 0.00 0.00 99.99
18 0.00 0.00 100.00
19 0.00 0.00 100.00
20 0.00 0.00 100.00
21 0.00 0.00 100.00
22 0.00 0.00 100.00
23 0.00 0.00 100.00
24 0.00 0.00 100.00
25 0.00 0.00 100.00
26 0.00 0.00 100.00
27 0.00 0.00 100.00
12
Script MATLAB
% TCNICAS AVANADAS DE MODELAO E SIMULAO
% Antonio Rosa e Luis Gomes
% @ DEQ - FCTUC, Coimbra Junho 2012
%* ANALISE DE DADOS INDUSTRIAIS *%
%% PRINCIPAL COMPONENTS ANALISYS (PCA)
% PAH Treino Data import
clear; clc; close all
l = importdata('PAH_treino_9.xls');
x = l.data(:,1:end-1);
y = l.data(:,end);
n = size(x,1); % linhas
m = size(x,2); % colunas
% Centrar as variaveis
x_bar = mean(x); % media de x
xc = x - ones(n,1)*x_bar;
%% Autoscalling
% z1 = xc*inv(diag(std(x)));
% apenas um teste: o que da a mesma coisa
for i=1:n
for j=1:m
z(i,j) = (x(i,j) - x_bar(:,j))./std(x(:,j));
end
end
%% Calculo da matriz de variancias-covariancias
covz = cov(z);
[V D] = eig(covz);
lamb = diag(D);
%% Ordenar os pares (valor proprio,vector proprio) por ordem decrescente de
%% valor proprio
[lambda,IX] = sort(lamb,'descend');
L = V(:,IX); % loads PCA
T = z*L; % scores PCA
%% Analisar os valores proprios(variabilidade explicada pelos pcs)
13
figure(1)
plot(lambda,'bo-
','markersize',8,'markeredgecolor','k','markerfacecolor','b');
xlabel('Nmero de Componentes')
ylabel('Valores Prprios (\lambda)')
% set(p,'linewidth',2)
line([0 30],[1 1],'Color','red','linestyle','--');
grid on
legend('\lambda','Recta \lambda = 1')
%% Escolher o numero de PC's
% figure(1)
% [dummy,h] = sort(y);
% set(gcf,'DefaultAxesColorOrder',jet(60));
% plot3(repmat(1:27,25,1)',repmat(y(h),1,27)',x(h,:)')
% % set(gcf,'DefaultAxesColorOrder','default');
% xlabel('Wavelength Index'); ylabel('Nap'); axis('tight');
% grid on
%
var_pc = lambda./sum(lambda)*100;
cum_var_pc = cumsum(var_pc);
i = 1:size(var_pc);
tabela = [i' lambda var_pc cum_var_pc];
disp('-----------------------------------------------------------------------
-')
fprintf('Componentes Valores Proprios Varincia Varincia
acumulada\n')
disp('-----------------------------------------------------------------------
-')
for j=1:m
fprintf(' %2.0f %+5.2f %+5.2f
%+5.2f\n',tabela(j,:))
end
disp('-----------------------------------------------------------------------
-')
% figure(10)
% plot(1:27,cum_var_pc);
% The pareto function make a scree plot of the percent variability
% explained by each principal component
figure(2)
pareto(var_pc)
xlabel('Principal Components')
14
ylabel('Variance Explained (%)')
% figure(3)
% biplot(L(:,1:2),'scores',T(:,1:2))
%% Analisar Loads
figure(4)
plot3(L(:,1),L(:,2),L(:,3),'o','markersize',8,'markeredgecolor','k','markerfa
cecolor','b')
xlabel('PC1(77.60%)')
ylabel('PC2(9.42%)')
zlabel('PC3(4.91%)')
grid on
% line([0.13 0.22],[0 0],'Color', 'black');
% for i=1:m
% text(L(:,1),L(:,2))%, vari(i,:))
% end
% title('Loadings plot for PC1 and PC2')
% gname
figure(5)
subplot(1,2,1)
plot(L(:,1),'o','markersize',8,'markeredgecolor','k','markerfacecolor','b')
% [C1,I1] = max(abs(L(:,1))); maxL1 = L(I1,1); % Varivel mais importante
para o PC1
% hold on
% plot(I1,maxL1,'ro','markersize',8)
% text(I1,L(I1,1),'Varivel mais importante','FontSize',7)
xlabel('Componentes')
ylabel('1^s^t Principal Component (77.60%)')
% grid on
subplot(1,2,2)
plot(L(:,2),'o','markersize',8,'markeredgecolor','k','markerfacecolor','b')
% [C2,I2] = max(abs(L(:,2))); maxL2 = L(I2,2); % Varivel mais importante
para o PC2
% hold on
% plot(I2,maxL2,'ro','markersize',8)
% text(I2,L(I2,2),'Varivel mais importante','FontSize',7)
xlabel('Componentes')
ylabel('2^n^d Principal Component (9.42%)')
% line([0 30],[0 0],'Color', 'black');
% grid on
%% Analisar Scores
figure(6)
plot3(T(:,1),T(:,2),T(:,3),'o','markersize',8,'markeredgecolor','k','markerfa
cecolor','b')
xlabel('PC1(77.60%)')
ylabel('PC2 (9.42%)')
zlabel('PC3 (4.91%)')
15
grid on
% line([-10 10],[0 0],'linestyle','--','color','k')
% line([0 0],[-3 4],'linestyle','--','color','k')
% axis square
% set(gca,'XGrid','on')
% line([-10 10],[0 0],'Color','black');
% % for i=1:m
% % text(T(:,1),T(:,2))%, vari(i,:))
% % end
% title('Scores plot for PC1 and PC2')
% circle
% hold on
% t = linspace(0,2*pi,1000);
% h = 0;
% k = -5;
% r = 10;
% x_cir = r*cos(t) + h;
% y_cir = r*sin(t) + k;
% plot(x_cir,y_cir);
% axis square;
figure(7)
subplot(2,2,1)
plot(T(:,1),'o','markersize',8,'markeredgecolor','k','markerfacecolor','b')
xlabel('Componentes')
ylabel('PC1 (77.60%)')
% grid on
subplot(2,2,2)
plot(T(:,2),'o','markersize',8,'markeredgecolor','k','markerfacecolor','b')
xlabel('Componentes')
ylabel('PC2 (9.42%)')
% line([0 30],[0 0],'Color', 'black');
% % grid on
subplot(2,2,3)
plot(T(:,3),'o','markersize',8,'markeredgecolor','k','markerfacecolor','b')
xlabel('Componentes')
ylabel('PC3 (4.91%)')
subplot(2,2,4)
plot(T(:,4),'o','markersize',8,'markeredgecolor','k','markerfacecolor','b')
xlabel('Componentes')
ylabel('PC4 (3.97%)')
%% Anlise da fraco da variabilidade apresentada por cada varivel
%que explicada pelo modelo
%Para um s PC
figure(8)
Z1 = T(:,1)*L(:,1)';
subplot(2,1,1)
stem(var(Z1),'o','markersize',8,'markeredgecolor','k','markerfacecolor','b');
% var(Z1) o primeiro valor prprio
16
xlabel('Nmero de Variveis');
ylabel('var(Z_1)')
title('Variance captured by 1 PC model')
axis([0 27 0 1.2])
p = 4; % Numero de componentes principais que explicam o modelo
% Para p componentes principais
Zp = T(:,1:p)*L(:,1:p)';
subplot(2,1,2)
stem(var(Zp),'o','markersize',8,'markeredgecolor','k','markerfacecolor','b');
xlabel('Nmero de Variveis');
ylabel('var(Z_p)')
title('Variance captured by 4 PC model')
axis([0 27 0 1.2])
%% Residuos
E = z - Zp;
Q_res = sum(E.^2,2); % Quadrado do residuo
figure(9)
plot(Q_res,'o-','markersize',8,'markeredgecolor','k','markerfacecolor','b')
stem(Q_res,'--b','fill','MarkerFaceColor','b','MarkerEdgeColor','k')
title('')
xlabel('Observaes')
ylabel('Q_r_e_s')
grid on
%% Calculo do valor VIF
varB = (x'*x)^(-1);
Cjj = diag(varB);
VIF = Cjj;
%% MULTIPLE LINEAR REGRESSION (MLR)
% PAH Teste Data import
l1 = importdata('PAH_teste_9.xls');
x_test = l1.data(:,1:end-1);
y_test = l1.data(:,end);
% Centrar as variaveis
x_testc = x_test - ones(n,1)*x_bar; % media de x do treino
% Autoscalling
for i=1:n
for j=1:m
z_test(i,j) = (x_test(i,j) - x_bar(:,j))./std(x(:,j));
end
17
end
% Scores
T_test = z_test*L; % Loads do treino
% x_t = [ones(n,1) x];
% beta = inv(x_t'*x_t)*x_t'*y;
% Y = x_t*beta;
% beta_reg = regress(y,x_t);
% calcular o VIF
% stepwise(x,y,[],0.3,0.3)
[b,se,pval,inmodel,stats,nextstep,history] =
stepwisefit(x,y,'penter',0.3,'premove',0.30); % Final columns included: 1 3
4 7 11 14 16 21 22 23 24
xin_MLR = x(:,inmodel==1);
bin_MLR = b(inmodel==1);
int_MLR = stats.intercept;
yest_MLR = [ones(size(x,1),1) xin_MLR]*[int_MLR bin_MLR']';
res_MLR = y - yest_MLR;
R2_MLR = 1 - sum(res_MLR.^2)/sum((y - mean(y)).^2);
xin_tMLR = x_test(:,inmodel==1);
yest_tMLR = [ones(size(x_test,1),1) xin_tMLR]*[int_MLR bin_MLR']';
res_tMLR = y_test - yest_tMLR;
% resP_MLR = y_test - yest_tMLR;
R2_tMLR = 1 - sum((res_tMLR).^2)/sum((y_test - mean(y_test)).^2);
% R2P_tMLR = 1 - sum((resP_MLR).^2)/sum((y_test - mean(y_test)).^2);
% Clculo dos erros
RMSEC_MLR = (sum((yest_MLR - y).^2)/n)^.5;
RMSEP_MLR = (sum((yest_tMLR - y_test).^2)/n)^.5;
%% PRINCIPAL COMPONENTS REGRESSION (PCR)
[b1,se1,pval1,inmodel1,stats1,nextstep1,history1] = stepwisefit(T,y); % Final
columns included: 5 6 7 8 9 10 21
Tin_PCR = T(:,inmodel1==1);
bin_PCR = b1(inmodel1==1);
int_PCR = stats1.intercept;
yest_PCR = [ones(size(T,1),1) Tin_PCR]*[int_PCR bin_PCR']';
res_PCR = y - yest_PCR;
R2_PCR = 1 - sum(res_PCR.^2)/sum((y - mean(y)).^2);
% teste
18
Tin_tPCR = T_test(:,inmodel1==1);
yest_tPCR = [ones(size(T_test,1),1) Tin_tPCR]*[int_PCR bin_PCR']';
res_tPCR = y_test - yest_tPCR;
R2_tPCR = 1 - sum(res_tPCR.^2)/sum((y_test - mean(y_test)).^2);
resP_PCR = y_test - yest_tPCR;
R2P_tPCR = 1 - sum((resP_PCR).^2)/sum((y_test - mean(y_test)).^2);
% Clculo dos erros
RMSEC_PCR = (sum((yest_PCR - y).^2)/n)^.5;
RMSEP_PCR = (sum((yest_tPCR - y_test).^2)/n)^.5;
%% PARTIAL LEAST SQUARE (PLS)
clear; clc; close all
l = importdata('PAH_treino_9.xls');
x = l.data(:,1:end-1);
y = l.data(:,end);
[n,m] = size(x);
% AUTOSCALING
x_bar = mean(x);
y_bar = mean(y);
stdx = std(x);
stdy = std(y);
X = (x-ones(n,1)*x_bar)./(ones(n,1)*stdx);
Y = (y-ones(n,1)*y_bar)./(ones(n,1)*stdy);
% Y1 = (y(:,1) - y_bar)./std(y);
% Seleccao do numero de componentes usando validacao cruzada
Amax = 8;
[T,P,Braw,B,W,Q,U,E,F,R2X,R2Y] = sp_pls(X,Y,Amax);
yestt_PLS = X*Braw(:,Amax);
% Re-scaling
yest_PLS = yestt_PLS.*(ones(n,1)*stdy) + ones(n,1)*y_bar;
19
% Claculo do coeficiente de determinacao (R^2)
res_PLS = y - yest_PLS;
R2_PLS = 1 - sum(res_PLS.^2)/sum((y - mean(y)).^2);
%% PAH Teste Data import
l1 = importdata('PAH_teste_9.xls');
x_test = l1.data(:,1:end-1);
y_test = l1.data(:,end);
% AUTOSCALING
X_test = (x_test - ones(n,1)*x_bar)./(ones(n,1)*stdx);
Y_test = (y_test - ones(n,1)*y_bar)./(ones(n,1)*stdy);
yestt_test_PLS = X_test*Braw(:,Amax);
% Re-scaling
yest_test_PLS = yestt_test_PLS.*(ones(n,1)*stdy) + ones(n,1)*y_bar;
% Calculo do R^2_prev
res_tPLS = y_test - yest_test_PLS;
R2_tPLS = 1 - sum(res_tPLS.^2)/sum((y_test - mean(y_test)).^2);
% Clculo dos erros
RMSEC_PLS = (sum((yest_PLS - y).^2)/n)^.5;
RMSEP_PLS = (sum((yest_test_PLS - y_test).^2)/n)^.5;