%
% Program ElGQT obsahuje tyto procedury testovani homoskedasticity :
% GOLDFELDuv-QUANDTuv test
% GLEJSERuv test
% BREUSCH-PAGANuv test
% KOENKER-BASSETuv test
 
% KORELAČNÍ MATICE VYSVĚTLUJÍCÍCH PROMĚNNÝCH (BEZ VEKTORU 1)
%  
   for I = 1:nvar-1
    XCOR(:,I)=XPOZ(:,I+1);   
   end
  
   CORX=corrcoef(XCOR);  
   for I = 1:nvar-1
   for J = 1:nvar-1  
    CORR(I+1,J+1)=CORX(I,J);
   end   
   end   
   CORR(1,:)=0;
   CORR(:,1)=0;
   CORR(1,1)=1;
   disp( '     ')
   disp(' MATICE PÁROVÝCH KORELACÍ VYSVĚTLUJÍCÍCH PROMĚNNÝCH  ') 
   disp(' ***************************************************  ')
   disp([CORR])
   disp( '     ')
   pause
  
% ******** TEST GOLDFELDuv A QUANDTuv *********   

% Volba určující vysvětlující proměnné dle největší t-statistiky
  for I = 1:nobs,
  for J = 1:nvar,
   XVAL(I,J+1)=XPOZ(I,J);
  end 
   XVAL(I,1)=YPOZ(I);
  end
% Seřazení vysvětlujících proměnných podle hodnot určující proměnné
  XYSO=sortrows(XVAL,[3]);
  
% Určení počtu vynechaných pozorování a rozdělení vzorku :
  CVYN=round(nobs/6);
  NO=round((nobs-CVYN)/2);
  CVYN=nobs-2*NO;
%  
  for I = 1:NO,
  YDE1T(I)=XYSO(I,1); 
  YDE2T(I)=XYSO(NO+CVYN+I,1)';
  for J = 1:nvar,
  XDE1(I,J)=XYSO(I,J+1);
  XDE2(I,J)=XYSO(NO+CVYN+I,J+1);
  end 
  end

  YDE1=YDE1T';
  YDE2=YDE2T';
  
% Regrese rezidua na určující proměnnou METODOU OLS v dolním vzorku
  XMAT=XDE1'*XDE1;
  YVE1=XDE1'*YDE1;
  INVX=inv(XMAT);
  BPA1=INVX*YVE1;
  YVY1=XDE1*BPA1;
  URE1=YDE1-YVY1;
  SQR1=URE1'*URE1;
  
% Regrese rezidua na určující proměnnou METODOU OLS v horním vzorku
  XMAT=XDE2'*XDE2;
  YVE2=XDE2'*YDE2;
  INVX=inv(XMAT);
  BPA2=INVX*YVE2;
  YVY2=XDE2*BPA2;
  URE2=YDE2-YVY2;  
  SQR2=URE2'*URE2;
  
% PODÍLOVÁ F-STATISTIKA A POROVNÁNÍ S KRITICKOU HODNOTOU F-ROZDĚLENÍ
  DF1=(nobs-CVYN)/2-nvar;
  DF2=DF1;
  RASQ=SQR2/SQR1;
  RAST=finv(0.95,DF1,DF2);
  disp('   GOLDFELD-QUANDTova statistika')
  disp([ RASQ ])
  disp('   Tabulková hodnota F-rozdělení')
  disp([ RAST ])
  pause

  if RAST <= RASQ
  disp('   HOMOSKEDASTICITA ZAMITNUTA NA HLADINE VYZNAMNOSTI ALFA = 0,05')
  else
  disp('   HOMOSKEDASTICITA PRIJIMANA NA HLADINE VYZNAMNOSTI ALFA = 0,05')
  end 
  pause

% ******** TEST GLEJSERuv *********   
  disp(' ' )
  disp('   VYBER VYSVETLUJICI PROMENNE DOMNELE VAZANE S ABS. REZIDUY  ' )
  XX=2;
  pause
% vektor absolutních hodnot reziduí 
  AREZ=abs(UREZ);
    for I = 1:nobs,
    XTRE(I,1)=1;
    end
