/*
Copyright (C) 2001 Kyle Siegrist, Dawn Duehring
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but without
any warranty; without even the implied warranty of merchantability or
fitness for a particular purpose. See the GNU General Public License for
more details. You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package distributions;
/**The distribution of the order statistic of a specified order from a
random sample of a specified size from a specified sampling distribution*/
public class OrderStatisticDistribution extends Distribution{
Distribution dist;
int sampleSize, order;
/**General constructor: creates a new order statistic distribution
corresponding to a specified sampling distribution, sample size, and
order*/
public OrderStatisticDistribution(Distribution d, int n, int k){
setParameters(d, n, k);
}
/**Set the parameters: the sampling distribution, sample size, and order*/
public void setParameters(Distribution d, int n, int k){
//Correct for invalid parameters
if (n < 1) n = 1;
if (k < 1) k = 1; else if (k > n) k = n;
//Assign parameters
dist = d;
sampleSize = n;
order = k;
int t = dist.getType();
Domain domain = dist.getDomain();
if (t == DISCRETE) super.setParameters(domain.getLowerValue(), domain.getUpperValue(), domain.getWidth(), t);
else super.setParameters(domain.getLowerBound(), domain.getUpperBound(), domain.getWidth(), t);
}
/**Density function*/
public double getDensity(double x){
double p = dist.getCDF(x);
if (dist.getType() == DISCRETE) return getCDF(x) - getCDF(x - getDomain().getWidth());
else return order * comb(sampleSize, order) * Math.pow(p, order - 1) * Math.pow(1 - p, sampleSize - order) * dist.getDensity(x);
}
/**Cumulative distribution function*/
public double getCDF(double x){
double sum = 0;
double p = dist.getCDF(x);
for (int j = order; j <= sampleSize; j++) sum = sum + comb(sampleSize, j) * Math.pow(p, j) * Math.pow(1 - p, sampleSize - j);
return sum;
}
}