我想在PHP中运行ANOVA测试。我用于此任务的库是markrogoyski / math-php(https://github.com/markrogoyski/math-php#statistics---anova)。方法如下所示。
use MathPHP\Statistics\ANOVA;
// One-way ANOVA
$sample1 = [1, 2, 3];
$sample2 = [3, 4, 5];
$sample3 = [5, 6, 7];
⋮ ⋮
$anova = ANOVA::oneWay($sample1, $sample2, $sample3);
print_r($anova);
以下列格式从数据库中检索测试数据。每个子数组是ANOVA集中的一个数据集(如$ sample1,$ sample2等)。问题是根据输入,子阵列的数量不固定。因此,我在查询过程中将它们全部添加到一个大数组中。
Array
(
[0] => Array
(
[0] => 14.60
[1] => 15.94
)
[1] => Array
(
[0] => 16.12
[1] => 15.30
[2] => 9.24
)
[2] => Array
(
[0] => 6.80
[1] => 15.78
)
)
问题是ANOVA :: oneWay方法只接受逗号分隔的数组。当我简单地将上面的数组传递给函数时,
$anova = ANOVA::oneWay($TTFF_anova);
我收到以下错误。
Uncaught MathPHP\Exception\BadDataException: Must have at least three samples
我相信我需要将一组数组传递给该函数。
我在线搜索了可能的解决方案。这篇文章描述了Python中的类似问题(Running scipy's oneway anova in a script)。解决方案是
scipy.stats.f_oneway(*archive.values())
我希望问一下PHP中是否有类似的解决方案。
同样,我试过
$anova = ANOVA::oneWay(array_values($TTFF_anova));
但它不起作用。
我也尝试在PHP中使用call_user_func_array()函数
$anova = call_user_func_array('ANOVA::oneWay', $TTFF_anova);
我收到错误
Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'ANOVA' not found
请帮我解决这个问题。非常感谢你。
答案 0 :(得分:2)
从PHP 5.6开始,使用splat运算符...
解压缩参数:
$TTFF_anova = array($sample1, $sample2, $sample3);
$anova = ANOVA::oneWay(...$TTFF_anova);
call_user_func_array
应该使用命名空间或使用__NAMESPACE__
:
$anova = call_user_func_array('MathPHP\Statistics\ANOVA\ANOVA::oneWay', $TTFF_anova);
$anova = call_user_func_array(array('MathPHP\Statistics\ANOVA\ANOVA', 'oneWay'), $TTFF_anova);