ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
Percentiles.php
Go to the documentation of this file.
1<?php
2
4
7
9{
10 public const RANK_SORT_DESCENDING = 0;
11
12 public const RANK_SORT_ASCENDING = 1;
13
26 public static function PERCENTILE(...$args)
27 {
28 $aArgs = Functions::flattenArray($args);
29
30 // Calculate
31 $entry = array_pop($aArgs);
32
33 try {
35 } catch (Exception $e) {
36 return $e->getMessage();
37 }
38
39 if (($entry < 0) || ($entry > 1)) {
40 return Functions::NAN();
41 }
42
43 $mArgs = self::percentileFilterValues($aArgs);
44 $mValueCount = count($mArgs);
45 if ($mValueCount > 0) {
46 sort($mArgs);
47 $count = Counts::COUNT($mArgs);
48 $index = $entry * ($count - 1);
49 $iBase = floor($index);
50 if ($index == $iBase) {
51 return $mArgs[$index];
52 }
53 $iNext = $iBase + 1;
54 $iProportion = $index - $iBase;
55
56 return $mArgs[$iBase] + (($mArgs[$iNext] - $mArgs[$iBase]) * $iProportion);
57 }
58
59 return Functions::NAN();
60 }
61
76 public static function PERCENTRANK($valueSet, $value, $significance = 3)
77 {
78 $valueSet = Functions::flattenArray($valueSet);
79 $value = Functions::flattenSingleValue($value);
80 $significance = ($significance === null) ? 3 : Functions::flattenSingleValue($significance);
81
82 try {
84 $significance = StatisticalValidations::validateInt($significance);
85 } catch (Exception $e) {
86 return $e->getMessage();
87 }
88
89 $valueSet = self::rankFilterValues($valueSet);
90 $valueCount = count($valueSet);
91 if ($valueCount == 0) {
92 return Functions::NA();
93 }
94 sort($valueSet, SORT_NUMERIC);
95
96 $valueAdjustor = $valueCount - 1;
97 if (($value < $valueSet[0]) || ($value > $valueSet[$valueAdjustor])) {
98 return Functions::NA();
99 }
100
101 $pos = array_search($value, $valueSet);
102 if ($pos === false) {
103 $pos = 0;
104 $testValue = $valueSet[0];
105 while ($testValue < $value) {
106 $testValue = $valueSet[++$pos];
107 }
108 --$pos;
109 $pos += (($value - $valueSet[$pos]) / ($testValue - $valueSet[$pos]));
110 }
111
112 return round($pos / $valueAdjustor, $significance);
113 }
114
127 public static function QUARTILE(...$args)
128 {
129 $aArgs = Functions::flattenArray($args);
130 $entry = array_pop($aArgs);
131
132 try {
134 } catch (Exception $e) {
135 return $e->getMessage();
136 }
137
138 $entry = floor($entry);
139 $entry /= 4;
140 if (($entry < 0) || ($entry > 1)) {
141 return Functions::NAN();
142 }
143
144 return self::PERCENTILE($aArgs, $entry);
145 }
146
158 public static function RANK($value, $valueSet, $order = self::RANK_SORT_DESCENDING)
159 {
160 $value = Functions::flattenSingleValue($value);
161 $valueSet = Functions::flattenArray($valueSet);
162 $order = ($order === null) ? self::RANK_SORT_DESCENDING : Functions::flattenSingleValue($order);
163
164 try {
167 } catch (Exception $e) {
168 return $e->getMessage();
169 }
170
171 $valueSet = self::rankFilterValues($valueSet);
172 if ($order === self::RANK_SORT_DESCENDING) {
173 rsort($valueSet, SORT_NUMERIC);
174 } else {
175 sort($valueSet, SORT_NUMERIC);
176 }
177
178 $pos = array_search($value, $valueSet);
179 if ($pos === false) {
180 return Functions::NA();
181 }
182
183 return ++$pos;
184 }
185
186 protected static function percentileFilterValues(array $dataSet)
187 {
188 return array_filter(
189 $dataSet,
190 function ($value): bool {
191 return is_numeric($value) && !is_string($value);
192 }
193 );
194 }
195
196 protected static function rankFilterValues(array $dataSet)
197 {
198 return array_filter(
199 $dataSet,
200 function ($value): bool {
201 return is_numeric($value);
202 }
203 );
204 }
205}
An exception for terminatinating execution or to throw for unit testing.
static flattenArray($array)
Convert a multi-dimensional array to a simple 1-dimensional array.
Definition: Functions.php:583
static flattenSingleValue($value='')
Convert an array to a single scalar value by extracting the first element.
Definition: Functions.php:649
static PERCENTRANK($valueSet, $value, $significance=3)
PERCENTRANK.
Definition: Percentiles.php:76
static RANK($value, $valueSet, $order=self::RANK_SORT_DESCENDING)
RANK.
$index
Definition: metadata.php:60