Improvement of Identification Toolbox
Improvements
 heavily commented (also auxiliary functions) and changed notation to make all the functions (hopefully) more readable and understandable, and hence, easier to debug
 added identification criteria of Komunjer and Ng (2011, Econometrica) and Qu and Tkachenko (2012, Quantitative Economics)
 tests can be turned of, i.e. nostrength disables identification strenght, noreducedform disables reduced form criteria, nomoments disables moment criteria, nospectrum disables spectrum criteria, nominimal disables minimal system criteria
 all kronflags (analytic_derivation_mode) actually work in all functions
 added functionality when there is correlation in Sigma_e and when one wants to consider corr parameters of exogenous shocks. Previously, (1) corr parameters were not allowed when calling identification and (2) when Sigma_e was not diagonal then the toolbox relied on numerical derviatives only (kronflag=1). Now it is possible to handle both identification of corr parameters as well as correct analytical derivatives when Sigma_e is not diagonal with all possible kronflag values (1201)
 all plots and results are stored in the same folder named identification (previously there was another one with a capital I (Identification))
Needed changes to preprocessor

add as field to options_ident:
 tex (same as in options_)
 nostrength (to turn off identification strength)
 noreducedform (to turn off reduced form criteria)
 nomoments (to turn off Iskrev's moment criteria)
 nominimal (to turn off Komunjer and Ng's minimal system criteria)
 nospectrum (to turn off Qu and Tkachenko's spectrum criteria)

add to options_ident:
 normalize_jacobians (whether to normalize Jacobians or not)
 grid_nbr (integer used to discretize the interval [pi;pi]
 tol_rank (tolerance level to compute ranks)
 tol_deriv (tolerance level to select nonzero columns in derivatives)
 tol_sv (tolerance level to select nonzero singular values)
 ChecksViaSubsets (for debugging purposes, uses different function to find problematic parameter sets)
 max_dim_subsets_groups (for debugging purposes, used for ChecksViaSubsets)
Further Suggestions
 Rename getH.m into getParamsDerivReducedForm.m to make the purpose of this function evident
 Rename getJJ.m into getIdentificationJacobians.m to make the purpose of this function evident
 Rename thet2tau.m into IdentificationNumericalObjectiveFunction.m to make the purpose of this function evident
 dYss, d2Yss, dg1 should also include derivatives wrt to stderr and corr parameters (even though these are just 0), as in other functions (getJJ, dynare_estimation) we always add these manually
 I am pretty sure the current handling in getH.m of dYss and d2Yss is not correct in the case of nonstationary variables (if g2static is nonempty), I added a warning message, as I am not sure whether this is ever used
 It would be straigthforward to also include stderr and corr parameters of measurement errors (these is not possible right now). Should I do this?
 Computations of d2A and d2Om need to be checked, as the differences between computing these with analytically (kronflag=01) or numerically kronflag=12 is really large for the example model of AnSchorfheide.
 I am not sure how to best normalize Qu and Tkachenko's G matrix. It looks (and in the Gaussian case actually is) very similar to the Ahess matrix. So I used the same normalization rule as for the Ahess matrix. See comments in identification_checks.m. Anyone has a better idea? Please also check the models in test/identification/cgg for differences.
 parts that are unclear to me are marked by a [@wmutschl] tag
 the run time of tests/identification/as2007.mod increases from 0h01m27s to 0h03m46s (as Qu and Tkachenko's G matrix takes a little while to compute). One could decrease prior_mc=250 to prior_mc=150.
New functions
 commutation: Returns Magnus and Neudecker's commutation matrix that solves k*vec(X)=vec(X')
 DerivABCD: Derivative of X(p)=A(p)*B(p)*C(p)*D(p) w.r.t to p as in Magnus and Neudecker (1999), p. 175
 DeriveMinimalState: Derives minimal state space system by checking observability and controllability of all possible combinations of variables
 duplication: Duplication Matrix (and its Moore Penrose Inverse) as defined by Magnus and Neudecker (2002), p.49, Dp*vec(X) = X
 identification_checks_via_subsets: finds problematic parameters in a bruteforce fashion: It computes the rank of the Jacobians for all possible parameter combinations, if the rank condition is not fullfilled, these parameter sets are flagged as nonidentifiable. For debugging purposes only, as the current identification_checks.m (based on nullspace and multicorrelation coefficients) is much faster
Detailed changes in getH.m

functionality improvements
 heavily commented (also auxiliary functions) and changed notation of several variables to make this function (hopefully) more readable and understandable, and hence, easier to debug
 added functionality when Sigma_e is not diagonal and/or when one wants to consider corr parameters of exogenous shocks independent of the value of kronflag
 fixed function for all values of kronflag, i.e. kronflag=2101. Previosuly, only kronflag=20 were working, all other kronflags ran into errors (1 was actually never called , but was dealt with in getJJ.m). I assume kronflag=11 was used only for debugging issues, but still was not working. I fixed this now, the function now works outofthebox for all kronflag values.
 I also outlined and documented what each kronflag does and point to the corresponding equations in Ratto and Iskrev (2012) or Iskrev (2010,Appendix A)
 the function additionally outputs the Jacobians of B and Sig, which are needed for Qu and Tkachenko (2012) and Komunjer and Ng (2011)'s criteria
 Moved computation of Jacobian of tau=[ys;vec(A);vech(B * M_.Sigma_e * B')] into getJJ.m to have all Jacobians which are needed for identification in one place. That is, getH.m computes first and second parameter derivatives of (1) reducedform solution, (2) steady state and (3) Jacobian of dynamic model, whereas getJJ computes and sets up all Jacobians which are used for identification purposes. Therefore, getH might be useful more generally for other purposes than identification. For instance, when doing a GMM estimation, we could use this function to compute analytically the gradient of the moments and provide this to the optimizer used in a GMM context.

output arguments
 renamed
H
(Jacobian wrt parameters of tau=[ys;vec(A);vech(B * M_.Sigma_e * B')] into dTAU, (as H is very confusing, e.g. in other functions it is a Hessian, or Hss and H2ss is also just the steady state. Morevoer, tau is used in Iskrev(2010) for the steady state and reducedform solution)  renamed
Hss
(Jacobian of steady state wrt model parameters only) intodYss
(as H is very confusing here, see above)  renamed
H2ss
(Hessian wrt model parameters only of ys) into d2Yss (as H is very confusing, see above)  renamed
gp
intodg1
, where g1 corresponds to the same variable as in dynamic model files. Note that in params_deriv files gp lacks the contribution of Jacobian wrt steady state and dg1 includes this using the implicit function theorem as outlined in Ratto and Iskrev (2012). Hence, dg1 denotes Jacobian wrt to parameters. It is useful and important to distinguish gp and dg1.  added
dB
(Jacobian wrt parameters of solution matrix B) needed for Qu and Tkachenko (2012) as well as Komunjer and Ng (2011)  added
dSig
(Jacobian wrt parameters of M_.Sigma_e) needed for Qu and Tkachenko (2012) as well as Komunjer and Ng (2011)
 renamed

input arguments
 renamed
indx
(index of model parameters to be checked) intoindpmodel
, the p makes it more clear that this is a parameter index  renamed
indexo
(index of stderr parameters) intoindpstderr
, the p makes it more clear that this is a parameter index  renamed
iv
(index of variables to consider) intoindvar
 Renamed
M_
toM
,estim_params_
toestim_params
,options_
tooptions
,oo_
tooo
to visualize that these are local and not global variables  included
indpcorr
a matrix of indices for corr parameters to be checked
 renamed

misc
 distinguished clearly between variables in DR or in declaration order without overwriting this in between
 added which functions call getH.m
 updated copyright to 20102019
Detailed changes in getJJ.m

functionality improvements
 heavily commented and changed notation of several variables to make this function (hopefully) more readable and understandable, and hence, easier to debug
 added functionality when Sigma_e is not diagonal and/or when one wants to consider corr parameters of exogenous shocks independent of the value of kronflag
 tidied the function up, such that it sets up all Jacobians which are needed for identification, i.e. Iskrev's J matrix, Qu and Tkachenko (2012)'s G matrix, Komunjer and Ng (2011)'s D matrix, reducedform solution (dTAU), linear rational expectation (i.e. Jacobian of steady state and dynamic model equations dLRE).
 dTAU is now constructed in getJJ instead of in getH (see comment above in getH.m)
 works for all kronflags, i.e. for numerical derivatives (1 and 2) as well as for analytical derivatives based on kronecker products (1) or Sylvester Equations (0)
 added functionality for stderr and corr parameters independent of the value of kronflag (previously this was only possible with numerical derivatives, now it works for all kronflags)
 finds minimal state vector needed for Komunjer and Ng (2011)'s criteria (function
DeriveMinimalState.m
)  moved computations from kronflag=1 (which were used in case of corr in shock block) into getH.m, so that getJJ now only sets up the Jacobians for LRE, Iskrev's J, Qu and Tkachenko's G and Komunjer and Ng's D, whereas getH computes the Jacobians (wrt parameters) of A, B, Sigma_e, Om, Yss and g1. This should simplify debugging as everything is now in one place and not in two

output arguments
 renamed
JJ
intoJ
 renamed
H
intodTAU
(as H is very confusing, e.g. in other functions it is a Hessian, or Hss and H2ss is also just the steady state. Morevoer, tau is used in Iskrev(2010) for the steady state and reducedform solution)  renamed
gp
intodLRE
, as this corresponds to Jacobian of LRE=[Yss;vec(g1)] where g1 is the Jacobian of the dynamic model equations.  renamed
gam
intoMOMENTS
 added
G
for Qu and Tkachenko's Jacobian matrix G  added
D
for Komunjer and Ng's Jacobian matrix D  reordered output arguments
 renamed

input arguments
 added
options_ident
as input argument; hence,kronflag
,nlags
anduseautocorr
are removed from input arguments as these are available in options_ident  Renamed
M_
toM
,estim_params_
toestim_params
,options_
tooptions
,oo_
tooo
to visualize that these are local and not global variables  renamed
indx
(index of model parameters to be checked) intoindpmodel
, the p makes it more clear that this is a parameter index  renamed
indexo
(index of stderr parameters) intoindpstderr
, the p makes it more clear that this is a parameter index  added
indpcorr
(index of corr parameters)  renamed
mf
(index of VAROBS variables) intoindvobs
 added

misc
 updated copyright to 20102019
 provided some comments on several ways to compute the spectral density matrix
 added which functions call getJJ.m
Detailed changes in thet2tau.m

functionality improvements
 heavily commented and changed notation of several variables to make this function (hopefully) more readable and understandable, and hence, easier to debug
 Added output option to compute spectral density matrix
 Reorded and added some output option.
 Instead of Om,
outputflag=0
computes B and Sigma_e, which are needed for Qu and Tkachenko as well as Komunjer and Ng. The Jacobian of Om is then computed in getJJ or getH from Jacobian of B and Sigma_e. Due to some testing with An and Schorfheide model this seems to be more accurate when I compare these with the analytical derivatives. The old behavior (computing Om directly) can be restored by settingoutputflag=2
.  In total this function can now be used to compute numerically Jacobians of Yss, A, B, Sigma_e, Om, g1, autocovariogram and spectral density
 Clearly distinguished (and commented) on the different outputs of this function.
 Works for all types of parameters, ie. model, stderr and corr.
 This function can now also be used when there is no estimated_params block. Previously, there was an error when there was no estimated_params block when calling
set_all_parameters
as this requires some information inestim_params
. I fixed this by providing a temporary local estim_parms structure with the necessary information on model, stderr and corr parameters. In this way, this can be easily extended to also include stderr and corr parameters of measurement errors.

output arguments
 renamed
tau
intoout
, as this function computes very different things (and not only tau) depending on an input flag
 renamed

input arguments
 renamed
flagmoments
intooutputflag
as this function does not only compute moments but many other things (see above)  renamed
indx
(index of model parameters to be checked) intoindpmodel
, the p makes it more clear that this is a parameter index  renamed
indexo
(index of stderr parameters) intoindpstderr
, the p makes it more clear that this is a parameter index  added
indpcorr
(index of corr parameters)  merged
mf
(index of observable variables) andiv
(index of variables to consider) into a single indexindvar
as there is no need to distinguish between these two indices (they were never used in combination)  added
grid_nbr
(number of grid points to compute spectral density)  reordered input arguments
 renamed

misc
 added which functions call thet2tau
 updated copyright to 20102019
Detailed changes in identification_analysis.m

functionality improvements
 heavily commented and changed notation of several variables to make this function (hopefully) more readable and understandable, and hence, easier to debug
 renamed
dg1
todLRE
, renamedvecg1
tolre
, renamedH
todTAU
(see comments above)  added option
numzerotolderiv
with default1.e8
used for nonzero derivatives  added option
numzerotolrank
with default1.e10
used for rank computations  added theoretical identification analysis based on Komunjer and Ng (2011)'s method, i.e. steady state and observational equivalent spectral densities within a minimal system
 added theoretical identification analysis based on Qu and Tkachenko (2012)'s method, i.e. steady state and spectral density
 restructured the code slightly to combined chunks of code that belong together on the one hand, and on the other hand to differentiate between the different criteria
 added call to new function
identification_checks_via_subsets.m
(see above for the definition of the functionality) to perform identification checks differently as find it more intuitive and (most likely) more precise.

input arguments
 removed
bounds
anddataset_
as input argument, because these are not needed  moved
name_tex
andtittxt
intooptions_ident
as these two inputs are only used inident_bruteforce.m
and already set indynare_identification.m
 removed

output arguments
 added
ide_spectrum
structure for Qu and Tkachenko's criteria based on the spectral density  added
ide_minimal
structure for Komunjer and Ng's criteria based on the minimal state space system  reordered output arguments
 added

misc
 added which functions call identification_analysis
 updated copyright to 20102019
Detailed changes in dynare_identification.m

functionality improvements
 heavily commented and changed notation of several variables to make this function (hopefully) more readable and understandable, and hence, easier to debug
 included more options (and default values) which can be set by the user, i.e. nostrength, nomoments, nominimal, nospectrum, tex, tol_rank, tol_deriv, tol_sv, grid_nbr, ChecksViaSubsets, max_dim_subsets_group
 instead of turning warnings globally off, I specified the relevant warnings for matlab and octave, respectively, off
 improved the warning messages slightly
 restructured chunks of code with respect to different criteria

output arguments
 renamed arguments: TAU to STO_TAU, GAM to STO_MOMENTS, LRE to STO_LRE, gp to STO_si_dLRE, H to STO_si_dTAU, JJ to STO_si_J
 added arguments: STO_G and STO_D for the two new criteria

misc
 added which functions call dynare_identification
 updated copyright to 20102019
Detailed changes in identification_checks.m

functionality improvements
 added checks for Komunjer and Ng's D matrix. Note that the Jacobian D=[D_par D_rest], where D_par depends on the parameters and D_rest does not. So this is taken into account.
 added checks for Qu and Tkachenko's G matrix. Note that the Jacobian G is a Gram matrix with dimension nparam x nparam, similar to Ahess. So this is taken into account. I am, however, not sure whether this is correct regarding the multicorrelation and pairwise correlation coefficients. Please double check.
 the rank is now actually computed at the prespecified tolerance level (and not Matlab's default level), so this is in accordance to the further analysis of problematic parameter sets

output arguments
 added the rank to output arguments which is later also displayed
 replaced the J or JJ part in the variable names with X as this function is used for all sorts of Jacobians, not only Iskrev's J

input arguments
 renamed hess_flag to output_flag (and clearly outlined what each value does)
 added tol_rank and tol_sv as input arguments, such that the tolerance levels can be changed by the user and not preimplemented in this function
 added param_nbr which is needed for Komunjer and Ng's D matrix

misc
 updated copyright to 20102019
Detailed changes in ident_bruteforce.m

functionality improvements
 the output directory was set with a capital I, i.e. Identification, whereas in all other functions we rely on lower case i, i.e. identification. I changed this to lowercases, so everything is now saved in the same folder.
 changed displayed strings to be more precise with the corresponding papers and notation

input arguments
 renamed
n
tomax_dim_cova_group
to name options the same across functions  renamed
pnames_TeX
toname_tex
to name options the same across functions  added
tol_deriv
as tolerance level which can be changed by the user
 renamed

misc
 Added some comments
 updated copyright to 20102019
Detailed changes in disp_identification.m

functionality improvements
 this function displays the same output for different Jacobians, hence I put the common code into a for loop. This should simplify changing the output that is printed to the console. Previously the code was simply repeated for the different criteria and only the strings changed.
 some settings relevant for the computation are now printed as a summary to the console
 the tolerance level, rank and required rank are always displayed on the command line to see how many problematic sets there are and which tolerance level was used
 the function is also able to display problematic parameters computed by the new function
identification_checks_via_subsets.m
which is only used for debugging.

input arguments
 added
idespectrum
structure for analysis based on Qu and Tkachenko  added
ideminimal
structure for analysis based on Komunjer and Ng  added
options_ident
to have all necessary settings in a structure
 added

misc
 Added some comments
 Removed uncommented code that was not used as this was redundant and probably an artifact of the original programming?!
 updated copyright to 20102019
Detailed changes in dsge_likelihood.m

misc
 adjusted call of getH due to changes of input and output arguments
 updated copyright to 20102019
Detailed changes in cosn.m

misc
 commented functionality, input and output arguments of this function
 updated copyright to 20102019
Edited by Willi Mutschler