update: represent 90% confidence intervals at the end

This commit is contained in:
NunoSempere 2022-04-16 21:37:07 -04:00
parent aba44563cb
commit 0aa2cae8ab
4 changed files with 37 additions and 8 deletions

View File

@ -8,7 +8,7 @@
It may be useful for testing correctness of limited features of the full Squiggle, or for sanity-checking the validity of some Squiggle models.
![](imgs/simple-squiggle.png)
![](imgs/simple-squiggle2.png)
## Built with
@ -94,7 +94,10 @@ Model: ( 2000000000 to 20000000000 ) / ( (1800000 to 2500000) * (0.25 to 0.75) *
-> lognormal(9.53, 1.60)
=> lognormal(9.530291704996749, 1.596443005980748)
( => ~996.6270585961881 to ~190271.4039258926 )
----------------------------------------------------
```
For ease of representation, the intermediary outputs are printed only to two decimal points. But this is just a display decision; the innards of the program work with the full set of decimals.

BIN
imgs/simple-squiggle2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

View File

@ -15,7 +15,10 @@ let runTransformer = (string) => {
let result = transformer(string, print);
print("");
console.groupEnd();
console.log(`=> ${result}`);
console.log(`=> ${result[0]}`);
console.log(` ( => ${result[1]} )`);
console.log("");
print("-".repeat(52));
console.log("");
};

View File

@ -137,7 +137,6 @@ let transformerInner = (string) => {
let newMean = mean1 - mean2;
let newStd = Math.sqrt(std1 ** 2 + std2 ** 2);
return createLogarithmNode(newMean, newStd);
return new math.SymbolNode("xx");
} else if (isLognormalDividedByNumber) {
let lognormalFactors = getFactors(node.args[0]);
let mean = lognormalFactors[0];
@ -172,8 +171,9 @@ let transformerInner = (string) => {
return transformed;
};
const normal95confidencePoint = 1.6448536269514722;
let from90PercentCI = (low, high) => {
let normal95confidencePoint = 1.6448536269514722;
let logLow = Math.log(low);
let logHigh = Math.log(high);
let mu = (logLow + logHigh) / 2;
@ -181,6 +181,14 @@ let from90PercentCI = (low, high) => {
return [mu, sigma];
};
let to90PercentCI = (mu, sigma) => {
let logHigh = mu + normal95confidencePoint * sigma;
let logLow = mu - normal95confidencePoint * sigma;
let high = Math.exp(logHigh);
let low = Math.exp(logLow);
return [low, high];
};
let simplePreprocessor = (string) => {
// left for documentation purposes only
function replacer(match, p1, p2) {
@ -197,7 +205,7 @@ let simplePreprocessor = (string) => {
// simplePreprocessor("1 to 10 + 1 to 20");
let customToStringHandler = (node, options) => {
let customToStringHandlerTwoDecimals = (node, options) => {
if (node.type == "ConstantNode") {
return node.value.toFixed(2);
}
@ -215,23 +223,38 @@ let preprocessor = (string, print = console.log) => {
print(
`\t= ${math
.parse(newString)
.toString({ handler: customToStringHandler })}`
.toString({ handler: customToStringHandlerTwoDecimals })}`
);
return newString; // abc - 12345 - #$*%
};
// preprocessor("1.2 to 10.5 * 1.1 to 20 * 1 to 2.5 * 1 to 5");
let customToStringHandlerLognormals = (node, options) => {
if (isArgLognormal(node)) {
let factors = getFactors(node);
// print(node);
// print(factors);
let ninetyPercentCI = to90PercentCI(factors[0], factors[1]);
return `~${ninetyPercentCI[0]} to ~${ninetyPercentCI[1]}`;
}
};
export function transformer(string, print = console.log) {
string = preprocessor(string, print);
let transformerOutput = transformerInner(string);
let stringNew = transformerOutput.toString();
while (stringNew != string) {
print(
`\t-> ${transformerOutput.toString({ handler: customToStringHandler })}`
`\t-> ${transformerOutput.toString({
handler: customToStringHandlerTwoDecimals,
})}`
);
string = stringNew;
transformerOutput = transformerInner(string);
stringNew = transformerOutput.toString();
}
return stringNew;
let stringNewAs90PercentCI = transformerOutput.toString({
handler: customToStringHandlerLognormals,
});
return [stringNew, stringNewAs90PercentCI];
}