package eu.choreos.vv.analysis;
import java.util.List;
import org.apache.commons.math.distribution.TDistribution;
import org.apache.commons.math.distribution.TDistributionImpl;
import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
import eu.choreos.vv.aggregations.DescriptiveStatisticsFactory;
import eu.choreos.vv.data.ExperimentReport;
public class SampleSizeEstimation extends Analyzer {
private double precision;
/**
* Calculates the appropriate sample size for the experiment.
*
* @param precision
* a degree of precision given in the same unit as the
* measurements
*/
public SampleSizeEstimation(double precision) {
this.precision = precision;
}
@Override
public void analyse(ExperimentReport report) throws Exception {
for (Number key : report.keySet()) {
List<Number> sample = report.get(key).getMeasurements("responseTime");
int n = sample.size();
DescriptiveStatistics ds = DescriptiveStatisticsFactory
.create(sample);
double m = ds.getMean();
double d = m * (1 - precision);
double s = ds.getStandardDeviation();
TDistribution dist = new TDistributionImpl(n - 1);
double t = dist.cumulativeProbability(0.05);
long sampleSize = Math.round(Math.ceil(Math.pow((t * s) / d, 2)));
System.out.println("sample size must be " + sampleSize);
}
}
}