capture program drop gmm_style_Ltrunc
program define gmm_style_Ltrunc
version 9.0

syntax varlist [if] [in] [, nt(varlist numeric max=2) GMMLiv(numlist integer >=0) *]

*capture drop _GMML_*
local nindeces : list sizeof nt
*di as result "Number of indeces for observations in your data-set: `nindeces'"
*di as result "General description of the dataset"
if `nindeces'==0 {
di as error "You cannot create GMM-style IVs with cross-section data. Use nt() option to set time series or panel data."
exit 198
}
if `nindeces'==1 {
di as text "You are creating GMM-style IVs in levels for a time series"
tokenize `nt'
local time="`1'"
qui tsset `1'
*return list
local nperiods=r(tmax)-r(tmin)+1
local time_min=r(tmin)
local time_max=r(tmax)
*di as text "time variable: `time'"
*di as text "first year: `time_min'"
*di as text "last year: `time_max'"
}
if `nindeces'==2 {
di as text "You are creating GMM-style IVs in levels for a panel"
tokenize `nt'
local time="`2'"
qui tsset `1' `2'
*return list
local nperiods=r(tmax)-r(tmin)+1
local time_min=r(tmin)
local time_max=r(tmax)
*di as text "time variable: `time'"
*di as text "first year: `time_min'"
*di as text "last year: `time_max'"
}
tokenize `varlist'
local i 1
while "``i''"!="" {

di in blue "_____ variable: ``i'' _____"

if "`gmmliv'" != "" {
local nlag : list sizeof gmmliv
*di as result "Elements in GMML(): `nlag'"

if `nlag'==1 {
*local optname gmmliv()
local primo_lag =`gmmliv'
di as result "Lag selection in GMML(): from t-`primo_lag' to the last available lag"
if `primo_lag'==0 {
*di as text "Are you sure that the first IV is t (exogenous variables)?"
}
if `primo_lag'==1 {
*di as text "Are you sure that the first IV is t-1 (predetermined variables)?"
}
if `primo_lag'==2 {
*di as text "Are you sure that the first IV is t-2 (endogenous variables)?"
}
forvalues tau=`=`time_min'+`primo_lag'' / `time_max' {
    forvalues lag = `primo_lag' / `=`tau'-`time_min'' {
        qui g _GMML_``i''_`tau'L`lag' = L`lag'.``i'' if `time' == `tau'
qui summ _GMML_``i''_`tau'L`lag'
if r(N)==0  {
drop _GMML_``i''_`tau'L`lag'
}
else if r(N)!=0 {
qui recode _GMML_``i''_`tau'L`lag' (.=0)
}
    } /* IV generation */
	} /* for each year */
	} /* one lag */

if `nlag'==2 {
*local optname gmmliv()
tokenize `gmmliv'
local primo_lag `1'
local ultimo_lag `2'
di as result "Lag selection in GMML(): from t-`primo_lag' to t-`ultimo_lag'"
if `primo_lag'==0 {
*di as text "Are you sure that the first IV is t (exogenous variables)?"
}
if `primo_lag'==1 {
*di as text "Are you sure that the first IV is t-1 (predetermined variables)?"
}
if `primo_lag'==2 {
*di as text "Are you sure that the first IV is t-2 (endogenous variables)?"
}
if `primo_lag'>`ultimo_lag' {
di as error "This procedure uses lags as IV, not forewards (use GMM_style_Ftrunc procedure)"
exit 198
}
tokenize `varlist'
forvalues tau=`=`time_min'+`primo_lag'' / `time_max' {
	*di "`tau' `time_min' `primo_lag' `time_max'"
	forvalues lag = `primo_lag' / `ultimo_lag' {
	*di "`primo_lag' `ultimo_lag' `time'"
		qui g _GMML_``i''_`tau'L`lag' = L`lag'.``i'' if `time' == `tau'
qui summ _GMML_``i''_`tau'L`lag'
if r(N)==0  {
drop _GMML_``i''_`tau'L`lag'
}
else if r(N)!=0 {
qui recode _GMML_``i''_`tau'L`lag' (.=0)
}
	} /* IV generation */
	} /* for each year  */
} /* two lags */
}  /* gmmliv != missing */

if "`gmmliv'" == "" {
di as error "You must select lag(s) for GMM-style IVs in levels; use the gmml() option"
exit 198
}

local i=`i'+1
} /* close varlist */

end
**********************************************
* `1' individuals
* `2' years
* `3' variables
* gmml() lags selection
* COMMAND: gmm_style_Ltrunc list_of_variables, nt(id year) gmml()
* 1 index --> from t-index to the last available lag
* 2 index --> from t-index1 to t-index2
*(example from abdata and panel_dynamic_application)
* it creates the matrix of GMM-style IVs so that also ivreg2 or other similar commands could operate like xtabond2 gmm
* IVs in levels, for eq(diff) *
*******************************
*******************************

capture program drop gmm_style_Dtrunc
program define gmm_style_Dtrunc

version 9.0

syntax varlist [if] [in] [, nt(varlist numeric max=2) GMMDiv(numlist >=0) *]

*capture drop _GMMD_*
local nindeces : list sizeof nt
di as result "Number of indeces for observations in your data-set: `nindeces'"
if `nindeces'==0 {
di as error "You cannot create GMM-style IVs with cross-section data. Use nt() option to set time series or panel data."
exit 198
}
if `nindeces'==1 {
di as text "You are creating GMM-style IVs in first-differences for a time series"
tokenize `nt'
local time="`1'"
qui tsset `1'
*return list
local nperiods=r(tmax)-r(tmin)+1
local time_min=r(tmin)
local time_max=r(tmax)
di as text "time variable: `time'"
di as text "first year: `time_min'"
di as text "last year: `time_max'"
}
if `nindeces'==2 {
di as text "You are creating GMM-style IVs in first-differences for a panel"
tokenize `nt'
local time="`2'"
qui tsset `1' `2'
*return list
local nperiods=r(tmax)-r(tmin)+1
local time_min=r(tmin)
local time_max=r(tmax)
di as text "time variable: `time'"
di as text "first year: `time_min'"
di as text "last year: `time_max'"
}

tokenize `varlist'
local i 1
while "``i''"!="" {

di in blue "_____ variable: ``i'' _____ "

if "`gmmdiv'" != "" {
local nlag : list sizeof gmmdiv
*di as result "Elements in GMMD(): `nlag'"

