triangular-test.js (8363B)
1 var vows = require('vows'); 2 var assert = require('assert'); 3 var suite = vows.describe('jStat.distribution'); 4 5 require('../env.js'); 6 7 suite.addBatch({ 8 'triangular pdf': { 9 'topic': function() { 10 return jStat; 11 }, 12 // checked against R's dtriang(x, min, mode, max, log=FALSE) from package 'mc2d': 13 // install.packages("mc2d") 14 // library("mc2d") 15 // dtriang(c(0.5, 1, 2.5, 5, 6.5, 11, 20), 1, 5, 11) 16 // dtriang(c(-20, -5, -2.5, 5, 10), -5, -5, 5) 17 // dtriang(c(-10, 0, 4, 8, 12), 0, 8, 8) 18 // dtriang(c(0, 7, 12), 5, 4, 10) 19 // dtriang(c(17, 30, 88), 23, 50, 47) 20 // dtriang(c(-17, -10, 0), -10, -10, -10) 21 22 'check pdf calculation, when a < c < b': function(jStat) { 23 var tol = 0.0000001; 24 assert.epsilon(tol, jStat.triangular.pdf(0.5, 1, 11, 5), 0); // x < a 25 assert.epsilon(tol, jStat.triangular.pdf(1, 1, 11, 5), 0); // x = a 26 assert.epsilon(tol, jStat.triangular.pdf(2.5, 1, 11, 5), 0.075); // a < x < c 27 assert.epsilon(tol, jStat.triangular.pdf(5, 1, 11, 5), 0.2); // x = c 28 assert.epsilon(tol, jStat.triangular.pdf(6.5, 1, 11, 5), 0.15); // c < x < b 29 assert.epsilon(tol, jStat.triangular.pdf(11, 1, 11, 5), 0); // x = b 30 assert.epsilon(tol, jStat.triangular.pdf(20, 1, 11, 5), 0); // b < x 31 }, 32 'check pdf calculation, when a = c < b': function(jStat) { 33 var tol = 0.0000001; 34 assert.epsilon(tol, jStat.triangular.pdf(-20, -5, 5, -5), 0); // x < a 35 assert.epsilon(tol, jStat.triangular.pdf(-5, -5, 5, -5), 0.2); // x = a = c 36 assert.epsilon(tol, jStat.triangular.pdf(-2.5, -5, 5, -5), 0.15); // a = c < x < b 37 assert.epsilon(tol, jStat.triangular.pdf(5, -5, 5, -5), 0); // x = b 38 assert.epsilon(tol, jStat.triangular.pdf(10, -5, 5, -5), 0); // b < x 39 }, 40 'check pdf calculation, when a < c = b': function(jStat) { 41 var tol = 0.0000001; 42 assert.epsilon(tol, jStat.triangular.pdf(-10, 0, 8, 8), 0); // x < a 43 assert.epsilon(tol, jStat.triangular.pdf(0, 0, 8, 8), 0); // x = a < c = b 44 assert.epsilon(tol, jStat.triangular.pdf(4, 0, 8, 8), 0.125); // a = c < x < b 45 assert.epsilon(tol, jStat.triangular.pdf(8, 0, 8, 8), 0.25); // x = c = b 46 assert.epsilon(tol, jStat.triangular.pdf(12, 0, 8, 8), 0); // b < x 47 }, 48 'check pdf calculation, when c < a': function(jStat) { 49 var tol = 0.0000001; 50 assert.isNaN(jStat.triangular.pdf(0, 5, 10, 4)); // x < a 51 assert.isNaN(jStat.triangular.pdf(7, 5, 10, 4)); // a < x < b 52 assert.isNaN(jStat.triangular.pdf(12, 5, 10, 4)); // b < x 53 }, 54 'check pdf calculation, when b < c': function(jStat) { 55 var tol = 0.0000001; 56 assert.isNaN(jStat.triangular.pdf(17, 23, 47, 50)); // x < a 57 assert.isNaN(jStat.triangular.pdf(30, 23, 47, 50)); // a < x < b 58 assert.isNaN(jStat.triangular.pdf(88, 23, 47, 50)); // b < x 59 }, 60 'check pdf calculation, when a = b': function(jStat) { 61 var tol = 0.0000001; 62 assert.isNaN(jStat.triangular.pdf(-17, -10, -10, -10)); // x < a 63 assert.isNaN(jStat.triangular.pdf(-10, -10, -10, -10)); // a = x = b 64 assert.isNaN(jStat.triangular.pdf(0, -10, -10, -10)); // b < x 65 } 66 }, 67 'triangular cdf': { 68 'topic': function() { 69 return jStat; 70 }, 71 // checked against R's ptriang(q, min=-1, mode=0, max=1, lower.tail=TRUE, log.p=FALSE) from package 'mc2d': 72 // install.packages("mc2d") 73 // library("mc2d") 74 // options(digits=10) 75 // ptriang(c(0, 1, 3, 5, 7, 11, 13), 1, 5, 11) 76 // ptriang(c(-10, -5, 0, 5, 10), -5, -5, 5) 77 // ptriang(c(-1, 0, 4, 8, 10), 0, 8, 8) 78 // ptriang(6, 5, 4, 10) 79 // ptriang(30, 23, 50, 47) 80 // ptriang(-10, -10, -10, -10) # NOTE: This returns: [1] 1, but we don't allow a = b = c! 81 'check cdf calculation, when a < c < b': function(jStat) { 82 var tol = 0.0000001; 83 assert.epsilon(tol, jStat.triangular.cdf(0, 1, 11, 5), 0); 84 assert.epsilon(tol, jStat.triangular.cdf(1, 1, 11, 5), 0); 85 assert.epsilon(tol, jStat.triangular.cdf(3, 1, 11, 5), 0.1); 86 assert.epsilon(tol, jStat.triangular.cdf(5, 1, 11, 5), 0.4); 87 assert.epsilon(tol, jStat.triangular.cdf(7, 1, 11, 5), 0.7333333333); 88 assert.epsilon(tol, jStat.triangular.cdf(11, 1, 11, 5), 1); 89 assert.epsilon(tol, jStat.triangular.cdf(13, 1, 11, 5), 1); 90 }, 91 'check cdf calculation, when a = c < b': function(jStat) { 92 var tol = 0.0000001; 93 assert.epsilon(tol, jStat.triangular.cdf(-10, -5, 5, -5), 0); 94 assert.epsilon(tol, jStat.triangular.cdf(-5, -5, 5, -5), 0); 95 assert.epsilon(tol, jStat.triangular.cdf(0, -5, 5, -5), 0.75); 96 assert.epsilon(tol, jStat.triangular.cdf(5, -5, 5, -5), 1); 97 assert.epsilon(tol, jStat.triangular.cdf(10, -5, 5, -5), 1); 98 }, 99 'check cdf calculation, when a < c = b': function(jStat) { 100 var tol = 0.0000001; 101 assert.epsilon(tol, jStat.triangular.cdf(-1, 0, 8, 8), 0); 102 assert.epsilon(tol, jStat.triangular.cdf(0, 0, 8, 8), 0); 103 assert.epsilon(tol, jStat.triangular.cdf(4, 0, 8, 8), 0.25); 104 assert.epsilon(tol, jStat.triangular.cdf(8, 0, 8, 8), 1); 105 assert.epsilon(tol, jStat.triangular.cdf(10, 0, 8, 8), 1); 106 }, 107 'check cdf calculation, when c < a': function(jStat) { 108 var tol = 0.0000001; 109 assert.isNaN(jStat.triangular.cdf(6, 5, 10, 4)); 110 }, 111 'check cdf calculation, when b < c': function(jStat) { 112 var tol = 0.0000001; 113 assert.isNaN(jStat.triangular.cdf(30, 23, 47, 50)); 114 }, 115 'check cdf calculation, when a = b': function(jStat) { 116 var tol = 0.0000001; 117 assert.isNaN(jStat.triangular.cdf(-10, -10, -10, -10)); 118 } 119 }, 120 'triangular inv': { 121 'topic': function() { 122 return jStat; 123 }, 124 // checked against R's qtriang(p, min=-1, mode=0, max=1, lower.tail=TRUE, log.p=FALSE) from package 'mc2d': 125 // install.packages("mc2d") 126 // library("mc2d") 127 // options(digits=10) 128 // qtriang(c(0, 0.25, 0.5, 0.75, 1), 1, 5, 11) 129 // qtriang(c(0, 0.5, 1), -5, -5, 5) 130 // qtriang(c(0, 0.5, 1), 0, 8, 8) 131 // qtriang(c(0, 0.5, 1), 5, 4, 10) 132 // qtriang(c(0, 0.5, 1), 23, 50, 47) 133 // qtriang(c(0, 0.5, 1), -10, -10, -10) # NOTE: This returns: [1] 1 1 1, but we don't allow a = b = c! 134 'check inv calculation, when a < c < b': function(jStat) { 135 var tol = 0.0000001; 136 assert.epsilon(tol, jStat.triangular.inv(0, 1, 11, 5), 1); 137 assert.epsilon(tol, jStat.triangular.inv(0.25, 1, 11, 5), 4.162277660); 138 assert.epsilon(tol, jStat.triangular.inv(0.5, 1, 11, 5), 5.522774425); 139 assert.epsilon(tol, jStat.triangular.inv(0.75, 1, 11, 5), 7.127016654); 140 assert.epsilon(tol, jStat.triangular.inv(1, 1, 11, 5), 11); 141 }, 142 'check inv calculation, when a = c < b': function(jStat) { 143 var tol = 0.0000001; 144 assert.epsilon(tol, jStat.triangular.inv(0, -5, 5, -5), -5); 145 assert.epsilon(tol, jStat.triangular.inv(0.5, -5, 5, -5), -2.071067812); 146 assert.epsilon(tol, jStat.triangular.inv(1, -5, 5, -5), 5); 147 }, 148 'check inv calculation, when a < c = b': function(jStat) { 149 var tol = 0.0000001; 150 assert.epsilon(tol, jStat.triangular.inv(0, 0, 8, 8), 0); 151 assert.epsilon(tol, jStat.triangular.inv(0.5, 0, 8, 8), 5.656854249); 152 assert.epsilon(tol, jStat.triangular.inv(1, 0, 8, 8), 8); 153 }, 154 'check inv calculation, when c < a': function(jStat) { 155 var tol = 0.0000001; 156 assert.isNaN(jStat.triangular.inv(0, 5, 10, 4)); 157 assert.isNaN(jStat.triangular.inv(0.5, 5, 10, 4)); 158 assert.isNaN(jStat.triangular.inv(1, 5, 10, 4)); 159 }, 160 'check inv calculation, when b < c': function(jStat) { 161 var tol = 0.0000001; 162 assert.isNaN(jStat.triangular.inv(0, 23, 47, 50)); 163 assert.isNaN(jStat.triangular.inv(0.5, 23, 47, 50)); 164 assert.isNaN(jStat.triangular.inv(1, 23, 47, 50)); 165 }, 166 'check inv calculation, when a = b': function(jStat) { 167 var tol = 0.0000001; 168 assert.isNaN(jStat.triangular.inv(0, -10, -10, -10)); 169 assert.isNaN(jStat.triangular.inv(0.5, -10, -10, -10)); 170 assert.isNaN(jStat.triangular.inv(1, -10, -10, -10)); 171 } 172 } 173 }); 174 175 suite.export(module);