/*
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;
/**This class models the negative binomial distribution with specified successes
parameter and probability parameter.*/
public class NegativeBinomialDistribution extends Distribution{
//Paramters
private int successes;
private double probability;
/**General Constructor: creates a new negative binomial distribution with
given parameter values.*/
public NegativeBinomialDistribution(int k, double p){
setParameters(k, p);
}
/**Default Constructor: creates a new negative binomial distribution with
successes parameter 1 and probability parameter 0.5,*/
public NegativeBinomialDistribution(){
this(1, 0.5);
}
/**This method set the paramters and the set of values.*/
public void setParameters(int k, double p){
//Correct for invalid parameters
if(k < 1) k = 1;
if(p <= 0) p = 0.05;
if(p > 1) p = 1;
//Assign parameters
successes = k;
probability = p;
//Set truncated values
super.setParameters(successes, Math.ceil(getMean() + 4 * getSD()), 1, DISCRETE);
}
/**Set the successes parameters*/
public void setSuccesses(int k){
setParameters(k, probability);
}
/**Get the successes parameter*/
public int getSuccesses(){
return successes;
}
/**Get the probability parameter*/
public double getProbability(){
return probability;
}
/**Set the probability parameters*/
public void setProbability(double p){
setParameters(successes, p);
}
/**Density function*/
public double getDensity(double x){
int n = (int)Math.rint(x);
if(n < successes) return 0;
else return comb(n - 1, successes - 1) * Math.pow(probability, successes)
* Math.pow(1 - probability, n - successes);
}
/**Maximum value of getDensity function*/
public double getMaxDensity(){
double mode = (successes - 1) / probability + 1;
return getDensity(mode);
}
/**Mean*/
public double getMean(){
return successes / probability;
}
/**Variance*/
public double getVariance(){
return (successes * (1 - probability)) / (probability * probability);
}
/**Simulate a value*/
public double simulate(){
int count = 0, trials = 0;
while (count < successes){
if (Math.random() < probability) count++;
trials++;
}
System.out.println("In simulate, prob ="+probability+"\t success= "+successes+"\t trials ="+trials);
return trials;
}
}