if `nlag'==1 {
*local optname gmmdiv()
local primo_lag =`gmmdiv'
di as result "Lag selection in GMMD(): from t-`primo_lag' to the last available lag"
if `primo_lag'==0 {
*di as text "Are you sure that the first IV is t (exogenous variables)?"
}
if `primo_lag'==1 {
*di as text "Are you sure that the first IV is t-1 (predetermined variables)?"
}
if `primo_lag'==2 {
*di as text "Are you sure that the first IV is t-2 (endogenous variables)?"
}
forvalues tau=`=`time_min'+`primo_lag'' / `time_max' {
    forvalues lag = `primo_lag' / `=`tau'-`time_min'' {
        qui g _GMMD_``i''_`tau'L`lag' = D.L`lag'.``i'' if `time' == `tau'
        qui summ _GMMD_``i''_`tau'L`lag'
if r(N)==0  {
drop _GMMD_``i''_`tau'L`lag'
}
else if r(N)!=0 {
qui recode _GMMD_``i''_`tau'L`lag' (.=0)
}
	} /* IV generation */
	} /* for each year */
	} /* one lag */

if `nlag'==2 {
*local optname gmmdiv()
tokenize `gmmdiv'
local primo_lag `1'
local ultimo_lag `2'
di as result "Lag selection in GMMD(): from t-`primo_lag' to t-`ultimo_lag'"
if `primo_lag'==0 {
*di as text "Are you sure that the first IV is t (exogenous variables)?"
}
if `primo_lag'==1 {
*di as text "Are you sure that the first IV is t-1 (predetermined variables)?"
}
if `primo_lag'==2 {
*di as text "Are you sure that the first IV is t-2 (endogenous variables)?"
}
if `primo_lag'>`ultimo_lag' {
di as error "This procedure uses lags as IV, not forewards (use GMM_style_Ftrunc procedure)"
exit 198
}
tokenize `varlist'
forvalues tau=`=`time_min'+`primo_lag'' / `time_max' {
	*di "`tau' `time_min' `primo_lag' `time_max'"
	forvalues lag = `primo_lag' / `ultimo_lag' {
	*di "`primo_lag' `ultimo_lag' `time'"
		qui g _GMMD_``i''_`tau'L`lag' = D.L`lag'.``i'' if `time' == `tau'
        qui summ _GMMD_``i''_`tau'L`lag'
if r(N)==0  {
drop _GMMD_``i''_`tau'L`lag'
}
else if r(N)!=0 {
qui recode _GMMD_``i''_`tau'L`lag' (.=0)
}
	} /* IV generation */
	} /* for each year  */
} /* two lags */
}  /* gmmdiv != missing */

if "`gmmdiv'" == "" {
di as error "You must select lag(s) for GMM-style IVs in first-differences; use the gmmd() option"
exit 198
}

local i=`i'+1
} /* close varlist */

end
**********************************************
* `1' individuals
* `2' years
* `3' variables
* gmmd() lags selection
* COMMAND: gmm_style_Dtrunc id year list_of_variables, gmmd()
* 1 index --> from t-index to the last available lag
* 2 index --> from t-index1 to t-index2
*(example from abdata and panel_dynamic_application)
* it creates the matrix of GMM-style IVs so that also ivreg2 or other similar commands could operate like xtabond2 gmm
* IVs in first-differences, for eq(level) *
*******************************
*****************************    MAIN PROGRAM *****************************************************************
*****************************************************************************************************************
*********************************************************************************************************************
capture program drop pca2
program define pca2, rclass

version 9.0

syntax varlist [if] [in] [, nt(varlist numeric max=2) VARiance(numlist integer >0 <=100) AVG COVariance PREfix(string) SEE /*
*/                          TOGVar TOGLD GMMLiv(numlist integer >=0 missingokay)  GMMDiv(numlist integer >=0 missingokay)  RETain *]

set more off
/*
local m 1
	local l = length(`"`nt'"')
 	while `m' <= `l' {
		local char`m' = substr(`"`nt'"', `m', 3)
		if substr(`"`nt'"', `m', 3) == " " {
			local char`m' " "
		}
		local m = `m' + 1*
	}
di `char1'
di `char2'
*/

local nvars : list sizeof varlist
local varlistpca `varlist'
tokenize `varlist'
local firstvar `1'
local lastvar ``nvars''
*di "`firstvar' `lastvar' `nvars'" "
/*
tempname   s_trace s_ExplainedVarVar s_RetainedEigenCountVar s_trace_PV_perc s_ExplainedVarVar_var  /*
*/         l_SecondIndex           /*
*/         s_RetainedEigenCountAvg s_ExplainedVarAvg s_ExplainedVarAvg_var s_RetainedPC       /*
*/		   primo_lag1D ultimo_lag1D
*/
tempname   s_trace l_SecondIndex primo_lag1D ultimo_lag1D


**** TYPE OF DATA *******
local nindeces : list sizeof nt
*di as result "Number of indeces for observations of your data-set: `nindeces'"
di as result "General description of the dataset"
if `nindeces'==0 {
di as text "Is your data-set a cross-section?"
}
if `nindeces'==1 {
di as text "Is your data-set a time-series?"
tokenize `nt'
local time_var ="`1'"
*di as result "time var: `time_var'"
tsset `time_var'
local nperiods=r(tmax)-r(tmin)+1
local time_min=r(tmin)
local time_max=r(tmax)
}
if `nindeces'==2 {
*di as text "Is your data-set a panel?"
tokenize `nt'
local ind_var = "`1'"
local time_var = "`2'"
*di as result "panel var: `ind_var'" "		" "time var: `time_var'"
tsset `ind_var' `time_var'
*return list
local nperiods=r(tmax)-r(tmin)+1
local time_min=r(tmin)
local time_max=r(tmax)
}

