public override void ComputePower()
{
double delta = Effect * Math.Sqrt(Samples);
double df = (Samples - 1);
TDistribution td = new TDistribution(df);
NoncentralTDistribution nt = new NoncentralTDistribution(df, delta);
switch (Tail)
{
case DistributionTail.TwoTail:
{
double Ta = td.InverseDistributionFunction(1.0 - Size / 2);
double pa = nt.ComplementaryDistributionFunction(+Ta);
double pb = nt.DistributionFunction(-Ta);
Power = pa + pb;
break;
}
case DistributionTail.OneLower:
{
double Ta = td.InverseDistributionFunction(Size);
Power = nt.DistributionFunction(Ta);
break;
}
case DistributionTail.OneUpper:
{
double Ta = td.InverseDistributionFunction(1.0 - Size);
Power = nt.ComplementaryDistributionFunction(Ta);
break;
}
default:
throw new InvalidOperationException();
}
}
public void TTestPowerAnalysisConstructorTest3() { // Examples from R's graphical manual // http://rgm2.lab.nig.ac.jp/RGM2/func.php?rd_id=pwr:pwr.t.test double actual, expected; { var target = new TTestPowerAnalysis(OneSampleHypothesis.ValueIsDifferentFromHypothesis) { Effect = 0.2, Samples = 60, Size = 0.10, }; target.ComputePower(); expected = 0.4555818; actual = target.Power; Assert.AreEqual(expected, actual, 1e-5); } { var target = new TwoSampleTTestPowerAnalysis(TwoSampleHypothesis.ValuesAreDifferent) { Effect = 2 / 2.8, Samples1 = 30, Samples2 = 30, }; target.ComputePower(); expected = 0.7764889; actual = target.Power; Assert.AreEqual(expected, actual, 1e-6); } { var target = new TwoSampleTTestPowerAnalysis(TwoSampleHypothesis.FirstValueIsGreaterThanSecond) { Effect = 0.3, Power = 0.75, }; target.ComputeSamples(); expected = 120.2232016; actual = target.Samples1; Assert.AreEqual(expected, actual, 1e-6); Assert.AreEqual(target.Samples1, target.Samples2); } }