如何从PHP中的一个双精度数组计算第n个百分位数?

如何从PHP中的一个双精度数组计算第n个百分位数?,php,math,statistics,Php,Math,Statistics,我有一个大的double数组,我需要计算数组的第75个和第90个百分位值。通过函数实现这一点最有效的方法是什么?自从统计以来已经有一段时间了,所以我可以离开这里,但这里有一个漏洞 function get_percentile($percentile, $array) { sort($array); $index = ($percentile/100) * count($array); if (floor($index) == $index) { $re

我有一个大的double数组,我需要计算数组的第75个和第90个百分位值。通过函数实现这一点最有效的方法是什么?

自从统计以来已经有一段时间了,所以我可以离开这里,但这里有一个漏洞

function get_percentile($percentile, $array) {
    sort($array);
    $index = ($percentile/100) * count($array);
    if (floor($index) == $index) {
         $result = ($array[$index-1] + $array[$index])/2;
    }
    else {
        $result = $array[floor($index)];
    }
    return $result;
}

$scores = array(22.3, 32.4, 12.1, 54.6, 76.8, 87.3, 54.6, 45.5, 87.9);

echo get_percentile(75, $scores);
echo get_percentile(90, $scores);

如果您使用更高的百分比值(100),并且没有根据Excel百分位函数返回正确的值,则上述答案可能引发未定义的索引通知。你可以

我已经根据第二个变量用PHP编写了一个函数,这是Excel中使用的变量。此功能还受到非百分比值(超出范围)的保护


根据Mark的上述功能,我认为该功能实际上应该是:

函数get_percentile($percentile,$array){ 排序($数组); $index=($percentile/100)*(count($array))-1; 如果(楼层($index)=$index){ 返回$array[$index]; } 否则{ 返回($array[下限($index)]+$array[上限($index)])/2; } } 我认为有三件事需要纠正:

  • 需要将计数减少一,以避免索引超出范围(如上所述)
  • 如果计算出的
    索引
    是一个整数,那么您应该能够只返回索引。您只需要在
    索引
    不是整数时平均值
  • 对于平均值,最好使用
    下限
    上限
    使指数达到平均值,而不是从指数中任意减去一个

  • 对数组进行排序,计算值的数量,计算75%和90%的条目,以修复超出范围的索引:$index=($percentile/100)*(count($array)-1);
    function getPercentile($array, $percentile)
    {
        $percentile = min(100, max(0, $percentile));
        $array = array_values($array);
        sort($array);
        $index = ($percentile / 100) * (count($array) - 1);
        $fractionPart = $index - floor($index);
        $intPart = floor($index);
    
        $percentile = $array[$intPart];
        $percentile += ($fractionPart > 0) ? $fractionPart * ($array[$intPart + 1] - $array[$intPart]) : 0;
    
        return $percentile;
    }