**** NAME FOR SCORES *******
* by default, if the name of the prefix is not esplicitly indicated by option pre(),
* the _BM_ prefix is used
if `"`prefix'"' == "" {
		local prefix1 = "_BM_"
    	di as result "The prefix is: `prefix1'"
* Change the default prefix if variables called by the same name already exist:
capture descr `prefix1'*
*di _rc
*di "`prefix1'"
if _rc==0&r(N)!=. {
           di as error "Variables starting with the default `prefix1' already exist in your data-set: please use the pre() option"
           *capture drop `prefix'*
		   exit 198
		   }
		}   /* end prefix */
* Verify the validity of the selected prefix:
if `"`prefix'"' != "" {
		local prefix1 = "_`prefix'_"
		di as result "The prefix is: `prefix1'"
* Change the selected prefix if variables called by the same name already exist:
capture descr `prefix1'*
di _rc
*di "`prefix1'"
if _rc==0&r(N)!=. {
           di as error "Variables starting with the selected `prefix1' already exist in your data-set: please use the pre() option to select another name"
           exit 198
		   }
		}   /* end prefix */

marksample touse, novarlist

*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
********** GMM LEV DIFFERENT LAGS VAR BY VAR & TOGVAR ***************************
*********************************************************************************
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
local lagslgroups 0
*di "START LOOP LAGSL: lagslgroups: `lagslgroups'"
local 0, `options'
local _optlagsl `options'
*local 0, `_optlagsl'
*di " opzioni: `0'"
*di "START LOOP LAGSL: _optlagsl: `_optlagsl'"

syntax [, LAGSL(string) *]
while "`lagsl'" != "" {

	   if "`gmmliv'"!=""  {
	   di as error "Either use gmml or lagsl"
	   exit 198
	   }

		local optionsarg `options'
		*di "optionsarg: `optionsarg'"
		local 0 `lagsl'
		*di "lagsl : `lagsl'"
		local _optlagsl `lagsl'
		*di "_optlagsl: `_optlagsl'"
        capture syntax varlist, [Ll(string)]
		/*
		if _rc {
			di as err _n "lags(`0') invalid."
			exit 198
		}
		*/
		local nbasevarsl : list sizeof varlist
		local basevarsl `varlist'
		*di "varlist originally in lagsl:`varlist'"
		*di "varlist derived from lagsl:`basevarsl'"
		*di "varlist in pca2 syntax   :`varlistpca'"
		*di "nbasevarsl: `nbasevarsl'"

			foreach lag of numlist `lagslgroups' {
				if "`ll'" == "" {
				di as err _n `"ll(`ll') must have at least one argument."'
				exit 198
			    }
			if `:word count `ll'' == 1 {
				di "ONE LAG in ll()"
			    local lagliml1`lag' = `: word 1 of `ll'' + 0
				*di "lag in ll(): `lagliml1`lag''"
				if `lagliml1`lag'' == . {
			    di as error "Lags can not be missing"
			    exit 198
			    }
			    local lagslgroups = `lagslgroups' + 1
		        local lagslvars "`lagslvars' `basevarsl'"
		        *di "lagslgroups: `lagslgroups'"
		        *di "lagslvars: `lagslvars'"
		        local nlagslvars : list sizeof lagslvars
		        *di "nlagslvars: `nlagslvars'"

				gmm_style_Ltrunc `basevarsl', nt(`ind_var' `time_var') gmml(`lagliml1`lag'')

			    }  /* ONE LAG */
			else {
				if `:word count `ll'' == 2 {
				di "TWO LAGS in rit()"
				forvalues a = 1/2 {
				    *di "how many lags?`a'"
					capture local lagliml`a'`lag' = `: word `a' of `ll'' + 0
					if _rc {
						di as err _n `"ll(`ll') invalid."'
						exit 198
					    }
				} /* chiude il loop*/
				} /* word count */
			    if `lagliml1`lag'' == . {
			    di as error "Lags can not be missing"
			    exit 198
			    }
			    if `lagliml2`lag'' == . {
			    di as error "Lags can not be missing"
			    exit 198
			    }
			    *di "First lag in rit(): `lagliml1`lag''"
			    *di "Second lag in rit(): `lagliml2`lag''"
			local lagslgroups = `lagslgroups' + 1
		    local lagslvars "`lagslvars' `basevarsl'"
		    *di "lagslgroups: `lagslgroups'"
		    *di "lagslvars: `lagslvars'"
		    local nlagslvars : list sizeof lagslvars
		    *di "nlagslvars: `nlagslvars'"

		    gmm_style_Ltrunc `basevarsl', nt(`ind_var' `time_var') gmml(`lagliml1`lag'' `lagliml2`lag'')
		    } /* TWO LAGS */
			} /* for each lagslgroup */


		local 0, `optionsarg'
		syntax [, LAGSL(string) *]
} /* chiude while lags */

local lagslgroups 0
local _optlagsl 0


if "`nlagslvars'"!=""&"`gmmdiv'"=="" {
if `nlagslvars'<`nvars' {
		di as error "The number of variables in pca2 command is different from the number of variables in the options"
		exit 198
		}
		}

*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
********** GMM DIF DIFFERENT LAGS VAR BY VAR & TOGVAR ***************************
*********************************************************************************
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
local lagsdgroups 0
*di "START LOOP LAGSD: lagsdgroups: `lagsdgroups'"
local 0, `options'
local _optlagsd `options'
*di "START LOOP LAGSD: _optlagsd: `_optlagsd'"

