update: represent 90% confidence intervals at the end
This commit is contained in:
parent
aba44563cb
commit
0aa2cae8ab
|
@ -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.
|
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
|
## 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.53, 1.60)
|
||||||
|
|
||||||
=> lognormal(9.530291704996749, 1.596443005980748)
|
=> 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.
|
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
BIN
imgs/simple-squiggle2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 138 KiB |
|
@ -15,7 +15,10 @@ let runTransformer = (string) => {
|
||||||
let result = transformer(string, print);
|
let result = transformer(string, print);
|
||||||
print("");
|
print("");
|
||||||
console.groupEnd();
|
console.groupEnd();
|
||||||
console.log(`=> ${result}`);
|
console.log(`=> ${result[0]}`);
|
||||||
|
console.log(` ( => ${result[1]} )`);
|
||||||
|
console.log("");
|
||||||
|
|
||||||
print("-".repeat(52));
|
print("-".repeat(52));
|
||||||
console.log("");
|
console.log("");
|
||||||
};
|
};
|
||||||
|
|
35
src/index.js
35
src/index.js
|
@ -137,7 +137,6 @@ let transformerInner = (string) => {
|
||||||
let newMean = mean1 - mean2;
|
let newMean = mean1 - mean2;
|
||||||
let newStd = Math.sqrt(std1 ** 2 + std2 ** 2);
|
let newStd = Math.sqrt(std1 ** 2 + std2 ** 2);
|
||||||
return createLogarithmNode(newMean, newStd);
|
return createLogarithmNode(newMean, newStd);
|
||||||
return new math.SymbolNode("xx");
|
|
||||||
} else if (isLognormalDividedByNumber) {
|
} else if (isLognormalDividedByNumber) {
|
||||||
let lognormalFactors = getFactors(node.args[0]);
|
let lognormalFactors = getFactors(node.args[0]);
|
||||||
let mean = lognormalFactors[0];
|
let mean = lognormalFactors[0];
|
||||||
|
@ -172,8 +171,9 @@ let transformerInner = (string) => {
|
||||||
return transformed;
|
return transformed;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const normal95confidencePoint = 1.6448536269514722;
|
||||||
|
|
||||||
let from90PercentCI = (low, high) => {
|
let from90PercentCI = (low, high) => {
|
||||||
let normal95confidencePoint = 1.6448536269514722;
|
|
||||||
let logLow = Math.log(low);
|
let logLow = Math.log(low);
|
||||||
let logHigh = Math.log(high);
|
let logHigh = Math.log(high);
|
||||||
let mu = (logLow + logHigh) / 2;
|
let mu = (logLow + logHigh) / 2;
|
||||||
|
@ -181,6 +181,14 @@ let from90PercentCI = (low, high) => {
|
||||||
return [mu, sigma];
|
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) => {
|
let simplePreprocessor = (string) => {
|
||||||
// left for documentation purposes only
|
// left for documentation purposes only
|
||||||
function replacer(match, p1, p2) {
|
function replacer(match, p1, p2) {
|
||||||
|
@ -197,7 +205,7 @@ let simplePreprocessor = (string) => {
|
||||||
|
|
||||||
// simplePreprocessor("1 to 10 + 1 to 20");
|
// simplePreprocessor("1 to 10 + 1 to 20");
|
||||||
|
|
||||||
let customToStringHandler = (node, options) => {
|
let customToStringHandlerTwoDecimals = (node, options) => {
|
||||||
if (node.type == "ConstantNode") {
|
if (node.type == "ConstantNode") {
|
||||||
return node.value.toFixed(2);
|
return node.value.toFixed(2);
|
||||||
}
|
}
|
||||||
|
@ -215,23 +223,38 @@ let preprocessor = (string, print = console.log) => {
|
||||||
print(
|
print(
|
||||||
`\t= ${math
|
`\t= ${math
|
||||||
.parse(newString)
|
.parse(newString)
|
||||||
.toString({ handler: customToStringHandler })}`
|
.toString({ handler: customToStringHandlerTwoDecimals })}`
|
||||||
);
|
);
|
||||||
return newString; // abc - 12345 - #$*%
|
return newString; // abc - 12345 - #$*%
|
||||||
};
|
};
|
||||||
// preprocessor("1.2 to 10.5 * 1.1 to 20 * 1 to 2.5 * 1 to 5");
|
// 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) {
|
export function transformer(string, print = console.log) {
|
||||||
string = preprocessor(string, print);
|
string = preprocessor(string, print);
|
||||||
let transformerOutput = transformerInner(string);
|
let transformerOutput = transformerInner(string);
|
||||||
let stringNew = transformerOutput.toString();
|
let stringNew = transformerOutput.toString();
|
||||||
while (stringNew != string) {
|
while (stringNew != string) {
|
||||||
print(
|
print(
|
||||||
`\t-> ${transformerOutput.toString({ handler: customToStringHandler })}`
|
`\t-> ${transformerOutput.toString({
|
||||||
|
handler: customToStringHandlerTwoDecimals,
|
||||||
|
})}`
|
||||||
);
|
);
|
||||||
string = stringNew;
|
string = stringNew;
|
||||||
transformerOutput = transformerInner(string);
|
transformerOutput = transformerInner(string);
|
||||||
stringNew = transformerOutput.toString();
|
stringNew = transformerOutput.toString();
|
||||||
}
|
}
|
||||||
return stringNew;
|
let stringNewAs90PercentCI = transformerOutput.toString({
|
||||||
|
handler: customToStringHandlerLognormals,
|
||||||
|
});
|
||||||
|
return [stringNew, stringNewAs90PercentCI];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user