runTestCaseReference('CHISQ.INV', $expectedResult, ...$args); } public static function providerCHIINV(): array { return require 'tests/data/Calculation/Statistical/CHIINVLeftTail.php'; } /** * Degrees of freedom whose cdf used to under-iterate near the median. * References from scipy.stats.chi2.ppf. */ #[\PHPUnit\Framework\Attributes\DataProvider('providerChiInvLeftTailLargeDegrees')] public function testChiInvLeftTailLargeDegrees(float $expected, float $probability, int $degrees): void { $calculation = Calculation::getInstance(); $result = $calculation->calculateFormula("=CHISQ.INV($probability, $degrees)"); self::assertEqualsWithDelta($expected, $result, 1.0e-6); } public static function providerChiInvLeftTailLargeDegrees(): array { return [ 'df=10000' => [9999.333341235144, 0.5, 10000], 'df=200000' => [199999.3333337284, 0.5, 200000], ]; } public function invVersusDistTest(): void { $expectedResult = 4.671330448981; $probability = 0.3; $degrees = 7; $calculation = Calculation::getInstance(); $formula = "=CHISQ.INV($probability, $degrees)"; /** @var float|int|string */ $result = $calculation->calculateFormula($formula); self::assertEqualsWithDelta($expectedResult, $result, 1.0e-8); $formula = "=CHISQ.DIST($result, $degrees)"; $result = $calculation->calculateFormula($formula); self::assertEqualsWithDelta($probability, $result, 1.0e-8); } #[\PHPUnit\Framework\Attributes\DataProvider('providerChiInvLeftTailArray')] public function testChiInvLeftTailArray(array $expectedResult, string $probabilities, string $degrees): void { $calculation = Calculation::getInstance(); $formula = "=CHISQ.INV({$probabilities}, {$degrees})"; $result = $calculation->calculateFormula($formula); self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14); } public static function providerChiInvLeftTailArray(): array { return [ 'row/column vectors' => [ [ [5.0816470296362795, 6.345811195521517, 1.508898337422818], [9.61151737996991, 11.34032237742413, 4.0773397083341045], ], '{0.35, 0.5, 0.018}', '{7; 12}', ], ]; } }