syntax [, LAGSD(string) *]
	while "`lagsd'" != "" {

	   if "`gmmdiv'"!=""  {
	   di as error "Either use gmmd or lagsd"
	   exit 198
	   }

		local optionsarg `options'
		*di "optionsarg: `optionsarg'"
		local 0 `lagsd'
		*di "lagsd : `lagsd'"
		local _optlagsd `lagsd'
		*di "_optlagsd: `_optlagsd'"
		capture syntax varlist, [Ll(string)]

		local nbasevarsd : list sizeof varlist
		local basevarsd `varlist'
		*di "varlist originally in lagsd: `varlist'"
		*di "varlist derived from lagsd: `basevarsd'"
		*di "varlist in pca2 syntax   :`varlistpca'"
		*di "nbasevarsd: `nbasevarsd'"

		  foreach lag of numlist `lagsdgroups' {
			if "`ll'" == "" {
				di as err _n `"ll(`ll') must have at least one argument."'
				exit 198
			}
			if `:word count `ll'' == 1 {
			    di "ONE LAG in rit()"
				local laglimd1`lag' = `: word 1 of `ll'' + 0
				*di "lag in rit(): `laglimd1`lag''"
				if `laglimd1`lag'' == . {
				di as error "Lags can not be missing"
				exit 198
				}
				local lagsdgroups = `lagsdgroups' + 1
		        local lagsdvars "`lagsdvars' `basevarsd'"
		        di "lagsdgroups: `lagsdgroups'"
				di "lagsdvars: `lagsdvars'"
		        local nlagsdvars : list sizeof lagsdvars
		        *di "nlagsdvars: `nlagsdvars'"

				gmm_style_Dtrunc `basevarsd', nt(`ind_var' `time_var') gmmd(`laglimd1`lag'')
			    } /* ONE LAG */
			else {
				if `:word count `ll'' == 2 {
				di "TWO LAGS in rit()"
				forvalues a = 1/2 {
				    *di "how many lags?`a'"
					capture local laglimd`a'`lag' = `: word `a' of `ll'' + 0
					if _rc {
						di as err _n `"ll(`ll') invalid."'
						exit 198
					}
				} /* chiude il loop*/
				} /* word count */
			    if `laglimd1'`lag' == . {
			    di as error "Lags can not be missing"
			    exit 198
			    }
			    if `laglimd2'`lag' == . {
			    di as error "Lags can not be missing"
			    exit 198
			    }
			    *di "First lag in rit(): `laglimd1`lag''"
			    *di "Second lag in rit(): `laglimd2`lag''"
			local lagsdgroups = `lagsdgroups' + 1
		    local lagsdvars "`lagsdvars' `basevarsd'"
		    di "lagsdgroups: `lagsdgroups'"
			di "lagsdvars: `lagsdvars'"
		    local nlagsdvars : list sizeof lagsdvars
		    *di "nlagsdvars: `nlagsdvars'"

		    gmm_style_Dtrunc `basevarsd', nt(`ind_var' `time_var') gmmd(`laglimd1`lag'' `laglimd2`lag'')
		    } /* TWO LAGS */
			} /* for each lagsdgroups */


        local 0, `optionsarg'
		syntax [, LAGSD(string) *]
 } /* close while lags */

 if "`nlagsdvars'"!=""&"`gmmliv'"=="" {
 if `nlagsdvars'<`nvars' {
		di as error "The number of variables in pca2 command is different from the number of variables in the options"
		exit 198
		}
		}









*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

	*** START PCA ***
************** PCA VAR BY VAR LEV ******************
 if "`togvar'"=="" & "`nlagslvars'"!="" {
 foreach var of varlist `lagslvars' {
 di "_____ PCA LEV VAR BY VAR: `var'"
 local newvarlistl_`var' _GMML_`var'_*
 local newvarlistldl_`var' _GMML_`var'_*
 local newvarlistldllags_`var' _GMML_`var'_*

 if "`togld'"=="" {
 di as text "You are applying PCA to GMM-style LEV lags of more than one variable,"
 di as text "keeping the variables separated with different lags structure"

	 if "`covariance'"=="" {
	  if "`see'"=="" {
	  qui pca `newvarlistl_`var'' if `touse'
	  }
	  if "`see'"!="" {
	  pca `newvarlistl_`var'' if `touse'
	  }
	 }
	if "`covariance'"!="" {
	  if "`see'"=="" {
	  qui pca `newvarlistl_`var'' if `touse', covariance
	  }
	  if "`see'"!="" {
	  pca `newvarlistl_`var'' if `touse', covariance
	  }
	 }
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels for `var' __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLEV`var'N1-`prefix1'varscoreLEV`var'N`l_SecondIndex', score
			 }
		else {
		    qui predict double `prefix1'varscoreLEV`var'N1, score
		    }

ret scalar var_byvar_LEV_`var'  = s_ExplainedVarVar_var
ret scalar nscores_byvar_LEV_`var'   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
                }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		        }
        }
		scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLEV`var'N1-`prefix1'avgscoreLEV`var'N`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLEV`var'N1, score
		     }

ret scalar var_byavg_LEV_`var'   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LEV_`var'   = s_RetainedEigenCountAvg
}   /*close option mean */

 } /* close togld==""  */

 } /* close for each var */

*if "`retain'"=="" {
*	capture drop _GMML_*_*
*	}

 } /* close if togvar=="" */

************ PCA VARTOG LEV *********************
 if 	"`togvar'"!="" &"`nlagslvars'"!="" {
 di "_____ PCA LEV VAR TOGETHER: `lagslvars'"
 local newvarlistl_tog _GMML_*_*
 local newvarlistldl_tog _GMML_*_*
 local newvarlistldllags_tog _GMML_*_*
  if "`togld'"=="" {
di as text "You are applying PCA to GMM-style LEV lags of more than one variable,"
di as text "keeping the variables together with different lags structure"

    if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistl_tog' if `touse'
	 }
	if "`see'"!="" {
	 pca `newvarlistl_tog' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistl_`var'' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistl_`var'' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels for the variables `varlistpca' together"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		 if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLEVtog1-`prefix1'varscoreLEVtog`l_SecondIndex', score
			}
         else {
		    qui predict double `prefix1'varscoreLEVtog1, score
		    }

ret scalar var_byvar_LEV_tog  = s_ExplainedVarVar_var
ret scalar nscores_byvar_LEV_tog  = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
                }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
	     	    }
        }
		scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLEVtog1-`prefix1'avgscoreLEVtog`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLEVtog1, score
		    }

ret scalar var_byavg_LEV_tog   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LEV_tog   = s_RetainedEigenCountAvg
}   /*close option mean */
}   /*close togld=="" */

*if "`retain'"=="" {
*    capture drop _GMML_*_*
*	}

} /*chiude if togvar!="" */



****************** PCA VAR BY VAR DIF *************************
   if "`togvar'"=="" & "`nlagsdvars'"!="" {
   foreach var of varlist `lagsdvars' {
   di "_____ PCA DIF VAR BY VAR: `var'"
   local newvarlistd_`var' _GMMD_`var'_*
   local newvarlistldd_`var' _GMMD_`var'_*
   local newvarlistlddlags_`var' _GMMD_`var'_*

   if "`togld'"=="" {
   di as text "You are applying PCA to GMM-style DIF lags of more than one variable,"
   di as text "keeping the variables separated with different lags structure"

	if "`covariance'"=="" {
	if "`see'"=="" {
	qui pca `newvarlistd_`var'' if `touse'
	}
	if "`see'"!="" {
	pca `newvarlistd_`var'' if `touse'
	}
   }
	if "`covariance'"!="" {
	if "`see'"=="" {
	qui pca `newvarlistd_`var'' if `touse', covariance
	}
	if "`see'"!="" {
	pca `newvarlistd_`var'' if `touse', covariance
	}
   }
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in first_differences for `var' __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreDIF`var'N1-`prefix1'varscoreDIF`var'N`l_SecondIndex', score
             }
		else {
     		qui predict double `prefix1'varscoreDIF`var'N1, score
	    	}

ret scalar var_byvar_DIF_`var' = s_ExplainedVarVar_var
ret scalar nscores_byvar_DIF_`var'   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
                }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
	     	    }
        }
		scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreDIF`var'N1-`prefix1'avgscoreDIF`var'N`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreDIF`var'N1, score
		     }

