package scientific.stats.continuous
import std.math.*
import std.unittest.*
import std.unittest.testmacro.*
import scientific.numbers.*
import scientific.stats.random.*
/*
* Log of Probability density function
*/
public func pearson3LogPDF(x: Float64, k: Float64, loc!: Float64 = 0.0, scale!: Float64 = 1.0): Float64 {
let y = (x - loc) / scale
let t1 = 2.0 / k
let t2 = t1 * t1
let t3 = -t1
let res = log(abs(t1)) - gammaLog(t2) + (t2 - 1.0) * (log(t1) + log(y - t3)) - t1 * (y - t3)
return res - log(scale)
}
/*
* Probability density function
*/
public func pearson3PDF(x: Float64, k: Float64, loc!: Float64 = 0.0, scale!: Float64 = 1.0): Float64 {
let y = (x - loc) / scale
return exp(pearson3LogPDF(x, k, loc: loc, scale: scale))
}
@Test
public class TestPearson3 {
@TestCase
func testPearson3(): Unit {
@Assert(approxEqual(pearson3LogPDF(4.0, 2.0, loc: 1.0, scale: 2.0), -3.1931471805599454, atol:1e-13))
}
}