Home > . > kernel_density_estimate.m

kernel_density_estimate

PURPOSE ^

% This function aims at estimating a continuous density. A kernel density

SYNOPSIS ^

function [abscissa,f] = kernel_density_estimate(data,number_of_grid_points,bandwidth,kernel_function)

DESCRIPTION ^

%  This function aims at estimating a continuous density. A kernel density 
%  estimator is used (see Silverman [1986]). 
%
%  * Silverman [1986], "Density estimation for statistics and data analysis". 
%
%  The code is adapted from Anders Holtsberg's matlab toolbox (stixbox). 
%
%  stephane.adjemian@cepremap.cnrs.fr [07/16/2004].

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [abscissa,f] = kernel_density_estimate(data,number_of_grid_points,bandwidth,kernel_function) 
0002 %%  This function aims at estimating a continuous density. A kernel density
0003 %%  estimator is used (see Silverman [1986]).
0004 %%
0005 %%  * Silverman [1986], "Density estimation for statistics and data analysis".
0006 %%
0007 %%  The code is adapted from Anders Holtsberg's matlab toolbox (stixbox).
0008 %%
0009 %%  stephane.adjemian@cepremap.cnrs.fr [07/16/2004].
0010 if size(data,2) > 1 & size(data,1) == 1 
0011     data = transpose(data); 
0012 elseif size(data,2)>1 & size(data,1)>1 
0013     error('kernel_density_estimate :: data must be a one dimensional array.'); 
0014 end
0015 test = log(number_of_grid_points)/log(2);
0016 if (abs(test-round(test)) > 10^(-12))
0017     error('kernel_density_estimate :: The number of grid points must be a power of 2.');
0018 end
0019 
0020 n = size(data,1);
0021 
0022 %% KERNEL SPECIFICATION...
0023 if strcmpi(kernel_function,'gaussian') 
0024     k    = inline('inv(sqrt(2*pi))*exp(-0.5*x.^2)'); 
0025 elseif strcmpi(kernel_function,'uniform') 
0026     k    = inline('0.5*(abs(x) <= 1)'); 
0027 elseif strcmpi(kernel_function,'triangle') 
0028     k    = inline('(1-abs(x)).*(abs(x) <= 1)'); 
0029 elseif strcmpi(kernel_function,'epanechnikov') 
0030     k    = inline('0.75*(1-x.^2).*(abs(x) <= 1)'); 
0031 elseif strcmpi(kernel_function,'quartic') 
0032     k    = inline('0.9375*((1-x.^2).^2).*(abs(x) <= 1)'); 
0033 elseif strcmpi(kernel_function,'triweight') 
0034     k    = inline('1.09375*((1-x.^2).^3).*(abs(x) <= 1)'); 
0035 elseif strcmpi(kernel_function,'cosinus') 
0036     k    = inline('(pi/4)*cos((pi/2)*x).*(abs(x) <= 1)'); 
0037 end
0038 
0039 %% COMPUTE DENSITY ESTIMATE... Gaussian kernel should be used (FFT).
0040 a  = min(data) - (max(data)-min(data))/3;
0041 b  = max(data) + (max(data)-min(data))/3;
0042 abscissa = linspace(a,b,number_of_grid_points)';
0043 d  = abscissa(2)-abscissa(1); 
0044 xi = zeros(number_of_grid_points,1);
0045 xa = (data-a)/(b-a)*number_of_grid_points; 
0046 for i = 1:n;
0047     indx = floor(xa(i));
0048     temp = xa(i)-indx;
0049     xi(indx+[1 2]) = xi(indx+[1 2]) + [1-temp,temp]';
0050 end;
0051 xk = [-number_of_grid_points:number_of_grid_points-1]'*d;
0052 kk = k(xk/bandwidth);
0053 kk = kk / (sum(kk)*d*n);
0054 f = ifft(fft(fftshift(kk)).*fft([xi ;zeros(size(xi))]));
0055 f = real(f(1:number_of_grid_points));

Generated on Fri 16-Jun-2006 09:09:06 by m2html © 2003