ret scalar var_byavg_DIF_`var'   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_DIF_`var'   = s_RetainedEigenCountAvg
}   /*close option mean */

 } /* close togld=="" */
 } /* close for each var */

* if "`retain'"==""  {
*	capture drop _GMMD_*_*
*	}

 } /* close if togvar=="" */

******************** PCA VARTOG DIF ****************************
if "`togvar'"!="" & "`nlagsdvars'"!=""{
di "_____ PCA DIF VAR TOGETHER: `lagsdvars'"
local newvarlistd_tog _GMMD_*_*
local newvarlistldd_tog _GMMD_*_*
local newvarlistlddlags_tog _GMMD_*_*

 if "`togld'"=="" {
 di as text "You are applying PCA to GMM-style DIF lags of more than one variable,"
 di as text "keeping the variables together with different lags structure"
	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistd_tog' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistd_tog' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistd_`var'' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistd_`var'' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in first-differences for the variables `varlistpca' together"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
    	scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreDIFtog1-`prefix1'varscoreDIFtog`l_SecondIndex', score
			 }
    	else {
		qui predict double `prefix1'varscoreDIFtog1, score
	    	}

ret scalar var_byvar_DIF_tog  = s_ExplainedVarVar_var
ret scalar nscores_byvar_DIF_tog   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
                 }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		        }
          }
		scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreDIFtog1-`prefix1'avgscoreDIFtog`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreDIFtog1, score
		    }

ret scalar var_byavg_DIF_tog  = s_ExplainedVarAvg_var
ret scalar nscores_byavg_DIF_tog   = s_RetainedEigenCountAvg
}   /*close option mean */
}   /*close togld=="" */

*if "`retain'"==""  {
*	capture drop _GMMD_*_*
*	}

} /* chiude il togvar!="" */


************ PCA VAR BY VAR LEV & DIF TOGETHER ********************
if "`togld'"!="" & "`nlagslvars'"!="" & "`nlagsdvars'"!="" {
if "`togvar'"=="" {
foreach var of varlist `varlistpca'  {
di "_____ PCA LEV&DIF VAR BY VAR: `var'"
local newvarlistld_`var' "`newvarlistldl_`var'' `newvarlistldd_`var''"
di "`newvarlistld_`var''"
di as text "You are applying PCA to GMM-style LEV & DIF lags of more than one variable,"
di as text "keeping the variables separated with different lags structure"
   if "`covariance'"=="" {
	if "`see'"=="" {
	qui pca `newvarlistld_`var'' if `touse'
	}
	if "`see'"!="" {
	pca `newvarlistld_`var'' if `touse'
	}
   }
   if "`covariance'"!="" {
	if "`see'"=="" {
	qui pca `newvarlistld_`var'' if `touse', covariance
	}
	if "`see'"!="" {
	pca `newvarlistld_`var'' if `touse', covariance
	}
   }
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels & first_differences together for `var' _________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLD`var'N1-`prefix1'varscoreLD`var'N`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreLD`var'N1, score
		     }

ret scalar var_byvar_LD_`var' = s_ExplainedVarVar_var
ret scalar nscores_byvar_LD_`var'  = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		         }
        }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLD`var'N1-`prefix1'avgscoreLD`var'N`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLD`var'N1, score
		     }

ret scalar var_byavg_LD_`var'  = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LD_`var'  = s_RetainedEigenCountAvg
}   /*close option mean */

	} /* close for each var */
   } /* close if  togvar=="" */

****************** PCA VARTOG LEV & DIF TOGETHER ****************
if "`togvar'"!="" {
di "_____ PCA LEV&DIF VAR TOGETHER: `varlistpca'"
local newvarlistld_tog "`newvarlistldl_tog' `newvarlistldd_tog'"
di "`newvarlistld_tog'"
di as text "You are applying PCA to GMM-style LEV & DIF lags of more than one variable,"
di as text "keeping the variables together with different lags structure"
   if "`covariance'"=="" {
	if "`see'"=="" {
	qui pca `newvarlistld_tog' if `touse'
	}
	if "`see'"!="" {
	pca `newvarlistld_tog' if `touse'
	}
   }
   if "`covariance'"!="" {
	if "`see'"=="" {
	qui pca `newvarlistld_tog' if `touse', covariance
	}
	if "`see'"!="" {
	pca `newvarlistld_tog' if `touse', covariance
	}
   }
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels & first_differences together for the variables `varlistpca' together _________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		*di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLDtog1-`prefix1'varscoreLDtog`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreLDtog1, score
		     }

ret scalar var_byvar_LD_tog = s_ExplainedVarVar_var
ret scalar nscores_byvar_LD_tog  = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		         }
        }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLDtog1-`prefix1'avgscoreLDtog`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLDtog1, score
		     }

ret scalar var_byavg_LD_tog  = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LD_tog  = s_RetainedEigenCountAvg
}   /*close option mean */

  } /* close togvar!="" */
 }  /* close togld!="" */

* POSSO TOGLIERLO?
* if "`retain'"==""  {
*	capture drop _GMM*_*_*
*	}



*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
********** GMM LEV SAME LAGS VAR BY VAR & TOGVAR ********************************
*********************************************************************************
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
if "`gmmliv'"!=""  {
    /*
    if `nvars'==1  {
	di as text "You are applying PCA to GMM-style lags of one variable."
	}
	*/
	*else if `nvars'>1 {  }

	if "`nlagslvars'"!=""  {
	di as error "Either use gmml or lagsl"
	exit 198
	}
	local nlag1 : list sizeof gmmliv
	*di as result "Elements in GMML(): `nlag1'"
	if `nlag1'==1 {
	local primo_lag1l =`gmmliv'
	gmm_style_Ltrunc `varlistpca', nt(`ind_var' `time_var') gmml(`primo_lag1l')
	}
	if `nlag1'==2 {
	tokenize `gmmliv'
	local primo_lag1l `1'
	local ultimo_lag1l `2'
	*tokenize `varlist'
	gmm_style_Ltrunc `varlistpca', nt(`ind_var' `time_var') gmml(`primo_lag1l' `ultimo_lag1l')
	}
} /* close gmmliv !"== */


