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. | ||||
| 
 | ||||
|  | ||||
|  | ||||
| 
 | ||||
| ## 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
									
								
							
							
						
						
									
										
											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); | ||||
|   print(""); | ||||
|   console.groupEnd(); | ||||
|   console.log(`=> ${result}`); | ||||
|   console.log(`=> ${result[0]}`); | ||||
|   console.log(`   ( => ${result[1]} )`); | ||||
|   console.log(""); | ||||
| 
 | ||||
|   print("-".repeat(52)); | ||||
|   console.log(""); | ||||
| }; | ||||
|  |  | |||
							
								
								
									
										35
									
								
								src/index.js
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								src/index.js
									
									
									
									
									
								
							|  | @ -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]; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user