我正在使用 perl+R 来分析大量样本数据集。对于每两个样本,我计算 t 检验 p 值。目前,我正在使用 statistics::R 模块将值从 perl 导出到 R,然后使用 t.test 函数。然而,这个过程非常缓慢。我想知道是否有人知道以更有效的方式执行相同过程的 perl 函数。
谢谢!
我正在使用 perl+R 来分析大量样本数据集。对于每两个样本,我计算 t 检验 p 值。目前,我正在使用 statistics::R 模块将值从 perl 导出到 R,然后使用 t.test 函数。然而,这个过程非常缓慢。我想知道是否有人知道以更有效的方式执行相同过程的 perl 函数。
谢谢!
数据量、数据集对的数量,甚至您编写的代码可能会帮助我们确定您的代码运行缓慢的原因。例如,将许多小型数据集发送到 R 会很慢,但可以通过一次发送所有数据来加快速度。
对于纯 Perl 解决方案,您首先需要计算测试统计量(
Statistics::TTest
例如,这很容易,并且已经在 中完成),然后将其转换为 p 值(您需要类似 R 的qt
函数,但我不是确保它在 Perl 中很容易获得——您可以在一个块中将 T 值发送到 R,最后将它们转换为 p 值)。
您也可以尝试PDL,尤其是PDL::Stats。
该Statistics::TTest
模块为您提供 p 值。
use Statistics::TTest;
my @r1 = map { rand(10) } 1..32;
my @r2 = map { rand(10)-2 } 1..32;
my $ttest = new Statistics::TTest;
$ttest->load_data(\@r1,\@r2);
say "p-value = prob > |T| = ", $ttest->{t_prob};
玩了一下,我发现这给你的 p 值略低于你从 R 得到的值。R 显然正在做一些降低自由度的事情,但我的统计知识不足以解释它在做什么或者为什么。(在上面的例子中,差异大约是 1%。如果你使用 320 个浮点数的样本而不是 32 个,那么差异是 50% 甚至更多,但这是 1e-12 和 1.5e-12 之间的差异。)如果您需要精确的 p 值,您需要小心。