*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
********** GMM DIF SAME LAGS VAR BY VAR & TOGVAR ********************************
*********************************************************************************
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
if "`gmmdiv'"!=""  {

    if "`nlagsdvars'"!=""  {
	di as error "Either use gmmd or lagsd"
	exit 198
	}
	local nlag1 : list sizeof gmmdiv
	*di as result "Elements in GMMD(): `nlag1'"
	if `nlag1'==1 {
	local primo_lag1d =`gmmdiv'
	gmm_style_Dtrunc `varlistpca', nt(`ind_var' `time_var') gmmd(`primo_lag1d')
	}
	if `nlag1'==2 {
	tokenize `gmmdiv'
	local primo_lag1d `1'
	local ultimo_lag1d `2'
	*tokenize `varlist'
	gmm_style_Dtrunc `varlistpca', nt(`ind_var' `time_var') gmmd(`primo_lag1d' `ultimo_lag1d')
	}
} /* close gmmdiv !"== */




************** PCA VAR BY VAR LEV SAME LAGS *******************
if "`togvar'"=="" & "`gmmliv'"!=""  {
	foreach var of varlist `varlistpca' {
	di "_____ PCA LEV VAR BY VAR: `var'"
 	local newvarlistl_`var' _GMML_`var'_*
	local newvarlistldl_`var' _GMML_`var'_*
	local newvarlistldlgmm_`var' _GMML_`var'_*

 if "`togld'"==""  {
	di as text "You are applying PCA to GMM-style LEV lags of one or more than one variable,"
	di as text "keeping the variables separated with the same lags structure"

	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistl_`var'' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistl_`var'' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistl_`var'' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistl_`var'' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels for `var' __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLEV`var'N1-`prefix1'varscoreLEV`var'N`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreLEV`var'N1, score
		     }

ret scalar var_byvar_LEV_`var'  = s_ExplainedVarVar_var
ret scalar nscores_byvar_LEV_`var'   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *

		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
                 }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		         }
        }
		scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLEV`var'N1-`prefix1'avgscoreLEV`var'N`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLEV`var'N1, score
		    }

ret scalar var_byavg_LEV_`var'   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LEV_`var'   = s_RetainedEigenCountAvg
}   /*close option mean */

}  /* close togld=="" */
}  /* close for each var =="" */

*if "`retain'"==""  {
*	capture drop _GMML_`var'_*
*	}

} /* close if togvar=="" */

************** PCA TOGVAR LEV SAME LAGS *******************
if "`togvar'"!="" & "`gmmliv'"!=""  {
di "_____ PCA LEV VAR TOGETHER: `varlistpca'"
local newvarlistl_tog _GMML_*_*
local newvarlistldl_tog _GMML_*_*
local newvarlistldlgmm_tog _GMML_*_*

 if "`togld'"==""  {
	di as text "You are applying PCA to GMM-style LEV lags of one or more than one variable,"
	di as text "keeping the variables together with the same lags structure"

	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistl_tog' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistl_tog' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistl_`var'' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistl_`var'' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels for the variables `varlistpca' together"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLEVtog1-`prefix1'varscoreLEVtog`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreLEVtog1, score
		     }

ret scalar var_byvar_LEV_tog  = s_ExplainedVarVar_var
ret scalar nscores_byvar_LEV_tog  = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *

		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		         }
            }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLEVtog1-`prefix1'avgscoreLEVtog`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLEVtog1, score
             }

ret scalar var_byavg_LEV_tog   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LEV_tog   = s_RetainedEigenCountAvg
}   /*close option mean */

}   /*close togld=="" */

*if "`retain'"==""  {
*	capture drop _GMML_*_*
*	}

} /* close if togvar!="" */



************** PCA VAR BY VAR DIF SAME LAGS *******************
if "`togvar'"=="" & "`gmmdiv'"!=""  {
	foreach var of varlist `varlistpca' {
	di "_____ PCA DIF VAR BY VAR: `var'"
 	local newvarlistd_`var' _GMMD_`var'_*
	local newvarlistldd_`var' _GMMD_`var'_*
	local newvarlistlddgmm_`var' _GMMD_`var'_*

 if "`togld'"==""  {
	di as text "You are applying PCA to GMM-style DIF lags of one or more than one variable,"
	di as text "keeping the variables separated with the same lags structure"

	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistd_`var'' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistd_`var'' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistd_`var'' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistd_`var'' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in first-differences for `var' __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreDIF`var'N1-`prefix1'varscoreDIF`var'N`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreDIF`var'N1, score
		     }

ret scalar var_byvar_DIF_`var'  = s_ExplainedVarVar_var
ret scalar nscores_byvar_DIF_`var'   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *

		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
                 }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		         }
        }
		scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreDIF`var'N1-`prefix1'avgscoreDIF`var'N`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreDIF`var'N1, score
		    }

ret scalar var_byavg_DIF_`var'   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_DIF_`var'   = s_RetainedEigenCountAvg
}   /*close option mean */

}  /* close togld=="" */
}  /* close for each var =="" */

*if "`retain'"==""  {
*	capture drop _GMMD_`var'_*
*	}

} /* close if togvar=="" */

************** PCA TOGVAR DIF SAME LAGS *******************
if "`togvar'"!="" & "`gmmdiv'"!=""  {
di "_____ PCA DIF VAR TOGETHER: `varlistpca'"
local newvarlistd_tog _GMMD_*_*
local newvarlistldd_tog _GMMD_*_*
local newvarlistlddgmm_tog _GMMD_*_*

 if "`togld'"==""  {
	di as text "You are applying PCA to GMM-style DIF lags of one or more than one variable,"
	di as text "keeping the variables together with the same lags structure"

	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistd_tog' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistd_tog' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistd_`var'' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistd_`var'' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in first-differences for the variables `varlistpca' together"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreDIFtog1-`prefix1'varscoreDIFtog`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreDIFtog1, score
		     }

ret scalar var_byvar_DIF_tog  = s_ExplainedVarVar_var
ret scalar nscores_byvar_DIF_tog  = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *

		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		         }
            }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreDIFtog1-`prefix1'avgscoreDIFtog`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreDIFtog1, score
             }

