/* KDEN.G: procedure to compute univariate kernel density estimator at a vector of points John Rust, University of Maryland, October, 2006 inputs: x vector of points to compute kernel density at (for plotting, etc) data vector of data points used to compute kernel density implicit global inputs kerneltyp: type of kernel density to use in the density estimation epanechnikov gaussian */ proc (1)=kden(x,data); local kti,kerneltyp,rx,rd,kde,i,h,s; kti=missrv(typecv("kerneltyp"),0); if (kti == 0); kerneltyp="epanechnikov"; kti=varput(kerneltyp,"kerneltyp"); else; kerneltyp=varget("kerneltyp"); endif; rx=rows(x); rd=rows(data); if (cols(data) > 1); "Error kden: data variable must be a vector"; retp(miss(0,0)); endif; if (cols(x) > 1); "Error kden: x variable must be a vector"; retp(miss(0,0)); endif; kde=zeros(rx,1); h=1.06/((rd)^(.2)); /* Bandwidth parameter, Silverman rule */ s=stdc(data); if (kerneltyp $== "gaussian"); i=1; do until i > rx; kde[i]=sumc(exp((-(x[i]-data)^2)/(2*h*h*s*s)))/(s*sqrt(2*pi)*h*rd); i=i+1; endo; elseif (kerneltyp $== "tricube"); i=1; do until i > rx; kde[i]=(70/(81*h*s*rd))*sumc((abs((x[i]-data)/(s*h)).<=1).*((ones(rd,1)-abs((x[i]-data)/(s*h))^3)^3)); i=i+1; endo; else; /* Epanechnikov */ i=1; do until i > rx; kde[i]=(3/(4*h*rd*s*sqrt(5)))*sumc(((((x[i]-data)/(s*h))^2).<=5).*(ones(rd,1)-.2*(((x[i]-data)/(s*h))^2))); i=i+1; endo; endif; retp(kde); endp;