normal = require( 'https://cdn.jsdelivr.net/gh/stdlib-js/stats-base-dists-normal@umd/browser.js' )
student = require( 'https://cdn.jsdelivr.net/gh/stdlib-js/stats-base-dists-t@umd/browser.js' )
gamma = require( 'https://cdn.jsdelivr.net/gh/stdlib-js/stats-base-dists-gamma@umd/browser.js' )
trigamma = require( 'https://cdn.jsdelivr.net/gh/stdlib-js/math-base-special-trigamma@umd/browser.js' )
// Location-shift
mu_D = math.sqrt(2 * Delta / N)
// Scale-shift
function KL_sigma(s) {
return N * (s**2 - 1 - 2 * math.log(s)) / 2;
}
function dKL_sigma(s) {
return (s - 1 / s) * N;
}
sigma_D = newtonRaphson(KL_sigma, dKL_sigma, Delta, 1.1, 1, 100, 1e-5, 100)
// Skewness
function logKL_gamma(la) {
let a = math.exp(la);
let c1 = (math.log(2 * math.pi) + 1) / 2;
let c2 = gamma.entropy(a, math.sqrt(a));
return math.log(N) + math.log(c1 - c2);
}
function dlogKL_gamma(la) {
let a = math.exp(la);
const c1 = (math.log(2 * math.pi) + 1) / 2;
let c2 = gamma.entropy(a, math.sqrt(a));
let c3 = 1 / (2 * a) - 1;
let c4 = (1 - a) * trigamma(a);
return a * (c3 - c4) / (c1 - c2);
}
log_Delta = math.log(Delta)
log_alpha = newtonRaphson(logKL_gamma, dlogKL_gamma, log_Delta, -log_Delta, -10, 10, 1e-5, 100)
alpha_D = math.exp(log_alpha)
// Kurtosis
function KL_t(v) {
let c1 = math.log(2 * math.pi) / 2;
let c2 = v / (2 * (v - 2));
let c3 = student.entropy(v);
return N * (c1 + c2 - c3);
}
function dKL_t(v) {
let c1 = (v - 2)**(-2);
let c2 = 1 / (2 * v);
let c3 = (trigamma((v + 1) / 2) - trigamma(v / 2)) * (v + 1) / 4;
return -N * (c1 + c2 + c3);
}
nu_D = newtonRaphson(KL_t, dKL_t, Delta, 3, 2, 100, 1e-5, 100)
// Compute densities
pts2 = 201
dat3 = Array(pts2).fill().map((element, index) => {
let x = - scale + index * 2 * scale / (pts2 - 1);
let p = normal.pdf(x,0,1);
let q = normal.pdf(x, mu_D, 1);
let r = normal.pdf(x,0, sigma_D);
let s = gamma.pdf(x + math.sqrt(alpha_D), alpha_D, math.sqrt(alpha_D));
let t = student.pdf(x, nu_D);
return ({
x: x,
p: p,
q: q,
r: r,
s: s,
t: t
})
})
colormap = [{v:"q",c:"blue"},{v:"r",c:"green"},{v:"s",c:"orange"},{v:"t",c:"red"}]
function density_plot(v, c) {
return Plot.plot({
height: 200,
width: 400,
y: {
grid: false,
axis: false,
domain: [0, 0.45]
},
x: {
label: null
},
marks: [
Plot.lineY(dat3, {x: "x", y: "p", stroke: "black"}),
Plot.areaY(dat3, {x: "x", y: v, fill: c, fillOpacity: 0.5}),
Plot.lineY(dat3, {x: "x", y: v, stroke: c})
]
});
}
plot_list = Object.values(colormap).map(x => density_plot(x.v, x.c))