ret scalar var_byavg_DIF_tog   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_DIF_tog   = s_RetainedEigenCountAvg
}   /*close option mean */

}   /*close togld=="" */

*if "`retain'"==""  {
*	capture drop _GMMD_*_*
*	}

} /* close if togvar!="" */





************************** PCA LEV & DIF TOGETHER SAME LAGS VAR BY VAR & TOGVAR  *****************
if "`togld'"!="" & "`gmmliv'"!="" & "`gmmdiv'"!="" {
if "`togvar'"=="" {
foreach var of varlist `varlistpca' {
di "_____ PCA LEV&DIF VAR BY VAR: `var'"
local newvarlistld_`var' "`newvarlistldl_`var'' `newvarlistldd_`var''"
di "`newvarlistld_`var''"
di as text "You are applying PCA to GMM-style LEV & DIF lags of more than one variable,"
di as text "keeping the variables separated with the same lags structure"
	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_`var'' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_`var'' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_`var'' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_`var'' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels & first_differences together for `var' __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLD`var'N1-`prefix1'varscoreLD`var'N`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreLD`var'N1, score
		     }

ret scalar var_byvar_LD_`var'  = s_ExplainedVarVar_var
ret scalar nscores_byvar_LD_`var'   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		        }
            }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLD`var'N1-`prefix1'avgscoreLD`var'N`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLD`var'N1, score
     		}

ret scalar var_byavg_LD_`var'   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LD_`var'   = s_RetainedEigenCountAvg
}   /*close option mean */

}  /* close for each var */
}  /*close if togvar=="" */

******* PCA LEV & DIF SAME LAGS TOGVAR ***************************
if "`togvar'"!="" {
di "_____ PCA LEV&DIF VAR TOGETHER: `varlistpca'"
local newvarlistld_tog "`newvarlistldl_tog' `newvarlistldd_tog'"
di "`newvarlistld_tog'"
di as text "You are applying PCA to GMM-style LEV & DIF lags of more than one variable,"
di as text "keeping the variables together with the same lags structure"
	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_tog' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_tog' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_tog' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_tog' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels & first_differences together for the variables `varlistpca' together __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLDtog1-`prefix1'varscoreLDtog`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreLDtog1, score
		     }

ret scalar var_byvar_LD_tog  = s_ExplainedVarVar_var
ret scalar nscores_byvar_LD_tog   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		        }
            }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLDtog1-`prefix1'avgscoreLDtog`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLDtog1, score
     		}

ret scalar var_byavg_LD_tog   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LD_tog   = s_RetainedEigenCountAvg
}   /*close option mean */

}  /*close if togvar!="" */
}  /*close if togld!="" */

* POSSO TOGLIERLO?
*if "`retain'"==""  {
*  capture drop _GMM*_*_*
*   }



************************** PCA LEV & DIF TOGETHER DIFFERENT LAGS VAR BY VAR & TOGVAR  *****************
if "`togld'"!="" & "`gmmliv'"!="" & "`nlagsdvars'"!="" {
if "`togvar'"=="" {
foreach var of varlist `varlistpca' {
di "_____ PCA LEV&DIF VAR BY VAR: `var'"
local newvarlistld_`var' "`newvarlistldlgmm_`var'' `newvarlistlddlags_`var''"
di "`newvarlistld_`var''"
di as text "You are applying PCA to GMM-style LEV & DIF lags of more than one variable,"
di as text "keeping the variables separated"
	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_`var'' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_`var'' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_`var'' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_`var'' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels & first_differences together for `var' __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLD`var'N1-`prefix1'varscoreLD`var'N`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreLD`var'N1, score
		     }

ret scalar var_byvar_LD_`var'  = s_ExplainedVarVar_var
ret scalar nscores_byvar_LD_`var'   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		        }
            }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLD`var'N1-`prefix1'avgscoreLD`var'N`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLD`var'N1, score
     		}

ret scalar var_byavg_LD_`var'   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LD_`var'   = s_RetainedEigenCountAvg
}   /*close option mean */

}  /* close for each var */
}  /*close if togvar=="" */

******* PCA LEV & DIF SAME LAGS TOGVAR ***************************
if "`togvar'"!="" {
di "_____ PCA LEV&DIF VAR TOGETHER: `varlistpca'"
local newvarlistld_tog "`newvarlistldlgmm_tog' `newvarlistlddlags_tog'"
di "`newvarlistld_tog'"
di as text "You are applying PCA to GMM-style LEV & DIF lags of more than one variable,"
di as text "keeping the variables together"
	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_tog' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_tog' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_tog' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_tog' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels & first_differences together for the variables `varlistpca' together __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLDtog1-`prefix1'varscoreLDtog`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreLDtog1, score
		     }

ret scalar var_byvar_LD_tog  = s_ExplainedVarVar_var
ret scalar nscores_byvar_LD_tog   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		        }
            }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLDtog1-`prefix1'avgscoreLDtog`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLDtog1, score
     		}

ret scalar var_byavg_LD_tog   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LD_tog   = s_RetainedEigenCountAvg
}   /*close option mean */

}  /*close if togvar!="" */
}  /*close if togld!="" */

* POSSO TOGLIERLO?
*if "`retain'"==""  {
*  capture drop _GMM*_*_*
*   }




 ************************** PCA LEV & DIF TOGETHER DIFFERENT LAGS VAR BY VAR & TOGVAR  *****************
if "`togld'"!="" & "`gmmdiv'"!="" & "`nlagslvars'"!="" {
if "`togvar'"=="" {
foreach var of varlist `varlistpca' {
di "_____ PCA LEV&DIF VAR BY VAR: `var'"
local newvarlistld_`var' "`newvarlistldllags_`var'' `newvarlistlddgmm_`var''"
di "`newvarlistld_`var''"
di as text "You are applying PCA to GMM-style LEV & DIF lags of more than one variable,"
di as text "keeping the variables separated"
	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_`var'' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_`var'' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_`var'' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_`var'' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels & first_differences together for `var' __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLD`var'N1-`prefix1'varscoreLD`var'N`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreLD`var'N1, score
		     }

ret scalar var_byvar_LD_`var'  = s_ExplainedVarVar_var
ret scalar nscores_byvar_LD_`var'   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		        }
            }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLD`var'N1-`prefix1'avgscoreLD`var'N`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLD`var'N1, score
     		}