% 
% SPECIFIKACE TVARU ZAVISLOSTI
%
% LINEARNI SCHEMA
    disp(' ')
    disp('    Výsledky Glejserova testu při uvažování LINEÁRNÍ ZÁVISLOSTI :')
    disp('    ************************************************************ ')
    for I = 1:nobs,
    XTRE(I,2)=XPOZ(I,XX);
    end
    disp(' ')
    outputOLSG
    
% LOGARITMICKE SCHEMA
    disp(' ')
    disp('    Výsledky Glejserova testu při uvažování LOGARITMICKÉ ZÁVISLOSTI :')
    disp('    **************************************************************** ')
        for I = 1:nobs,
    XTRE(I,2)=log(XPOZ(I,XX));
    end   
    disp(' ')
    outputOLSG
    
% ODMOCNINNE SCHEMA
    disp(' ')
    disp('    Výsledky Glejserova testu při uvažování ODMOCNINNÉ ZÁVISLOSTI :')
    disp('    **************************************************************** ')
    for I = 1:nobs,
    XTRE(I,2)=sqrt(XPOZ(I,XX));
    end
    disp(' ')
    outputOLSG
  pause
%
% ******** SPEARMANuv Koeficient poradove korelace *********   
%
% VYVORENI VEKTORU DIFERENCI DIFR
   [XQ,IND1]=sort(XVAL(:,XX));
   [SQ,IND2]=sort(AREZ);
   DIFR=abs(IND1-IND2);  
   SDIF=DIFR'*DIFR;
   SPR=1-6*SDIF/((nobs*nobs*(nobs-1)));
%   disp('  SPEARMANuv koeficient pořadové korelace : ')
%   disp('  ***************************************** ')
%   disp([ SPR ]);
   fprintf('  SPEARMANuv koeficient pořadové korelace : %6.3f \n', SPR)
   disp('  **************************************************** ')

  DF=nobs-nvar;
  CHI2 = chi2inv(0.95,DF);
  disp(' ')
  disp('  Kritická hodnota chi2-rozdelení pro alfa = 0,95 : ')
  disp('  ************************************************* ')
  disp([  CHI2]);
  pause
  
% ******** BREUSCH-PAGANuv TEST ****************************   

  XMAT=XPOZ'*XPOZ;
  INVX=inv(XMAT);
  ZMAT=XPOZ*INVX*XPOZ';
   for I = 1:nobs,
    URE2(I)=UREZ(I)*UREZ(I);
   end
  UREZ2=UREZ'*UREZ;
  GREZ=nobs*URE2/UREZ2;
  LM1=0.5*GREZ'*ZMAT*GREZ;
%  WEGHT=sqrt(URE2);

%  disp('  BREUSCH-PAGANova statistika : ') 
%  disp('  ***************************** ')
%  disp([  LM1]);
  fprintf('  BREUSCH-PAGANova statistika : %6.3f \n', LM1)
  disp('  **********************************************')

  if CHI2 <= LM1
  disp('   HOMOSKEDASTICITA ZAMITNUTA NA HLADINE VYZNAMNOSTI ALFA = 0,05')
  else
  disp('   HOMOSKEDASTICITA PRIJIMANA NA HLADINE VYZNAMNOSTI ALFA = 0,05')
  end 
  pause
  
% ******** KOENKER-BASSETuv TEST****************************   

  EVEK=URE2-UREZ'*UREZ/nobs;
  VEST=EVEK'*EVEK/nobs;
   for I = 1:nobs,
    UREX(I)=URE2(I)/nobs;
   end
  UVEK=URE2-UREX';
  LM2=UVEK'*ZMAT*UVEK/VEST;
  disp(' ')
%  disp('  KOENKER-BASSETTova statistika : ') 
%  disp('  ******************************* ')
   fprintf('  KOENKER-BASSETTova statistika : %6.3f \n', LM2)
   disp('  ************************************************ ')

  disp([  LM2]);
  if CHI2 <= LM2
  disp('   HOMOSKEDASTICITA ZAMITNUTA NA HLADINE VYZNAMNOSTI ALFA = 0,05')
  else
  disp('   HOMOSKEDASTICITA PRIJIMANA NA HLADINE VYZNAMNOSTI ALFA = 0,05')
  end 
  pause

return  
