Apache Math:计算t检验中的置信区间,该检验有两个样本

时间:2017-10-29 16:12:50

标签: java statistics apache-commons-math

我正在使用Apache Math3对网站项目进行Student t测试。假设我有两个样本:

double[] sampleOne = new double[] {134 ,146 ,104 ,119 ,124 ,161 ,107 ,83    ,113 ,129 ,97   ,123};
double[] sampleTwo = new double[] { 70, 118,    101,    85, 107,    132,    94};

此数据是从https://www.statsdirect.com/help/parametric_methods/unpaired_t.htm

复制的

我希望计算上面显示的置信区间。例如:

Assuming equal variances 
95% confidence interval for difference between means = -2.193679 to 40.193679

我找到了这个SO链接:

Using Apache Commons Math to determine confidence intervals,显示了这种方法:

private double getConfidenceIntervalWidth(StatisticalSummary statistics, double significance) {
    TDistribution tDist = new TDistribution(statistics.getN() - 1);
    double a = tDist.inverseCumulativeProbability(1.0 - significance / 2);
    return a * statistics.getStandardDeviation() / Math.sqrt(statistics.getN());
}

这似乎不适用于t测试中的两个样本。我做了很多研究,但无法找到如何使用Apache Math3。

2 个答案:

答案 0 :(得分:1)

我知道这可能是一个非常晚的回复,但我会尽力回答你的问题。假设您有两个不成对的样本sampleOnesampleTwo(由于它们的大小不同,它们未配对),您可以使用以下方法计算t统计量:

DescriptiveStatistics one = new DescriptiveStatistics();
for (double d : sampleOne)
    one.addValue(d);
DescriptiveStatistics two = new DescriptiveStatistics();
for (double d : sampleTwo)
    two.addValue(d);
double tStat = TestUtils.t(one, two);

请注意,您也可以使用DescriptiveStatistics代替SummaryStatistics。相反,如果您想要p值,您可以执行以下操作:

double pVal = TestUtils.tTest(sampleOne, sampleTwo);

最后,如果你想以给定的置信水平运行完整的测试(让我们称之为double conf = 0.95),那么你执行:

TestUtils.tTest(sampleOne, sampleTwo, 1.0 - conf)

转向获取下边距和上边距,Apache Commons Math支持这种方式没有直接的方法。看起来公式可以用于非配对t检验,但要记住你的样本'差异必须相等(如您提供的网站所示)。

答案 1 :(得分:1)

你的想法是正确的,但你需要得到正确的t统计量,正确的标准误差乘以a和正确的自由度。如果您假设方差相等,请使用

double t = tTest.homoscedasticT(sampleOne, sampleTwo);

获取t统计量。然后,您可以通过将其除以均值之间的差异来恢复其相关的标准误差。

double meanDiff = StatUtils.mean(sampleOne) - StatUtils.mean(sampleTwo);
double tSigma = meanDiff / t;

然后得到一个T分布实例,其自由度等于两个样本大小之和减去两个= 17并执行您尝试的操作,仅乘以标准误差以获得间隔半宽:

TDistribution tDist = new TDistribution(df);
double a = tDist.inverseCumulativeProbability(1.0 - significance / 2);
double halfWidth = a * tSigma;

对于不等方差情况,您需要计算近似自由度。请参阅Commons Math TTest源中受保护的方法df。上面的代码给出了与你的链接中相等差异情况相同的结果。对于不等方差,我认为引用有一个错误,因为它们似乎在t分布中使用17作为自由度,而统计本身是使用合并方差计算的。