t-Test Function Equivalent to Excels™ TTEST? |
Is there a function in the SDL suite that is equivalent to Excels™ TTEST(array, array, df, sides)? I would like to perform a t-test on two arrays using Delphi 6 but I don't see this function.
Answer:
Currently (release 7.2 as of March 2003) the unit STATIS does not contain any direct equivalent. However, the next release will offer such a function. Following is the source code of this function (uses the units VECTOR, MATH2, and STATIS):
(******************************************************************************)
function Perform2SampleTTest (Data1, Data2: TVector; TestType: TtTestVersion;
OneSided: boolean; var Mean1, Mean2, Stdv1, Stdv2,
MeanDiff, StdDiff, tStatistic: double;
var df: integer): double; overload;
(******************************************************************************
ENTRY: Data1, Data2 ..... data vectors
TestType ......... type of t-test to be performed
OneSided ......... one-sided / two-sided problem
EXIT: Mean1, Mean2 ..... means of the two samples
Stdv1, Stdv2 ..... standard deviations of the two samples
MeanDiff ......... mean of paired differences
StdDiff .......... standard deviation of paired differences
tStatistic ....... t statistic
df ............... degrees of freedom
function returns the probability associated with a 2-sample t-Test
(probability which indicates the likelyhood that two samples have come
from the same two underlying populations having the same mean)
******************************************************************************)
var
Stat1 : TCurveFit;
StdvPooled : double;
Numd1, Numd2 : longint;
i,j : integer;
ddummy : double;
begin
Stat1 := TCurveFit.Create (nil);
if TestType = ttPaired
then begin
if Data1.NrOfElem <> Data2.NrOfElem then
raise ESDLStatisError.Create ('Perform2SampleTTest: paired t-test requires equal number of data points');
for i:=1 to Data1.NrOfElem do
Stat1.EnterStatValue (Data1[i],Data2[i]);
Stat1.CalcStatistics (numd1, Mean1, Mean2, Stdv1, Stdv2, Meandiff, StdDiff, ddummy);
end
else begin
for i:=1 to Data1.NrOfElem do
Stat1.EnterStatValue (Data1[i],0);
Stat1.CalcStatistics (numd1, Mean1, ddummy, Stdv1, ddummy, ddummy, ddummy, ddummy);
Stat1.Init;
for i:=1 to Data2.NrOfElem do
Stat1.EnterStatValue (Data2[i],0);
Stat1.CalcStatistics (numd2, Mean2, ddummy, Stdv2, ddummy, ddummy, ddummy, ddummy);
end;
Stat1.Free;
case Testtype of
ttPaired : begin // paired t-test
if (NumD1 = 0) then
raise ESDLStatisError.Create ('Perform2SampleTTest: number of data points is zero');
if (StdDiff = 0) then
raise ESDLStatisError.Create ('Perform2SampleTTest: standard deviation of paired is zero');
tstatistic := abs(MeanDiff)/StdDiff*sqrt(Numd1);
df := Numd1-1;
end;
ttHomoScedastic : begin // 2-sample t-test
if (NumD1 = 0) or (NumD2 = 0) then
raise ESDLStatisError.Create ('Perform2SampleTTest: number of data points is zero');
StdvPooled := sqrt(((Numd1-1)*Stdv1*Stdv1 + (Numd2-1)*Stdv2*Stdv2)/(Numd1+Numd2-2));
if (StdvPooled = 0) then
raise ESDLStatisError.Create ('Perform2SampleTTest: pooled standard deviation is zero');
tstatistic := (Mean1-Mean2)/(StdvPooled*sqrt(1/Numd1+1/Numd2));
df := Numd1 + Numd2 - 2;
end;
ttHeteroScedastic : begin // Welch test
if (NumD1 = 0) or (NumD2 = 0) then
raise ESDLStatisError.Create ('Perform2SampleTTest: number of data points is zero');
StdvPooled := Stdv1*Stdv1/NumD1 + Stdv2*Stdv2/NumD2;
if (StdvPooled = 0) then
raise ESDLStatisError.Create ('Perform2SampleTTest: pooled standard deviation is zero');
tstatistic := abs(Mean1-Mean2)/sqrt(StdvPooled);
df := trunc (sqr(StdvPooled)/((sqr(Stdv1*Stdv1/NumD1)/(NumD1-1))+(sqr(Stdv2*Stdv2/NumD2)/(NumD2-1))));
end;
end;
result := tDistriIntegral(tstatistic,df);
if result > 0.5 then
result := 1-result;
if not OneSided then
result := result*2;
end;
(******************************************************************************)
function Perform2SampleTTest (Data1, Data2: TVector; TestType: TtTestVersion;
OneSided: boolean): double; overload;
(******************************************************************************
ENTRY: Data1, Data2 ..... data vectors
TestType ......... type of t-test to be performed
OneSided ......... one-sided / two-sided problem
EXIT: function returns the probability associated with a 2-sample t-Test
(probability which indicates the likelyhood that two samples have come
from the same two underlying populations having the same mean)
REMARK: This function mimicks the function TTEST of Excel. If the TestType is
set to ttHeteroScedastic the Welch approximation is used yielding
probabilities which are slightly different to the results obtained
from Excel.
******************************************************************************)
var
Mean1 : double;
Mean2 : double;
Stdv1 : double;
Stdv2 : double;
MeanDiff : double;
StdDiff : double;
tStatistic : double;
df : integer;
begin
result := Perform2SampleTTest (Data1, Data2, TestType, OneSided, Mean1, Mean2,
Stdv1, Stdv2, MeanDiff, StdDiff, tStatistic, df);
end;