123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481 |
- <?php
- namespace MathPHP\Tests\Probability\Distribution\Continuous;
- use MathPHP\Probability\Distribution\Continuous\StudentT;
- class StudentTTest extends \PHPUnit\Framework\TestCase
- {
- /**
- * @test pdf
- * @dataProvider dataProviderForPdf
- * @param float $t
- * @param float $ν
- * @param float $expected
- */
- public function testPdf(float $t, float $ν, float $expected)
- {
- // Given
- $studentT = new StudentT($ν);
- // When
- $pdf = $studentT->pdf($t);
- // Then
- $this->assertEqualsWithDelta($expected, $pdf, 0.0000001);
- }
- /**
- * @return array [t, ν, pdf]
- * Generated with R dt(t, ν) from package stats
- */
- public function dataProviderForPdf(): array
- {
- return [
- [-4, 1, 0.01872411],
- [-3, 1, 0.03183099],
- [-2, 1, 0.06366198],
- [-1, 1, 0.1591549],
- [0, 1, 0.3183099],
- [1, 1, 0.1591549],
- [2, 1, 0.06366198],
- [3, 1, 0.03183099],
- [4, 1, 0.01872411],
- [5, 1, 0.01224269],
- [10, 1, 0.003151583],
- [-4, 2, 0.01309457],
- [-3, 2, 0.02741012],
- [-2, 2, 0.06804138],
- [-1, 2, 0.1924501],
- [0, 2, 0.3535534],
- [1, 2, 0.1924501],
- [2, 2, 0.06804138],
- [3, 2, 0.02741012],
- [4, 2, 0.01309457],
- [5, 2, 0.007127781],
- [10, 2, 0.0009707329],
- [-4, 6, 0.004054578],
- [-3, 6, 0.01549193],
- [-2, 6, 0.06403612],
- [-1, 6, 0.2231423],
- [0, 6, 0.3827328],
- [1, 6, 0.2231423],
- [2, 6, 0.06403612],
- [3, 6, 0.01549193],
- [4, 6, 0.004054578],
- [5, 6, 0.001220841],
- [10, 6, 1.651408e-05],
- [-10, 10, 7.284686e-07],
- [-5, 10, 0.0003960011],
- [-2, 10, 0.06114577],
- [-1, 10, 0.230362],
- [0, 10, 0.3891084],
- [1, 10, 0.230362],
- [2, 10, 0.06114577],
- [5, 10, 0.0003960011],
- [10, 10, 7.284686e-07],
- [-10, 20, 2.660085e-09],
- [-5, 20, 7.898911e-05],
- [-2, 20, 0.05808722],
- [-1, 20, 0.2360456],
- [0, 20, 0.3939886],
- [1, 20, 0.2360456],
- [2, 20, 0.05808722],
- [5, 20, 7.898911e-05],
- [-10, 20, 2.660085e-09],
- [0, 50, 0.3969527],
- [1, 50, 0.2395711],
- [5, 50, 1.283547e-05],
- [0, 100, 0.3979462],
- [1, 100, 0.2407659],
- [5, 100, 5.080058e-06],
- [0, 200, 0.3984439],
- [1, 200, 0.2413671],
- [5, 200, 2.88097e-06],
- [0, 250, 0.3985435],
- [1, 250, 0.2414876],
- [5, 250, 2.545035e-06],
- [0, 300, 0.39861],
- [1, 300, 0.241568],
- [5, 300, 2.338036e-06],
- [0, 301, 0.3986111],
- [0, 302, 0.3986122],
- [0, 303, 0.3986133],
- [0, 305, 0.3986154],
- [0, 310, 0.3986207],
- [0, 320, 0.3986307],
- [1, 320, 0.2415931],
- [5, 320, 2.276028e-06],
- [5, 320, 2.276028e-06],
- [5, 325, 2.261896e-06],
- [5, 330, 2.248256e-06],
- [5, 331, 2.245584e-06],
- [5, 332, 2.242931e-06],
- [5, 333, 2.240297e-06],
- [5, 334, 2.23768e-06],
- [5, 335, 2.235082e-06],
- [0, 341, 0.3986499],
- [0, 351, 0.3986582],
- [0, 361, 0.3986661],
- [0, 371, 0.3986735],
- [0, 381, 0.3986806],
- [0, 400, 0.398693],
- [0, 500, 0.3987429],
- [1, 500, 0.241729],
- [2, 500, 0.05417883],
- [3, 500, 0.004569562],
- [5, 500, 1.962337e-06],
- [0, 1000, 0.3988426],
- [1, 1000, 0.2418498],
- [2, 1000, 0.05408517],
- [3, 1000, 0.004500625],
- [5, 1000, 1.712012e-06],
- [0, 1200, 0.3988592],
- [1, 1200, 0.2418699],
- [2, 1200, 0.05406951],
- [3, 1200, 0.004489151],
- [5, 1200, 1.672771e-06],
- [0, 1500, 0.3988758],
- [1, 1500, 0.2418901],
- [2, 1500, 0.05405383],
- [3, 1500, 0.004477681],
- [5, 1500, 1.634218e-06],
- [5, 1000, 1.712012233e-06],
- [1E9, 2, 1e-27],
- ];
- }
- /**
- * @test Github issue 429 - pdf - produced incorrect value of 0
- *
- * R Reference:
- * > library(stats)
- * > v <- 341
- * > t <- 0
- * > dt(t, v)
- * [1] 0.3986499
- */
- public function testBugIssue429StudentTPdf()
- {
- // Given
- $v = 341;
- $studentT = new StudentT($v);
- // When
- $t = 0;
- $pdf = $studentT->pdf($t);
- // Then
- $expected = 0.3986499;
- $this->assertEqualsWithDelta($expected, $pdf, 0.001);
- }
- /**
- * @test cdf
- * @dataProvider dataProviderForCdf
- * @param float $t
- * @param float $ν
- * @param float $expected
- */
- public function testCdf(float $t, float $ν, float $expected)
- {
- // Given
- $studentT = new StudentT($ν);
- // When
- $cdf = $studentT->cdf($t);
- // Then
- $this->assertEqualsWithDelta($expected, $cdf, 0.0000001);
- }
- /**
- * @return array [t, ν, cdf]
- * Generated with R pt(t, ν) from package stats
- */
- public function dataProviderForCdf(): array
- {
- return [
- [-4, 1, 0.07797913],
- [-3, 1, 0.1024164],
- [-2, 1, 0.1475836],
- [-1, 1, 0.25],
- [0, 1, 0.5],
- [1, 1, 0.75],
- [2, 1, 0.8524164],
- [3, 1, 0.8975836],
- [4, 1, 0.9220209],
- [5, 1, 0.937167],
- [10, 1, 0.9682745],
- [-4, 2, 0.02859548],
- [-3, 2, 0.04773298],
- [-2, 2, 0.09175171],
- [-1, 2, 0.2113249],
- [0, 2, 0.5],
- [1, 2, 0.7886751],
- [2, 2, 0.9082483],
- [3, 2, 0.952267],
- [4, 2, 0.9714045],
- [5, 2, 0.9811252],
- [10, 2, 0.9950738],
- [-4, 6, 0.003559489],
- [-3, 6, 0.0120041],
- [-2, 6, 0.04621316],
- [-1, 6, 0.1779588],
- [0, 6, 0.5],
- [1, 6, 0.8220412],
- [2, 6, 0.9537868],
- [3, 6, 0.9879959],
- [4, 6, 0.9964405],
- [5, 6, 0.9987738],
- [10, 6, 0.999971],
- [-2, 3, 0.06966298],
- [0.1, 2, 0.5352673],
- [2.9, 2, 0.9494099],
- [3.9, 6, 0.996008],
- [\INF, 6, 1],
- [-\INF, 6, 0],
- [0, \INF, 0.5],
- [1, \INF, 0.841344746],
- [1, 5E5, 0.841344504097939],
- [1.5E50, 1, 1],
- ];
- }
- /**
- * @test mean
- * @dataProvider dataProviderForMean
- * @param float $ν
- * @param float $μ
- */
- public function testMean(float $ν, float $μ)
- {
- // Given
- $studentT = new StudentT($ν);
- // When
- $mean = $studentT->mean();
- // Then
- $this->assertEquals($μ, $mean);
- }
- /**
- * @return array [ν, μ]
- */
- public function dataProviderForMean(): array
- {
- return [
- [2, 0],
- [3, 0],
- ];
- }
- /**
- * @test mean is not a number when ν is less than or equal to 1
- */
- public function testMeanNan()
- {
- // Given
- $ν = 1;
- $studentT = new StudentT($ν);
- // When
- $mean = $studentT->mean();
- // Then
- $this->assertNan($mean);
- }
- /**
- * @test median
- * @dataProvider dataProviderForMedianAndMode
- * @param float $ν
- * @param float $expected
- */
- public function testMedian(float $ν, float $expected)
- {
- // Given
- $studentT = new StudentT($ν);
- // When
- $median = $studentT->median();
- // Then
- $this->assertEquals($expected, $median);
- }
- /**
- * @test mode
- * @dataProvider dataProviderForMedianAndMode
- * @param float $ν
- * @param float $expected
- */
- public function testMode(float $ν, float $expected)
- {
- // Given
- $studentT = new StudentT($ν);
- // When
- $mode = $studentT->mode();
- // Then
- $this->assertEquals($expected, $mode);
- }
- /**
- * @return array [ν, μ]
- */
- public function dataProviderForMedianAndMode(): array
- {
- return [
- [1, 0],
- [2, 0],
- [3, 0],
- [4, 0],
- ];
- }
- /**
- * @test variance
- * @dataProvider dataProviderForVariance
- * @param float $ν
- * @param float $expected
- */
- public function testVariance(float $ν, float $expected)
- {
- // Given
- $studentT = new StudentT($ν);
- // When
- $variance = $studentT->variance();
- // Then
- $this->assertEquals($expected, $variance);
- }
- /**
- * @return array [ν, μ]
- */
- public function dataProviderForVariance(): array
- {
- return [
- [1.1, \INF],
- [1.5, \INF],
- [2, \INF],
- [3, 3],
- [4, 2],
- [5, 5 / 3],
- ];
- }
- /**
- * @test variance is not a number when ν ≤ 1
- * @dataProvider dataProviderForVarianceNan
- * @param float $ν
- */
- public function testVarianceNan(float $ν)
- {
- // Given
- $studentT = new StudentT($ν);
- // When
- $variance = $studentT->variance();
- // Then
- $this->assertNan($variance);
- }
- /**
- * @return array [ν, μ]
- */
- public function dataProviderForVarianceNan(): array
- {
- return [
- [0.1],
- [0.5],
- [0.9],
- [1],
- ];
- }
- /**
- * @test inverse
- * @dataProvider dataProviderForInverse
- * @param float $p
- * @param float $ν
- * @param float $x
- */
- public function testInverse(float $p, float $ν, float $x)
- {
- // Given
- $studentT = new StudentT($ν);
- // When
- $inverse = $studentT->inverse($p);
- // Then
- $this->assertEqualsWithDelta($x, $inverse, 0.00001);
- }
- /**
- * Generated with R qt(c(p), ν)
- * @return array [p, ν, x]
- */
- public function dataProviderForInverse(): array
- {
- return [
- [0.90, 1, 3.077684],
- [0.90, 2, 1.885618],
- [0.90, 3, 1.637744],
- [0.90, 4, 1.533206],
- [0.90, 5, 1.475884],
- [0.90, 10, 1.372184],
- [0.90, 20, 1.325341],
- [0.90, 50, 1.298714],
- [0.90, 100, 1.290075],
- [0.95, 1, 6.313752],
- [0.95, 2, 2.919986],
- [0.95, 3, 2.353363],
- [0.95, 4, 2.131847],
- [0.95, 5, 2.015048],
- [0.95, 10, 1.812461],
- [0.95, 20, 1.724718],
- [0.95, 50, 1.675905],
- [0.95, 100, 1.660234],
- [0.99, 1, 31.82052],
- [0.99, 2, 6.964557],
- [0.99, 3, 4.540703],
- [0.99, 4, 3.746947],
- [0.99, 5, 3.36493],
- [0.99, 10, 2.763769],
- [0.99, 20, 2.527977],
- [0.99, 50, 2.403272],
- [0.99, 100, 2.364217],
- [0.6, 1, 0.3249197],
- [0.6, 2, 0.2886751],
- ];
- }
- }
|