Author:

Qiu, Y-M and Chen, S. X.

Title:

Qiu, Y-M and Chen, S. X. (2012). Test for Bandedness of High Dimensional Covariance Matrices with Bandwidth Estimation, TheAnnals of Statistics, 40, 1285-1314.

R-code:

The following functions are used to compute the test statistic for the banded covariance matrix test proposed by Qiu and Chen (2012). The code is written by Matlab. Please save the following functions as M-file separately with the file names being the function names.

The function "adstat(x,k)" provides the test statistic. The argument "x" is the data matrix with rows being observations and columns being attributes; the argument "k" is the hypothesized bandwidth to test (k=0 means the diagonal structure of the covariance). From Qiu and Chen (2012), if the test statistic is larger than 3.289, we reject the Null Hypothesis.

#------------------------------------------------------------

% This function computes the number of permutations of choosing m out of n %

function y=P(m,n)
s=1;
for i=1:m
    s=s*(n-(i-1));
end
y=s;
end

#------------------------------------------------------------

% This function will be used in the function "adstat(x,k)". The argument "x" is the data matrix. %

function y=adT(x)
M=size(x);
a=ones(1,M(1));
A=(a*x)';
B=sum(diag(x*x'));
mf22=A'*A-B;
mf1=1/P(2,M(1))+2/P(3,M(1))+2/P(4,M(1));
mf2=1/P(4,M(1));
mf3=2/P(3,M(1))+4/P(4,M(1));
temp1=[];
t1=0;
s1=0;
for i=1:M(1)
    temp2=[];
    t2=0;
    s2=0;
    temp1=x(i,:);
    for j=1:M(1);
        temp2=x(j,:);
        t2=mf1*(temp1*temp2')^2+mf2*mf22*(temp1*temp2')-mf3*(temp1*temp2')*(temp2*A)+mf3*(temp1*temp2')*(temp2*temp2');
        s2=s2+t2;
    end
    t1=s2-(mf1*(temp1*temp1')^2+mf2*mf22*(temp1*temp1')-mf3*(temp1*temp1')*(temp1*A)+mf3*(temp1*temp1')*(temp1*temp1'));
    s1=s1+t1;
end
y=s1;
end

#------------------------------------------------------------

% This function will be used in the function "adb2". %

function y=adb1(x,i,j,q)
M=size(x);
temp1=0;
sband1=0;
mfb1=1/P(2,M(1))+2/P(3,M(1))+2/P(4,M(1));
mfb2=2/P(3,M(1))+3/P(4,M(1));
mfb3=1/P(4,M(1));
for n=1:(M(2)-q)
    temp1=mfb1*x(i,n)*x(j,n+q)*x(j,n)*x(i,n+q)+mfb2*(x(i,n)*(x(j,n+q)^2)*x(j,n)-x(i,n)*x(j,n+q)*x(j,n)*sum(x(:,n+q)))+mfb3*(x(i,n)*x(j,n+q)*sum(x(:,n))*sum(x(:,n+q))+x(i,n)^2*x(j,n+q)^2-x(i,n)^2*x(j,n+q)*sum(x(:,n+q))-x(i,n)*x(j,n+q)^2*sum(x(:,n)));
    sband1=sband1+temp1;
end
y=sband1;
end


#------------------------------------------------------------

% This function will be used in the function "adb". %

function y=adb2(x,i,j,k)
sband2=adb1(x,i,j,0);
temp2=0;
for l=1:k
    temp2=2*adb1(x,i,j,l);
    sband2=sband2+temp2;
end
y=sband2;
end


#------------------------------------------------------------

% This function will be used in the function "adstat(x,k)". %

function y=adb(x,k)
M=size(x);
temp3=0;
sband3=0;
for i=1:M(1)
    temp4=0;
    sband4=0;
    for j=1:M(1);
        temp4=adb2(x,i,j,k);
        sband4=sband4+temp4;
    end
    temp3=sband4-adb2(x,i,i,k);
    sband3=sband3+temp3;
end
y=sband3;
end

#------------------------------------------------------------

% This function gives the test statistic. The argument "x" is the data matrix with rows being observations and columns being attributes; the argument "k" is the hypothesized bandwidth to test. %

function y=adstat(x,k)
M=size(x);
ts=M(1)*(adT(x)/adb(x,k)-1);
y=ts;
end

#------------------------------------------------------------