mirror of
https://github.com/storytold/gridcraft.git
synced 2026-11-03 08:51:30 -06:00
* Data: Analysis ToolPak two-factor Anova (with and without replication) and z-Test Builds on the ToolPak of #320. data.analysisToolPak gains three tools: Anova: Two-Factor Without Replication (rows and columns as factors, the residual as the error term), Anova: Two-Factor With Replication (samples of rowsPerSample rows, with the interaction and within-cell terms) and z-Test: Two Sample for Means (known variances, normal tails and critical values from NORM.S.DIST and NORM.S.INV). Each has a form in the Data Analysis dialog. Tests check the reports against Montgomery's hardness-testing and battery-life examples. * Data: Analysis ToolPak Fourier Analysis data.analysisToolPak gains Fourier Analysis: the discrete Fourier transform or its inverse of one row or column of 2^k values (at most 4096), by an iterative radix-2 FFT. Input cells are read as IMREAL and IMAGINARY read them, so complex text such as 3+4i works, and the results are written as COMPLEX text. Tests check known transforms (1, 2, 3, 4; a sampled cosine), the inverse round trip and the input limits. * Data: Analysis ToolPak Random Number Generation and Sampling data.analysisToolPak gains the last two of Excel's 19 tools. Random Number Generation draws uniform, normal, Bernoulli, binomial, Poisson and discrete numbers, or writes a patterned sequence, in one or more columns; binomial and Poisson draws invert tables built from BINOM.DIST and POISSON.DIST. Sampling takes every period-th value or a random sample with replacement. Both use a seeded xoshiro256** generator: the same seed repeats the numbers, and a run without one reports the seed it chose. Output is capped at 1,000,000 numbers. * Data: Analysis ToolPak two-factor Anova without replication: Labels caption names the first column With Labels ticked, Anova: Two-Factor Without Replication takes the column names from the first row and the row names from the first cell of every data row. The form's caption read "Labels in first row", so a user with column headers but no row names who ticked it would lose the first data column. The caption now reads "Labels in first row and first column", and the command's params doc says the same. A dialog test checks the caption. * Data: Analysis ToolPak docs: timestamp lines and revision history for the 19 tools docs/gaps.md (§13) and docs/target-app-parity.md (what-if and analysis) gain their Last updated line and a revision-history row for the Analysis ToolPak reaching all 19 of Excel's tools. * Data: Analysis ToolPak new tools refuse options that are not numbers Random Number Generation (from, to, mean, standardDeviation, p, lambda, step, and the whole-number options) and z-Test (hypothesizedDifference) read their options with a default for anything that did not parse, so a form value typed as "0,3" or a typo quietly ran with the default. A blank or absent option still takes the default; any other value that is not a finite number is now an error naming the option. * Data: Analysis ToolPak refuses an Alpha that is not a number alpha() took any value that did not parse as the default 0.05, so a typed "0,01" ran z-Test, both two-factor Anovas (and the existing t-tests, F-Test and single-factor Anova, which share it) at the wrong significance level without a word. A blank or absent Alpha still means 0.05; any other value that is not a finite number is now an error. * Data: Analysis ToolPak Random Number Generation form hides the count for a patterned sequence A patterned sequence takes its length from From, To, step and the two repeat counts and ignores Number of Random Numbers, so a count typed there did nothing. The form shows the count only for the random distributions, and the patterned options carry a note that the repeats set how many values are written. * Data: Analysis ToolPak Random Seed caption says a blank seed draws a new sequence Random Number Generation and random Sampling labelled the seed "blank for none", but a blank seed makes the engine choose a new one, so each run draws different numbers. The caption now reads "blank for a new sequence". * Data: Analysis ToolPak form scrolls its options in a short window The Data Analysis window cannot be resized, and the patterned Random Number Generation form (seven distribution choices and five pattern fields, each label above its box) is taller than a 600-point window, so OK ended below the window's edge. The tool's options now sit in a vertical scroll area capped to the window's height less the title, output options and buttons, which always stay in view. * Data: Analysis ToolPak docs: Forecast Sheet is no longer listed as missing docs/target-app-parity.md's what-if and analysis row still listed Forecast Sheet as missing, while data.forecastSheet is in the catalog and docs/gaps.md §13 lists it as present. The row now lists it with the other analysis tools, and today's revision-history row says so. * Data: Analysis ToolPak seed applies only where numbers are drawn A patterned sequence and periodic sampling draw nothing, but the form showed the Random Seed field for both, and Random Number Generation read the seed for every distribution: a seed left in the form that was not a whole number refused a patterned run, and a valid one was reported as the seed used. The seed field now shows only for the random distributions and random sampling, and a patterned run neither reads nor reports a seed. * Data: Analysis ToolPak Fourier Analysis keeps small parts beside large ones The cleanup after the transform zeroed every part at or below 1e-13 of the largest output, so a one-value input such as 1e14 + 1i lost its imaginary part although a transform of one value performs no arithmetic, and a small harmonic beside a large DC term was lost the same way. The cutoff is now the rounding bound of the transform itself, 8 · ε · log2(N) · Σ(|re_n| + |im_n|), divided by N for the inverse (whose outputs are divided by N): it depends on the input and the number of butterfly stages, never on the largest output, and is zero for N = 1. An input sum that overflows disables the cleanup instead of zeroing everything. Two regression tests cover the one-value case and an eight-point round trip of 1e6 + 1e-7 cos(2πn/8). * Data: Analysis ToolPak binomial and Poisson tables grow with the distribution, not the trials Random Number Generation tabulated a binomial or Poisson distribution by evaluating BINOM.DIST or POISSON.DIST through worksheet-function dispatch for every outcome from 0 upward, so a million trials with p = 1 meant 1,000,001 calls and a table of as many entries. The table is now built from one value at the mode and the recurrence pmf(k + 1) = pmf(k) · (n − k)/(k + 1) · p/(1 − p) (λ/(k + 1) for Poisson), outward in both directions: the left tail ends where its terms vanish, the right tail once the cumulative probability reaches 1 within f64 resolution, so the table is as wide as the outcomes that matter (about 23,000 entries for Binomial(1,000,000, 0.5)). p = 0 and p = 1 are exact cases with one outcome. The trials limit and the draws are unchanged. Tests check the recurrence against BINOM.DIST and POISSON.DIST to 1e-12 relative, the table width at a million trials, and that the largest inputs complete in milliseconds with the right means. --------- Co-authored-by: FredApps <FredApps@users.noreply.github.com>