Q: How to ignore NaN's in my data?
Missing data (or NaN's in matrices) is sometimes a big problem. MATLAB has a few functions to deal with this situation: NANMEAN, NANMEDIAN, NANSTD, NANMIN, NANMAX, NANSUM. Below are additional functions (© Kara Lavender), that compute covariance matrix and EOFs from incomplete data.
% NANCOV.M % Program to compute a covariance matrix ignoring NaNs % % Usage: C = nancov(A,B) % % NANCOV calculates the matrix product A*B ignoring NaNs by replacing them % with zeros, and then normalizing each element C(i,j) by the number of % non-NaN values in the vector product A(i,:)*B(:,j). % % A - left hand matrix to be multiplied % B - right hand matrix to be multiplied % C - resultant covariance matrix % Example: A = [1 NaN 1] , B = [1 % 1 % 1] % then nancov(A,B) is 2/2 = 1 % % This is much better than Josh's stupid way (his words, not mine). function [C]=nancov(A,B); NmatA=~isnan(A); % Counter matrix NmatB=~isnan(B); A(isnan(A))=0; % Replace NaNs in A,B, and counter matrices B(isnan(B))=0; % with zeros Npts=NmatA*NmatB; C=(A*B)./Npts; % NANEOF.M % Function to compute EOFs from demeaned data with NaNs: % function [B,vars,amps]=naneof(anom); % Computes EOFs of ROW DIMENSION in anom matrix function [B,vars,amps]=naneof(anom); %----------------------------------------------------------------------- % Compute covariance of matrix with NaNs Cov=nancov(anom,anom'); %----------------------------------------------------------------------- % Compute eigenvectors (EOFs), eigenvalues (variances of amplitudes) of % data covariance matrix [B,D]=eig(Cov); % B = EOFs, diag(D) = eigenvalues vars=flipud(diag(D)); % eigenvalues = variances of each amplitude % EIG outputs from low to high, so flip column % to order from high to low B=fliplr(B); % Flip columns left/right to correspond % to adjusted ordering of amplitudes %----------------------------------------------------------------------- % Put 0's in for NaNs in ANOM matrix to be able to compute amplitudes anom(isnan(anom))=0; amps=B'*anom; % amplitudes %----------------------------------------------------------------------- % Checks %check=B*amps; % Check that this gives original % ANOM matrix