我正在使用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。
答案 0 :(得分:1)
我知道这可能是一个非常晚的回复,但我会尽力回答你的问题。假设您有两个不成对的样本sampleOne
和sampleTwo
(由于它们的大小不同,它们未配对),您可以使用以下方法计算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作为自由度,而统计本身是使用合并方差计算的。