diff --git a/matlab/utilities/dataset/compute_cova.m b/matlab/utilities/dataset/compute_cova.m deleted file mode 100644 index 51f68981e..000000000 --- a/matlab/utilities/dataset/compute_cova.m +++ /dev/null @@ -1,67 +0,0 @@ -function dataset_ = compute_cova(dataset_) -% Computes the covariance matrix of the sample (possibly with missing observations). - -%@info: -%! @deftypefn {Function File} {@var{dataset_} =} compute_corr(@var{dataset_}) -%! @anchor{compute_corr} -%! This function computes covariance matrix of the sample (possibly with missing observations). -%! -%! @strong{Inputs} -%! @table @var -%! @item dataset_ -%! Dynare structure describing the dataset, built by @ref{initialize_dataset} -%! @end table -%! -%! @strong{Outputs} -%! @table @var -%! @item dataset_ -%! Dynare structure describing the dataset, built by @ref{initialize_dataset} -%! @end table -%! -%! @strong{This function is called by:} -%! @ref{descriptive_statistics}. -%! -%! @strong{This function calls:} -%! @ref{ndim}, @ref{demean}, @ref{nandemean}. -%! -%! @strong{Remark 1.} On exit, a new field is appended to the structure: @code{dataset_.descriptive.cova} is a -%! @tex{n\times n} vector (where @tex{n} is the number of observed variables as defined by @code{dataset_.info.nvobs}). -%! -%! @end deftypefn -%@eod: - -% Copyright (C) 2011-2012 Dynare Team -% -% This file is part of Dynare. -% -% Dynare is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version. -% -% Dynare is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with Dynare. If not, see . - -% Original author: stephane DOT adjemian AT univ DASH lemans DOT fr - -dataset_.descriptive.cova = zeros(dataset_.nvobs); - -data = transpose(dataset_.data); - -for i=1:dataset_.info.nvobs - for j=i:dataset_.info.nvobs - if dataset_.missing.state - dataset_.descriptive.cova(i,j) = nanmean(nandemean(data(:,i)).*nandemean(data(:,j))); - else - dataset_.descriptive.cova(i,j) = mean(demean(data(:,i)).*demean(data(:,j))); - end - if j>i - dataset_.descriptive.cova(j,i) = dataset_.descriptive.cova(i,j); - end - end -end \ No newline at end of file diff --git a/matlab/utilities/dataset/nancovariance.m b/matlab/utilities/dataset/nancovariance.m new file mode 100644 index 000000000..8e2e2b227 --- /dev/null +++ b/matlab/utilities/dataset/nancovariance.m @@ -0,0 +1,101 @@ +function CovarianceMatrix = nancovariance(data) +% Computes the covariance matrix of a sample (possibly with missing observations). + +%@info: +%! @deftypefn {Function File} {@var{CovarianceMatrix} =} compute_corr(@var{data}) +%! @anchor{compute_cova} +%! This function computes covariance matrix of a sample defined by a dseries object (possibly with missing observations). +%! +%! @strong{Inputs} +%! @table @var +%! @item data +%! a T*N array of real numbers. +%! @end table +%! +%! @strong{Outputs} +%! @table @var +%! @item CovarianceMatrix +%! Array of real numbers. +%! @end table +%! +%! @strong{This function is called by:} +%! @ref{descriptive_statistics}. +%! +%! @strong{This function calls:} +%! @ref{ndim}, @ref{demean}, @ref{nandemean}. +%! +%! @strong{Remark 1.} On exit, a new field is appended to the structure: @code{dataset_.descriptive.cova} is a +%! @tex{n\times n} vector (where @tex{n} is the number of observed variables as defined by @code{dataset_.info.nvobs}). +%! +%! @end deftypefn +%@eod: + +% Copyright (C) 2011-2014 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see . + +% Initialize the output. +CovarianceMatrix = zeros(size(data,2)); + +if isanynan(data) + data = bsxfun(@minus,data,nanmean(data)); + for i=1:size(data,2) + for j=i:size(data,2) + CovarianceMatrix(i,j) = nanmean(data(:,i).*data(:,j)); + if j>i + CovarianceMatrix(j,i) = CovarianceMatrix(i,j); + end + end + end +else + data = bsxfun(@minus,data,mean(data)); + CovarianceMatrix = (transpose(data)*data)/size(data,1); +end + +%@test:1 +%$ +%$ % Define a dataset. +%$ data1 = randn(10000000,2); +%$ +%$ % Same dataset with missing observations. +%$ data2 = data1; +%$ data2(45,1) = NaN; +%$ data2(57,2) = NaN; +%$ data2(367,:) = NaN(1,2); +%$ +%$ t = zeros(2,1); +%$ +%$ % Call the tested routine. +%$ try +%$ c1 = nancovariance(data1); +%$ t(1) = 1; +%$ catch +%$ t(1) = 0; +%$ end +%$ try +%$ c2 = nancovariance(data2); +%$ t(2) = 1; +%$ catch +%$ t(2) = 0; +%$ end +%$ +%$ if t(1) && t(2) +%$ t(3) = max(max(abs(c1-c2)))<1e-4; +%$ end +%$ +%$ % Check the results. +%$ T = all(t); +%@eof:1 \ No newline at end of file diff --git a/matlab/utilities/general/isanynan.m b/matlab/utilities/general/isanynan.m new file mode 100644 index 000000000..7a16419d0 --- /dev/null +++ b/matlab/utilities/general/isanynan.m @@ -0,0 +1,21 @@ +function yes = isanynan(array) +% Return one if the array contains at least one NaN, 0 otherwise. + +% Copyright (C) 2011-2014 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see . + +yes = any(isnan(array(:))); \ No newline at end of file