📄 stabcull.m
字号:
function [alpha,sigma,beta,mu]=stabcull(x)
%STABCULL Quantile parameter estimates of a stable distribution.
% [ALPHA,SIGMA,BETA,MU]=STABCULL(X) returns the estimated (McCulloch's
% method) parameters ALPHA, SIGMA, BETA, MU of a stable distribution
% vector X.
%
% Reference(s):
% [1] J.H.McCulloch (1986) "Simple Consistent Estimators of Stable
% Distribution Parameters", Commun. Statist. - Simul. 15(4) 1109-1136
% [2] R.Weron (2004) "Computationally intensive Value at Risk
% calculations", in "Handbook of Computational Statistics: Concepts and
% Methods", eds. J.E. Gentle, W. Haerdle, Y. Mori, Springer, Berlin,
% 911-950.
% Written by Szymon Borak and Rafal Weron (2000.12.15, rev. 2002.12.04)
% Copyright (c) 2000-2006 by Rafal Weron
% Compute quantiles
x = sort(x);
x05 = prctile(x,5);
x25 = prctile(x,25);
x50 = prctile(x,50);
x75 = prctile(x,75);
x95 = prctile(x,95);
% Compute quantile statistics
va = (x95-x05)./(x75-x25);
vb = (x95+x05-2*x50)./(x95-x05);
vs = x75-x25;
% Define interpolation matrices (see [1])
tva = [2.439 2.5 2.6 2.7 2.8 3.0 3.2 3.5 4.0 5.0 6.0 8.0 10.0 15.0 25.0];
tvb = [0.0, 0.1, 0.2, 0.3, 0.5, 0.7, 1.0];
ta = [2.0 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9 0.8 0.7 0.6 0.5];
tb = [0.0, 0.25, 0.5, 0.75, 1.0];
psi1 = [2.000, 2.000, 2.000, 2.000, 2.000, 2.000, 2.000;
1.916, 1.924, 1.924, 1.924, 1.924, 1.924, 1.924;
1.808, 1.813, 1.829, 1.829, 1.829, 1.829, 1.829;
1.729, 1.730, 1.737, 1.745, 1.745, 1.745, 1.745;
1.664, 1.663, 1.663, 1.668, 1.676, 1.676, 1.676;
1.563, 1.560, 1.553, 1.548, 1.547, 1.547, 1.547;
1.484, 1.480, 1.471, 1.460, 1.448, 1.438, 1.438;
1.391, 1.386, 1.378, 1.364, 1.337, 1.318, 1.318;
1.279, 1.273, 1.266, 1.250, 1.210, 1.184, 1.150;
1.128, 1.121, 1.114, 1.101, 1.067, 1.027, 0.973;
1.029, 1.021, 1.014, 1.004, 0.974, 0.935, 0.874;
0.896, 0.892, 0.887, 0.883, 0.855, 0.823, 0.769;
0.818, 0.812, 0.806, 0.801, 0.780, 0.756, 0.691;
0.698, 0.695, 0.692, 0.689, 0.676, 0.656, 0.595;
0.593, 0.590, 0.588, 0.586, 0.579, 0.563, 0.513];
psi2 = [0.000, 2.160, 1.000, 1.000, 1.000, 1.000, 1.000;
0.000, 1.592, 3.390, 1.000, 1.000, 1.000, 1.000;
0.000, 0.759, 1.800, 1.000, 1.000, 1.000, 1.000;
0.000, 0.482, 1.048, 1.694, 1.000, 1.000, 1.000;
0.000, 0.360, 0.760, 1.232, 2.229, 1.000, 1.000;
0.000, 0.253, 0.518, 0.823, 1.575, 1.000, 1.000;
0.000, 0.203, 0.410, 0.632, 1.244, 1.906, 1.000;
0.000, 0.165, 0.332, 0.499, 0.943, 1.560, 1.000;
0.000, 0.136, 0.271, 0.404, 0.689, 1.230, 2.195;
0.000, 0.109, 0.216, 0.323, 0.539, 0.827, 1.917;
0.000, 0.096, 0.190, 0.284, 0.472, 0.693, 1.759;
0.000, 0.082, 0.163, 0.243, 0.412, 0.601, 1.596;
0.000, 0.074, 0.147, 0.220, 0.377, 0.546, 1.482;
0.000, 0.064, 0.128, 0.191, 0.330, 0.478, 1.362;
0.000, 0.056, 0.112, 0.167, 0.285, 0.428, 1.274];
psi3 = [1.908, 1.908, 1.908, 1.908, 1.908;
1.914, 1.915, 1.916, 1.918, 1.921;
1.921, 1.922, 1.927, 1.936, 1.947;
1.927, 1.930, 1.943, 1.961, 1.987;
1.933, 1.940, 1.962, 1.997, 2.043;
1.939, 1.952, 1.988, 2.045, 2.116;
1.946, 1.967, 2.022, 2.106, 2.211;
1.955, 1.984, 2.067, 2.188, 2.333;
1.965, 2.007, 2.125, 2.294, 2.491;
1.980, 2.040, 2.205, 2.435, 2.696;
2.000, 2.085, 2.311, 2.624, 2.973;
2.040, 2.149, 2.461, 2.886, 3.356;
2.098, 2.244, 2.676, 3.265, 3.912;
2.189, 2.392, 3.004, 3.844, 4.775;
2.337, 2.635, 3.542, 4.808, 6.247;
2.588, 3.073, 4.534, 6.636, 9.144];
psi4 = [0.0, 0.0, 0.0, 0.0, 0.0;
0.0, -0.017, -0.032, -0.049, -0.064;
0.0, -0.030, -0.061, -0.092, -0.123;
0.0, -0.043, -0.088, -0.132, -0.179;
0.0, -0.056, -0.111, -0.170, -0.232;
0.0, -0.066, -0.134, -0.206, -0.283;
0.0, -0.075, -0.154, -0.241, -0.335;
0.0, -0.084, -0.173, -0.276, -0.390;
0.0, -0.090, -0.192, -0.310, -0.447;
0.0, -0.095, -0.208, -0.346, -0.508;
0.0, -0.098, -0.223, -0.383, -0.576;
0.0, -0.099, -0.237, -0.424, -0.652;
0.0, -0.096, -0.250, -0.469, -0.742;
0.0, -0.089, -0.262, -0.520, -0.853;
0.0, -0.078, -0.272, -0.581, -0.997;
0.0, -0.061, -0.279, -0.659, -1.198];
% Compute estimates by interpolationg through the tables
[xrow,xcol] = size(x);
if (xrow == 1), xcol = 1; end;
for n = 1:xcol,
tvai1 = max([1 find(tva <= va(n))]);
tvai2 = min([15 find(tva >= va(n))]);
tvbi1 = max([1 find(tvb <= abs(vb(n)))]);
tvbi2 = min([7 find(tvb >= abs(vb(n)))]);
dista = (tva(tvai2)-tva(tvai1));
if dista ~= 0,
dista = (va(n)-tva(tvai1))/dista;
end;
distb = (tvb(tvbi2)-tvb(tvbi1));
if distb ~= 0,
distb = (abs(vb(n))-tvb(tvbi1))/distb;
end;
psi1b1 = dista*psi1(tvai2,tvbi1)+(1-dista)*psi1(tvai1,tvbi1);
psi1b2 = dista*psi1(tvai2,tvbi2)+(1-dista)*psi1(tvai1,tvbi2);
alpha(n) = distb*psi1b2+(1-distb)*psi1b1;
psi2b1 = dista*psi2(tvai2,tvbi1)+(1-dista)*psi2(tvai1,tvbi1);
psi2b2 = dista*psi2(tvai2,tvbi2)+(1-dista)*psi2(tvai1,tvbi2);
beta(n) = sign(vb(n))*(distb*psi2b2+(1-distb)*psi2b1);
tai1 = max([1 find(ta >= alpha(n))]);
tai2 = min([16 find(ta <= alpha(n))]);
tbi1 = max([1 find(tb <= abs(beta(n)))]);
tbi2 = min([5 find(tb >= abs(beta(n)))]);
dista = (ta(tai2)-ta(tai1));
if dista ~= 0,
dista = (alpha(n)-ta(tai1))/dista;
end;
distb = (tb(tbi2)-tb(tbi1));
if distb ~= 0,
distb = (abs(beta(n))-tb(tbi1))/distb;
end;
psi3b1 = dista*psi3(tai2,tbi1)+(1-dista)*psi3(tai1,tbi1);
psi3b2 = dista*psi3(tai2,tbi2)+(1-dista)*psi3(tai1,tbi2);
sigma(n) = vs(n)/(distb*psi3b2+(1-distb)*psi3b1);
psi4b1 = dista*psi4(tai2,tbi1)+(1-dista)*psi4(tai1,tbi1);
psi4b2 = dista*psi4(tai2,tbi2)+(1-dista)*psi4(tai1,tbi2);
zeta = sign(beta(n))*sigma(n)*(distb*psi4b2+(1-distb)*psi4b1) + x50 ;
if (abs(alpha(n)-1) < 0.05 )
mu(n) = zeta;
else
mu(n) = zeta - beta(n)* sigma(n) * tan(0.5 * pi *alpha(n));
end;
end;
% Correct estimates for out of range values
alpha(alpha <= 0) = 10^(-10)+0*alpha(alpha <= 0);
alpha(alpha > 2) = 2+0*alpha(alpha > 2);
sigma(sigma <= 0) = 10^(-10)+0*sigma(sigma <= 0);
beta(beta < -1) = -1+0*beta(beta < -1);
beta(beta > 1) = 1+0*beta(beta > 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -