-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopt_block_length.m
123 lines (109 loc) · 4.67 KB
/
opt_block_length.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
function Bstar = opt_block_length(data)
% function Bstar = opt_block_length_REV_dec07(data);
%
% This is a function to select the optimal (in the sense
% of minimising the MSE of the estimator of the long-run
% variance) block length for the stationary bootstrap or circular bootstrap.
% Code follows Politis and White, 2001, "Automatic Block-Length
% Selection for the Dependent Bootstrap".
%
% DECEMBER 2007: CORRECTED TO DEAL WITH ERROR IN LAHIRI'S PAPER, PUBLISHED
% BY NORDMAN IN THE ANNALS OF STATISTICS
%
% NOTE: The optimal average block length for the stationary bootstrap, and it does not need to be an integer.
% The optimal block length for the circular bootstrap should be an integer. Politis and White suggest
% rounding the output UP to the nearest integer.
%
% INPUTS: data, an nxk matrix
%
% OUTPUTS: Bstar, a 2xk vector of optimal bootstrap block lengths, [BstarSB;BstarCB]
%
% Andrew Patton
%
% 4 December, 2002
% Revised (to include CB): 13 January, 2003.
%
% Helpful suggestions for this code were received from Dimitris Politis and Kevin Sheppard.
%
%Modified 23.8.2003 by Kevin Sheppard for speed issues
[n,k] = size(data);
% these are optional in opt_block_length_full.m, but fixed at default values here
KN=max(5,sqrt(log10(n)));
%mmax = ceil(sqrt(n));
mmax = ceil(sqrt(n))+KN; % adding KN extra lags to employ Politis' (2002) suggestion for finding largest signif m
warning_flags=0;
round=0;
%Bmax = sqrt(n); % maximum value of Bstar to consider.
Bmax = ceil(min(3*sqrt(n),n/3)); % dec07: new idea for rule-of-thumb to put upper bound on estimated optimal block length
c=2;
origdata=data;
Bstar_final=[];
for i=1:k
data=origdata(:,i);
% FIRST STEP: finding mhat-> the largest lag for which the autocorrelation is still significant.
temp = mlag(data,mmax);
temp = temp(mmax+1:end,:); % dropping the first mmax rows, as they're filled with zeros
temp = corrcoef([data(mmax+1:end),temp]);
temp = temp(2:end,1);
% We follow the empirical rule suggested in Politis, 2002, "Adaptive Bandwidth Choice".
% as suggested in Remark 2.3, setting c=2, KN=5
temp2 = [mlag(temp,KN)',temp(end-KN+1:end)]; % looking at vectors of autocorrels, from lag mhat to lag mhat+KN
temp2 = temp2(:,KN+1:end); % dropping the first KN-1, as the vectors have empty cells
temp2 = (abs(temp2)<(c*sqrt(log10(n)/n)*ones(KN,mmax-KN+1))); % checking which are less than the critical value
temp2 = sum(temp2)'; % this counts the number of insignif autocorrels
temp3 = [(1:1:length(temp2))',temp2];
temp3 = temp3(find(temp2==KN),:); % selecting all rows where ALL KN autocorrels are not signif
if isempty(temp3)
mhat = max(find(abs(temp) > (c*sqrt(log10(n)/n)) )); % this means that NO collection of KN autocorrels were all insignif, so pick largest significant lag
else
mhat = temp3(1,1); % if more than one collection is possible, choose the smallest m
end
if 2*mhat>mmax;
M = mmax;
trunc1=1;
else
M = 2*mhat;
end
clear temp temp2 temp3;
% SECOND STEP: computing the inputs to the function for Bstar
kk = (-M:1:M)';
if M>0;
temp = mlag(data,M);
temp = temp(M+1:end,:); % dropping the first mmax rows, as they're filled with zeros
temp = cov([data(M+1:end),temp]);
acv = temp(:,1); % autocovariances
acv2 = [-(1:1:M)',acv(2:end)];
if size(acv2,1)>1;
acv2 = sortrows(acv2,1);
end
acv = [acv2(:,2);acv]; % autocovariances from -M to M
clear acv2;
Ghat = sum(lam(kk/M).*abs(kk).*acv);
DCBhat = 4/3*sum(lam(kk/M).*acv)^2;
% OLD nov07
% DSBhat = 2/pi*quadl('opt_block_length_calc',-pi,pi,[],[],kk,acv,lam(kk/M));
% DSBhat = DSBhat + 4*sum(lam(kk/M).*acv)^2; % first part of DSBhat (note cos(0)=1)
% NEW dec07
DSBhat = 2*(sum(lam(kk/M).*acv)^2); % first part of DSBhat (note cos(0)=1)
% FINAL STEP: constructing the optimal block length estimator
Bstar = ((2*(Ghat^2)/DSBhat)^(1/3))*(n^(1/3));
if Bstar>Bmax
Bstar = Bmax;
end
BstarCB = ((2*(Ghat^2)/DCBhat)^(1/3))*(n^(1/3));
if BstarCB>Bmax
BstarCB = Bmax;
end
Bstar = [Bstar;BstarCB];
else
Ghat = 0;
% FINAL STEP: constructing the optimal block length estimator
Bstar = [1;1];
end
Bstar_final=[Bstar_final Bstar];
end
Bstar=Bstar_final;
%%%%%%%%%%%%%%%%%%%%%%%%
function lam=lam(kk)
%Helper function, calculates the flattop kernel weights
lam = (abs(kk)>=0).*(abs(kk)<0.5)+2*(1-abs(kk)).*(abs(kk)>=0.5).*(abs(kk)<=1);