ret scalar var_byavg_LD_`var'   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LD_`var'   = s_RetainedEigenCountAvg
}   /*close option mean */

}  /* close for each var */
}  /*close if togvar=="" */

******* PCA LEV & DIF SAME LAGS TOGVAR ***************************
if "`togvar'"!="" {
di "_____ PCA LEV&DIF VAR TOGETHER: `varlistpca'"
local newvarlistld_tog "`newvarlistldllags_tog' `newvarlistlddgmm_tog'"
di "`newvarlistld_tog'"
di as text "You are applying PCA to GMM-style LEV & DIF lags of more than one variable,"
di as text "keeping the variables together"
	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_tog' if `touse'
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_tog' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `newvarlistld_tog' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `newvarlistld_tog' if `touse', covariance
	 }
	}
	***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about PCA of IV in levels & first_differences together for the variables `varlistpca' together __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscoreLDtog1-`prefix1'varscoreLDtog`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscoreLDtog1, score
		     }

ret scalar var_byvar_LD_tog  = s_ExplainedVarVar_var
ret scalar nscores_byvar_LD_tog   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		        }
            }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscoreLDtog1-`prefix1'avgscoreLDtog`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscoreLDtog1, score
     		}

ret scalar var_byavg_LD_tog   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_LD_tog   = s_RetainedEigenCountAvg
}   /*close option mean */

}  /*close if togvar!="" */
}  /*close if togld!="" */

if "`retain'"==""  {
   capture drop _GMM*_*_*
   }



*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
*********** FINALLY ******************************************************
**** Classical IVs or different variables taken together *****************
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
if "`gmmdiv'"=="" & "`gmmliv'"==""  & "`nlagslvars'"==""  & "`nlagsdvars'"=="" {
    if `nvars'==1  {
	di as error "You have only one variable: you cannot apply PCA on it"
	di as error "Use gmm() and/or lags() options if you want GMM-style lags of a variable taken alone"
	exit 198
	}
	else if `nvars'>1 {
	di as text "You are applying PCA to different variables or to standard lags of the same variable(s),"
	di as text "taken together."
	if "`covariance'"=="" {
	 if "`see'"=="" {
	 qui pca `varlistpca' if `touse'
	 }
	 if "`see'"!="" {
	 pca `varlistpca' if `touse'
	 }
	}
	if "`covariance'"!="" {
	 if "`see'"=="" {
	 qui pca `varlistpca' if `touse', covariance
	 }
	 if "`see'"!="" {
	 pca `varlistpca' if `touse', covariance
	 }
	}
	} /* close nvars>1 */

		***** COMPUTATION OF SCORES AFTER PCA
di as text " _________ Some information about standard PCA for the variables `varlistpca' __________"
scalar `s_trace'=e(trace)
di as result "Trace of the matrix: " _col(80) `s_trace'

if "`variance'"!="" {
        local optname variance()
		local PV=`variance'
		di as result "Percentage of selected variability to be explained: "  _col(80) `PV' "%"
        }
if `"`PV'"' == "" {
		local PV = 90
		di as result "By default percentage of selected variability to be explained: "  _col(80) `PV'  "%"
        }
        * variability criterion *
		scalar s_ExplainedVarVar=0
		scalar s_RetainedEigenCountVar=0
		local s_trace_PV_perc = (`PV'/100)*`s_trace'
		*di as result "Percentage of trace due to the selected variability:" _col(80) `s_trace_PV_perc'
		while ( s_ExplainedVarVar < `s_trace_PV_perc' ) {
			scalar s_RetainedEigenCountVar = s_RetainedEigenCountVar+1
			scalar s_ExplainedVarVar       = s_ExplainedVarVar  + ( el( e(Ev), 1, s_RetainedEigenCountVar) )
        }
		*di as result "Sum of eigenvalues corresponding to the retained eigenvectors: "  _col(80) s_ExplainedVarVar
		scalar s_ExplainedVarVar_var = (s_ExplainedVarVar / `s_trace')*100
		di as result "Percentage of variance explained by the variability criterion: "  _col(80) s_ExplainedVarVar_var "%"
		di as result "Number of retained scores according to the variability criterion: "  _col(80) s_RetainedEigenCountVar
		if s_RetainedEigenCountVar >1 {
			local l_SecondIndex = scalar(s_RetainedEigenCountVar)
			qui predict double `prefix1'varscorepca1-`prefix1'varscorepca`l_SecondIndex', score
			 }
		else {
		qui predict double `prefix1'varscorepca1, score
		     }

ret scalar var_byvar_togvar  = s_ExplainedVarVar_var
ret scalar nscores_byvar_togvar   = s_RetainedEigenCountVar

if "`avg'"!=""  {
		* average criterion *
		scalar s_RetainedEigenCountAvg = 0
		scalar s_ExplainedVarAvg     = 0
		forvalues p=1/`e(f)' {
			* this is a trick to find if the eigenvalue is greater that avg(eigenvalues)
            scalar delta         = ( el(e(Ev),1,`p'))-(`s_trace' / `e(f)')
            if delta > 0 {
			    * autovalore oltre la media
                scalar s_RetainedEigenCountAvg = s_RetainedEigenCountAvg+1
				scalar s_ExplainedVarAvg      = s_ExplainedVarAvg + el(e(Ev),1,`p')
            }
            else {
			    * ho esaurito gli autovalori > media quindi esco dal loop forvalues
			    continue, break
		        }
            }
        scalar s_RetainedPC      = s_RetainedEigenCountAvg
		scalar s_ExplainedVarAvg_var = (s_ExplainedVarAvg / `s_trace')*100
		di as result "Percentage of variance explained by the average criterion: " _col(80) s_ExplainedVarAvg_var "%"
	    di as result "Number of retained scores according to the average criterion: "  _col(80) s_RetainedEigenCountAvg
		if s_RetainedEigenCountAvg>1 {
			local l_ThirdIndex = scalar(s_RetainedEigenCountAvg)
			quietly predict double `prefix1'avgscorepca1-`prefix1'avgscorepca`l_ThirdIndex', score
			}
		else {
			quietly predict double `prefix1'avgscorepca1, score
		     }

ret scalar var_byavg_togvar   = s_ExplainedVarAvg_var
ret scalar nscores_byavg_togvar   = s_RetainedEigenCountAvg
}   /*close option mean */

}  /* pca together without gmm/lags */


end
**************************