Skip to content

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 21:48
cca89f4

Added

  • Factorial makes Taguchi orthogonal arrays. A new design type takes 2 to 12 numeric or
    two-level categorical factors and makes the smallest standard array with a column for each, as
    generate_design(design_type="taguchi") chooses it: the L4, L8, L12 or L16 with every numeric
    factor at two levels or, with the new levels setting at 3, the L9, L18, L27 or L36 with each
    numeric factor at its low, centre and high values and each categorical factor at its two labels.
    The design's facts name the array ("Taguchi L12 (2^11): 12 runs, main effects"). A two-level
    array is analysed for its main effects and a three-level one for the main effects and each
    numeric factor's square, and Learn says once that the interactions are aliased with them. Plan
    compares the array, at three levels for a model with squares, and the Python panels give each
    numeric factor its three levels. In the design catalog, the library's L4, L8, L9 and L12 and 13
    published arrays now open as the app makes them.

  • Factorial measures up to five responses, and finds the settings that balance them. The
    brief lists each response in a row of its own, with its units and its goal: maximise, minimise,
    hit a target, or learn. The first response sizes the design, so the brief asks its typical value,
    noise and smallest change worth finding for it alone. The run sheet and the workbook have a
    column per response; a run is complete once every response has its result, and each response is
    fitted to the runs that have its result. Practice results come from one process per response,
    each derived from the scenario with its own coefficients and noise. Learn has a tab per response,
    each with its own model, analysis and best settings. With two or more responses aimed at a goal,
    Learn balances them with the library's desirability (optimize_responses(method="desirability")):
    a table of each response's acceptable range, importance and shape to edit, the settings with the
    best overall desirability, each response's prediction, 95% prediction interval and desirability
    there, the response that holds the overall desirability down most, the leverage there, and an
    overlay of where every response is acceptable over the two factors that move them most.
    Confirmation runs at the balanced settings are judged response by response. The Python panels
    and the notebook reproduce each response's analysis and the balance (api_balance). Studies
    saved before, workbooks, links and catalog campaigns open unchanged, as studies of one response.

  • Factorial finds the best settings for the response's goal. Once the model is fitted, Learn
    says where to run the process to maximise, minimise or hit the target the brief names: the
    settings in the factors' own units, each categorical factor at its better level, found on the
    fitted model inside the ranges and the limits on the settings with optimize_responses. Beside
    them are the predicted response with its 95% confidence interval for the mean and its 95%
    prediction interval for one new run, the leverage there against the runs' (a warning when the
    prediction leans on the model beyond the runs), which factors are at an end of their range and
    the way a next study could move it along the steepest ascent, the limits the settings are on,
    and bars that show how much each factor moves the prediction, so the reader sees which to hold
    tightly. The response surface is drawn through the best settings, with a star on them. A button
    adds three confirmation runs at the best settings to the run sheet, marked in a column of their
    own and never fitted; once their results are in, Learn says whether their average falls inside
    the prediction interval for an average of three runs. The "Show the Python code" panel and the
    notebook reproduce the search with the library (api_best_settings).

  • Small composite designs. A CCD with cube="fractional" may now sit on a cube below
    resolution V. The default half fraction must still leave the full quadratic model estimable,
    which it does for three factors (Hartley's small composite design, 4 + 6 runs). A cube given by
    generators or resolution that aliases two-factor interactions in pairs is built with a
    warning, for a model with one interaction of each pair. metadata["full_quadratic_estimable"]
    and metadata["aliased_interactions"] say which. The reference catalogue checks Schmidt and
    Launsby's composite-design run counts and Núñez Ares and Goos's small composite designs with it.

  • Multistratum analysis of variance. multistratum_anova(runs, model, strata, response=None)
    analyses a split-plot, strip-plot or other design with several sizes of unit, as R's
    aov(y ~ model + Error(strata)) does. The block structure is given as error terms ("rep/plot",
    "S:T", "row + column"). Each treatment term is estimated in the stratum its contrasts fall in
    and tested on that stratum's residual. A term of a design that is not orthogonal, such as the
    treatments of an incomplete block design, gets a row in each stratum it falls in. Without a
    response it gives the skeleton analysis of variance, the sources and degrees of freedom a layout
    will have. The reference catalogue checks 41 more items with it: NIST's three electroplating
    split-plot layouts and the implant-anneal strip plot, their degrees of freedom, terms per stratum
    and whole-plot units.

  • Least-squares means and their multiple comparisons. least_squares_means(runs, "y ~ treatment + block", factor) gives each level's adjusted mean: the model's prediction averaged with equal
    weight over the other factors' levels, as an incomplete block design or a Youden square needs.
    Pairs are compared by Tukey's studentized range (Tukey-Kramer), by Dunnett's multivariate t
    against a control (Comparisons("dunnett", control=...)), or unadjusted (Fisher's LSD), with adjusted p-values, simultaneous
    intervals, connecting letters, and the confidence each interval has alone and the family has
    together. at= compares the levels within one level of another factor, on the error of the
    whole model, and C(x) in the formula takes a numeric column as levels. The reference catalogue checks 33 more printed numbers with it: Minitab's Tukey
    comparisons of Montgomery's catalyst design (its p-values agree; its intervals use a
    studentized range point 0.0014 larger than the exact one), Box, Hunter and Hunter's Youden-square
    adjusted averages, Dunnett's d0.05(3,16), Fisher's family confidence and JMP's connecting letters.

  • Classical tests and percentage points (process_improve.univariate). f_value,
    chi2_value, z_value, studentized_range_value and dunnett_value give the percentage
    points of the F, chi-squared, normal, studentized-range and Dunnett distributions, a cumulative
    probability first as t_value takes it; Dunnett's two-sided and one-sided critical values are
    worked by numerical integration and agree with SciPy's multivariate t. ttest_one_sample tests
    a mean against a stated value, ztest a mean or a difference of means with the standard
    deviation known, rank_sum_test two groups by Wilcoxon's rank sum (normal approximation and
    exact level), randomization_test two groups or pairs against every arrangement of the labels
    or signs (sampled, with a random_state, past max_arrangements, and with a mid-p value that
    counts ties as half), and autocorrelation a record in time order. The reference catalogue
    checks 76 printed numbers with them: the F, chi-squared and Dunnett points of Montgomery's and
    Schmidt and Launsby's tables, and the tests of Box, Hunter and Hunter's chapters 2 and 3 and the
    PID book's randomization test. Three disagree, each explained (the book's rounded standard
    errors, and a table value printed 5.31 for 5.318).

  • Random effects (process_improve.experiments). variance_components(runs, "y ~ operator", random=[...]) fits random intercepts ("a", "a:b", or "b(a)" for a factor nested in
    another) beside the formula's sum-coded fixed factors by REML, and reports the components with their share of the total, standard errors and
    intervals (chi-squared for the error variance), the restricted log-likelihood, the fixed
    effects with their Satterthwaite F tests, the best linear unbiased predictions of the random
    effects, and the R-square JMP reports for a REML fit. bounded=False lets a component go below
    zero, as JMP's unbounded REML does; in a balanced design that gives the analysis-of-variance
    estimates. expected_mean_squares derives the expected mean squares of a balanced crossed or
    nested design (a nested factor named as "batch(supplier)") under the restricted or the
    unrestricted mixed model, a reduced model's too, with
    each term's degrees of freedom and the term that tests it, and intraclass_correlation_interval
    gives the exact interval of a one-way random model. The reference catalogue checks 98 more of
    Montgomery's numbers with them: JMP's unbounded gauge study (resolving 10 recorded
    disagreements), JMP's REML R-squares of seven studies, and Minitab's and Montgomery's
    expected-mean-square tables and error terms of the gauge study, the purity and the assembly
    experiments.

  • Run orders robust to a time trend. run_order_trends measures how far each term of a
    model is confounded with the linear, quadratic and cubic time trends of a run order: the cosine
    and angle of each term's column with each trend, their mean and largest by class of term (main
    effects, interactions, quadratic effects), the time-count dot products and the number of level
    changes. trend_robust_run_order searches, by an iterated local search with a random_state,
    for an order whose main effects, and then second-order terms, are orthogonal to the trends of
    lowest degree first; time_trends gives the orthogonal polynomial trends. The reference
    catalogue checks 154 printed numbers of Núñez Ares and Goos (2019) with it, every table of
    cosines of their run orders; two disagree, each explained (a transposed digit in the text, and
    an angle taken from a rounded cosine).

  • The canonical forms of a fitted quadratic. optimize_responses(..., method="canonical_analysis")
    now also returns the surface in Box and Draper's B canonical form (b_canonical), the form a ridge is
    read in. It is rotated to the eigenvectors, with its origin where the response stops changing across
    the ridge and one linear term along it. Where a stationary point exists, it also returns each
    canonical variable W = v'(x - x*) (canonical_axes). The reference catalogue checks 26 more items
    with these and the existing stationary point and steepest-ascent path: NIST's chemical CCD
    (stationary point, eigenvalues, eigenvectors with their signs, canonical axes) and its first-order
    steepest-ascent step, an EFI wind-turbine optimum, Montgomery's tool-life maximum and Box, Hunter and
    Hunter's ridge. Several printed values carry recorded disagreements: NIST's stationary point from
    rounded coefficients, two NIST canonical-axis constants that do not follow from the page's own sums,
    and BHH's B canonical numbers, which do not follow from their equation 15.19.

  • The overall F test and likelihood criteria in analyze_experiment's model summary.
    model_summary now carries f_statistic and f_p_value (the model against the intercept
    alone; against zero, on uncorrected sums of squares, for a model without an intercept whose
    columns do not span one, as R's summary does), log_likelihood, aic and bic (counting the
    error variance as a parameter, as R's AIC and the library's model selection do) and
    aic_step, n ln(RSS/n) + 2p, as R's step prints it. The reference catalogue reads them,
    with new fit kinds for residual quartiles and the uncorrected F, and checks 94 more of the NIST
    e-Handbook's printed numbers: overall F tests and their p-values, lack-of-fit and pure-error
    sums of squares, residual quartiles, R's stepwise AICs, Dataplot's model F tests and the
    sequential sums of squares of a central composite design. Four disagree, each explained
    (Dataplot truncates two F values, and a p-value no pair of degrees of freedom gives).

  • The information matrix and exact region values in evaluate_design. The new metric
    information_matrix gives X'X, its determinant, the D-, A- and E-criteria, the rank, the residual
    degrees of freedom, the inverse and each coefficient's variance; estimable_interactions counts
    the omitted two-factor interactions a design estimates beside its model. integration="exact"
    works out the average prediction variance over the cube by Gauss-Legendre quadrature,
    trace((X'X)^-1 W), in place of a sample; max_search="optimize" climbs from the sample's largest
    points by a compass search, so a maximum inside a face or an edge is not missed.

  • evaluate_projections evaluates a design on every projection onto a number of its factors,
    or a number from each of several groups (quantitative and categorical, say), and reports the
    fraction that estimate the model (the projection estimation capacity) and the metrics' averages.

  • design_measures.design_structure counts what a design's runs are made of: levels and how
    often each factor takes each one, middle-level zeros of the main effects and of the products of two
    three-level factors (n0ME, n0IE), centre runs, mirror-image pairs, replicated runs and blocks.

  • allocate_runs tabulates every whole-run split of a budget between two levels that differ
    in noise or cost, with each split's variance and efficiency, and finds the most precise one.

  • Reference catalogue: design checks. New check kinds read a design's structure
    (design_structure), its projections (projections) and its projectivity (design_measure);
    a printed vector or matrix is compared entry by entry with X, X'X, X'y or (X'X)^-1; a design
    metric's table of terms can be picked by a regular expression and reduced; and a check may name
    a design generate_omars chooses; library_text compares a label the library gives word for
    word; and desirability_optimum runs the library's desirability search on the fitted responses.
    With these, 565 printed numbers that were set aside by hand in Núñez Ares and Goos (2020), Núñez
    Ares et al. (2023), Goos (2025), Jones and Nachtsheim (2013) and the PID book are now checked.

  • Generalized linear models in analyze_experiment. analysis_type="glm" fits a response that
    is a count (family="poisson"), a number of successes out of trials ("binomial") or a
    positive amount whose spread grows with its size ("gamma"), as well as "gaussian" and
    "inverse_gaussian", with the family's canonical link or another (link=). It reports Wald
    tests and intervals for the coefficients, odds or rate ratios under a logit or log link, the
    log-likelihood, deviance and Pearson statistic, goodness-of-fit tests (Hosmer and Lemeshow's for
    a binomial response), and each run's fitted mean with an interval carried through the link.
    dispersion= and information= choose between R's conventions (the default) and SAS GENMOD's.
    The reference catalogue checks 111 printed numbers of Montgomery's section 15.1 with it: the
    coupon logistic regression as Minitab prints it, and the grill-defect Poisson and worsted-yarn
    gamma models as GENMOD does; all agree.

  • Studentized residuals. analyze_experiment's "residual_diagnostics" now lists each run's
    studentized_residuals (the residual over its own standard error, s √(1 − h), Design-Expert's
    "Student Residual") and externally_studentized_residuals (with s from the fit without that run,
    R's rstudent, Design-Expert's "Outlier t"). The reference catalogue checks both against the 80
    runs Design-Expert lists in Montgomery's Figures 3.12, 4.2 and 5.10; all agree.

  • Subject-matter topics in the reference catalogue. Every experiment and design now lists one
    or two topics: what it is about (semiconductors, food and beverages, ...), as opposed to how it
    is designed. reference_topics() returns the vocabulary of 30 topics, each with its nearest UN
    ISIC Rev. 4 industries and OECD FORD field of research, and reference_experiments and
    reference_designs take topic= to select by it. Of the 1039 entries, 583 state an application;
    the other 456 (mostly tables of designs) are "general".

  • The reference catalogue holds chapters 1 to 15 and the appendix of Montgomery, Design and
    Analysis of Experiments
    (8th edition).
    Chapters 1 and 2: the golf 2^2 factorial and its three effects; the
    Portland cement mortar two-sample t-test with Minitab's and JMP's output, its confidence interval
    and Minitab's power table; the nerve and muscle fluorescence compared by Welch's test; the
    hardness tips' paired t-test beside the pooled test that ignores the specimens; the run counts of
    the golf factorials and of a 4 x 8 x 6 x 5 x 4 x 3 x 7 web page factorial; and the half fraction
    of Figure 1.8, read from its circled corners and compared run for run with the library's. Chapter
    3: the plasma etching one-way analysis of variance by hand and in Design-Expert, Minitab and JMP,
    with its residuals and case statistics, contrasts, Scheffé's, Tukey's, Fisher's and Dunnett's
    comparisons, Bartlett's variances and the Kruskal-Wallis ranks; the peak discharge data with the
    modified Levene test and a square root transformation; dark and milk chocolate; end-aisle
    displays; the pot noise of aluminum smelting analysed as ln(s); and the looms as a random factor,
    with JMP's REML variance components, their standard errors, covariances and intervals. Chapter 4:
    the vascular graft randomized complete block design in Design-Expert and JMP, with the blocks
    fixed and random, and with one value missing; the rocket propellant Latin and Graeco-Latin
    squares; and the catalyst balanced incomplete block design, with its adjusted and unadjusted sums
    of squares, Minitab's output, and the combined intra- and interblock estimates, which the
    library's REML fit with random blocks reproduces. Chapter 5: the effects of Figures 5.1 and 5.2;
    the battery life 3^2 factorial by hand and in Design-Expert and JMP, with all 36 rows of case
    statistics, Tukey's comparisons at 70 °F, the analysis without interaction, and Design-Expert's
    reduced cubic response curves in coded and actual temperature; the impurity data with one
    observation per cell and Tukey's test for nonadditivity; the soft drink bottling 3 x 2 x 2
    factorial with every total and sum of squares; the tool life 3^2 as a categorical analysis and as
    JMP's second-order and expanded models, with the prediction profiler's optimum; and the radar
    detection factorial with the operators as fixed and as random blocks (JMP's REML table, its -2
    log-likelihood included), then run in a 6 x 6 Latin square. Chapter 6: the chemical process 2^2
    with its residuals and its equation in natural units; the plasma etch 2^3 with Design-Expert's
    full and reduced models, their 16 rows of case statistics, equations in actual factors and lack of
    fit, and the ranges of Figure 6.8; the filtration 2^4 in a single replicate with its projection on
    A, C and D, Lenth's method, JMP's screening platform (estimates, pseudo t-ratios and p-values) and
    fitted model with its lack of fit and profiler, and again with four centre runs and the test for
    pure quadratic curvature; the drill in ln y; the aircraft panels' dispersion effects; the oxide
    thickness with duplicate measurements, its ln(s²) model and Design-Expert's tables; the credit
    card mailing in JMP; the optimality of the 2^2; and the circuit fitted in coded and in engineering
    units. Chapter 7: the chemical process in three blocks; the filtration 2^4 in two blocks with ABCD
    confounded, and unblocked with a shift; the 2^5 in four blocks and the 2^6 in eight; Table 7.9's
    blocking arrangements, compared with the library's blocking and with the products of the effects
    each row chooses; and the plasma etch in two replicates partially confounded. Chapter 8: the half
    fractions of the 2^3; the filtration 2^(4-1) and its alternate fraction, their sums and
    differences the effects of the full 2^4; the integrated circuit 2^(5-1); the 2^(6-2)'s
    construction, alias structure, alternate fraction and two blocks; the injection molding 2^(6-2)
    with its dispersion effects (Table 8.12's sign columns included); the three 2^(7-2) designs
    compared by word length pattern; Table 8.14's 29 designs, each compared with the library's
    fraction for its resolution; the 2^(7-3); the CNC machine 2^(8-3) in four blocks, analysed in ln
    s; the alias matrix of the 2^(3-1); the 2^(7-4), the 2^(6-3) and the fold over on D; the eye focus
    2^(7-4) and its full fold over; the Plackett-Burman designs of 12, 20, 24, 28 and 36 runs written
    from Table 8.23, compared with the library's; a 20-run Plackett-Burman design in 12 factors with
    JMP's alias matrix (858 entries) and its initial and final stepwise regression tables; the 2^(4-1)
    by fold over; Table 8.30; the spin coater's single-factor and partial fold overs, with their
    coefficients' standard errors in units of σ; the smallest resolution V fractions; and the
    supersaturated design of Table 8.34. Chapter 9: the tool life interaction split into its linear
    and quadratic components and into its AB and AB² components of interaction; the syrup loss 3^3 run
    twice, its analysis of variance, the quadratic models of each nozzle in coded and natural units,
    and the four components of its three-factor interaction; the 3^2, 3^3 and 3^4 in three and nine
    blocks, the 3^7 in 27 blocks, the one-third fractions of the 3^3, the 3^(4-1) and the 3^(4-2) with
    its 32 aliases; two- and four-level factors in the 2^3 and 2^4; the five Hall designs and the
    nonregular no-confounding designs for 6 to 14 factors in 16 runs, with Table 9.23's E(s²),
    confounded pairs and trace(AA'), and the spin coater on the six-factor design with JMP's stepwise
    table; and the optimal designs of section 9.6: two categorical factors in 9 and 12 runs, six
    factors in four days of three runs, the 18- and 12-run resolution IV designs with all 274 alias
    weights, the 22- and 38-run resolution V designs, and three mixed-level D-optimal designs with
    JMP's relative variances. Chapter 10: the viscosity regression with its X'X, X'y and (X'X)^-1,
    Table 10.3's residuals, leverages, Cook's distances and R-student, Minitab's output, the extra sum
    of squares of the feed rate, a confidence interval on a coefficient and PRESS; the 2^3 with four
    centre runs fitted by regression, again with run 8 missing and again at the levels reached; a
    2^(4-1) augmented to de-alias AB from CD, by one run or by four in a block of their own; and the
    prediction interval on Example 8.1's confirmation run. Chapter 11: the yield's first-order model,
    its interaction and curvature checks and Table 11.3's path of steepest ascent; the central
    composite design of Example 11.2 with all of Design-Expert's Table 11.7 (sequential sums of
    squares, lack-of-fit tests, model summaries, the case statistics and the equation in actual
    factors), the stationary point, the eigenvalues and eigenvectors of the canonical analysis, the
    viscosity and molecular weight models and the constrained and desirability solutions; the
    Box-Behnken, small composite and hybrid designs; orthogonal blocking of a CCD and Table 11.11's
    nine blocked designs; the inscribed CCD, D-optimal and modified D-optimal designs of the adhesive's
    constrained region; JMP's 16-run D- and I-optimal designs in four factors, their relative
    variances and maximum prediction variances; the definitive screening designs of Figure 11.32 for
    4 to 12 factors, read from the page image, and the conference matrix of order 6; the CFD plume
    experiment; the yarn elongation simplex lattice, the augmented simplex lattice and the paint
    formulation fitted in pseudocomponents with Design-Expert's Tables 11.21 and 11.22; and the EVOP
    of Example 11.7, its averages, sums, differences and effects cycle by cycle. Chapter 12: the leaf
    spring crossed array with its mean and ln(s²) models; the connector pull-off force crossed array,
    its inner array matched to the stored L9; the filtration 2^4 with temperature a noise factor and
    the semiconductor combined array of Example 12.2, each with its response, mean and variance
    models; the 30-run resolution V design, the 23-run D-optimal combined array and the 18-run
    saturated design of section 12.5; and the alias weights of Problem 12.10's 3^(4-2). Chapter 13: the
    measurement systems capability study as a two-factor random model and, with the operators fixed,
    as restricted and unrestricted mixed models, in Minitab and JMP, with the analysis-of-variance and
    REML variance components, their standard errors, covariances and intervals, and the reduced model;
    and the pressure drop three-factor mixed model with its exact, approximate (Satterthwaite) and
    synthesized F tests, restricted and unrestricted, and the Satterthwaite and modified large-sample
    intervals on a variance component. Chapter 14: the purity of batches nested within suppliers, by hand,
    in Minitab and in JMP, with its residuals and, analysed wrongly, as crossed; the assembly times
    of operators nested within layouts and crossed with fixtures, under the restricted and
    unrestricted models; the tensile strength split-plot, with its analysis of variance, JMP's REML
    table and the library's split-plot analysis, and analysed wrongly as completely randomized;
    the plasma etching 2^(5-1) in eight whole plots; and the split-plot layouts of Figure 14.7 and
    Table 14.24. Chapter 15: the Box-Cox curve SSE(λ) of the peak discharge data and Design-Expert's
    choice of λ; the coupon redemption, grill defect and worsted yarn examples, their least-squares
    analyses of transformed responses checked and their generalized linear models recorded; the
    battery data with proportional cell counts; the fibre strength analysis of covariance, by hand
    and in Minitab, with its adjusted means; a 2^3 with a covariate in JMP, with common and with
    separate slopes; and a D-optimal design that chooses raw material samples by two covariates,
    with its relative variances and alias matrix. The appendix: Table X's 26 fractions of 3 to 15
    factors in 4 to 64 runs, each with its fraction, run count, resolution, generators, defining
    relation, every alias chain and the effects confounded with its blocks; its tables of the
    normal, t, chi-square, F, studentized range and Dunnett distributions and of orthogonal
    polynomials are screened against scipy, and their misprints listed with them. The data of the
    184 problems that have data are kept as data, since the book prints no answers; the totals, means, ranges, standard
    deviations, response rates and transformations some of their tables print are checked, and the two
    models Problem 9.6 prints. 11150 printed numbers, 10382 checked. 492 are recorded as not
    reproducing, each explained: the book's rounding (test statistics, P-values, fitted values and
    residuals worked from rounded values, a Tukey critical difference from a table's rounded point,
    three standard deviations in each of Tables 3.7 and P8.3, dispersion statistics from rounded
    standard deviations, F ratios divided by a rounded error mean square, Figure 8.22's averages cut
    off rather than rounded, Table 9.2's P-values worked from F rounded to two decimals and sums of
    squares cut rather than rounded, and chapter 10's confidence and prediction limits worked with t
    rounded to two decimals, a partial F from rounded sums of squares, and Example 10.4's (X'X)^-1
    inverted from X'X rounded to four decimals, and in chapter 11 P-values worked from F rounded, the
    path of steepest ascent stepped by Δx2 rounded to 0.42 and 2°F, the w equations' coefficients and
    a determinant cut rather than rounded, chapter 12's variance models worked from coefficients
    rounded to two decimals, chapter 13's variance components worked from rounded mean squares and
    its intervals from rounded chi-square and F points, chapter 14's F ratios of rounded mean
    squares, and chapter 15's Box-Cox minimum and limits read off a graph), misprints (sums of squares and mean squares, an F of
    3.95 for 3.93, an error degrees of freedom of 19 for 20, a residual of 26.00 for −6.00, a dropped
    sign in two coefficients or limits, a range of 59 for 54, Table 6.28's analysis of variance copied
    from Table 6.26, one row of Table 7.9 that prints the interactions of other generators, a column
    of Table 8.12 headed BD = CE for BD = CF, a 0 for 0.2 in Table 8.26's alias matrix, three signs of
    the 12-run Plackett-Burman design's alias weights, Figure 8.25's axis taken from Figure 8.26, and
    transformed values in Tables P8.13 and P8.14, one sign in each of the Hall II, III and IV designs,
    whose Hall II also drops a run at a page break, a block of Figure 9.8 labelled (1,6) for (1,0),
    the components ABC and ABC² of the syrup loss data exchanged, nozzle 2's models fitted to data
    other than Table 9.1's, the Hall columns named for Tables 9.21 and 9.22, an E(s²) of 14.20 for
    14.22, two counts of Table 9.35's levels exchanged, Example 10.3's coefficients, which are not the
    product of the (X'X)^-1 and X'y it prints, and an entry of Example 10.4's (X'X)^-1 printed 4.37851
    for 4.37351; in chapter 11 the characteristic equation λ² + 2.3788λ + 1.3639 = 0 for
    λ² + 2.3775λ + 1.3624, the temperatures 179 and 181 of steps 11 and 12 of the path for 177 and
    179, Table 11.11's N = 80 for 90, Table 11.22's mean square 1465.66 for 1465.55, the EVOP's
    change in mean of 0.02 for −0.02 and 225°F for 255°F, and the desirability solutions, whose D and
    predictions do not match their printed settings; in chapter 12 the outer array of Table 12.2,
    whose sixth column repeats the fifth, Problem 12.9's first mean and variance, 57.75 and 121.19
    for 57.25 and 161.58, and the alias expression of β11 in Problem 12.10, which leaves out +β34;
    in chapter 13 a P-value of 0.01 for 0.00007 in Table 13.10; in chapter 14 sums of squares of
    82.80, 71.91 and 65.84 for 82.79, 71.92 and 65.83 in Table 14.12, P-values of 0.01 for 0.002 and
    0.0002, the degrees of freedom of the operators' two F tests, and Table 14.23's coefficients,
    fitted with 38.03 where Table 14.22 prints 38.08; in chapter 15 the least-squares columns of
    Tables 15.3 and 15.5, which are those of models fitted to slightly other data than the book
    prints, a machine total of 184 for 180, two signs of Table 15.24's alias matrix, and Table
    15.21's asterisks, which mark five samples twice; in the appendix Table X's defining relation
    of design (r), CDFGI for CDFGJ, and the heading of design (z), 5 factors for 15), Design-Expert's Box-Cox λ and its
    interval, which is symmetric about λ where the library's likelihood-ratio interval is not,
    JMP's REML estimates in chapter 13,
    which leave a variance component negative where the library's REML, like lme4, keeps every
    component at or above zero (the analysis-of-variance estimates, JMP's standard errors and its
    covariances all reproduce from the library's mean squares),
    Design-Expert's equations in actual temperature, whose linear coefficients add the
    quadratic ones, Minitab's Tukey intervals, which use a studentized range point of 4.0504 where the
    library's, like R's, is 4.0461, a residual mean square of "about 109" that no model of the data
    gives, two rows of Table 7.9 that confound one more two-factor interaction than the library's
    blocking does, and three numbers where the library's design differs from the book's: its 24-run
    Plackett-Burman design is the 12-run one doubled (11 of its three-column products completely
    aliased) rather than the cyclic design of Table 8.23, its 36-run design is of another class,
    its 16-run fraction for 12 factors has one more word of length three than that of Tables 8.14 and X, and
    Figure 11.32's 12-factor definitive screening design is not a conference-matrix design like the
    library's (its main effects are correlated); those for 4, 6, 8 and 10 factors are the library's
    with their columns reordered and their signs changed.

    New checks: t_test compares two groups of runs with the library's pooled, Welch and paired
    t-tests; contrast weighs a fit's level means (its value, standard error, t, F, sum of squares,
    p-value and 95% interval); tukey reads the library's tukey_hsd; a fit can take a transform;
    variance_component takes fixed factors, coded to sum to zero, and reads the REML fit's variance
    ratios, percentages, standard errors, covariances, Wald intervals, the mean's t on Satterthwaite's
    degrees of freedom, fixed-effect F tests and level effects, and its fixed factors may include
    their interactions; nonadditivity is Tukey's one-degree-of-freedom test, worked as the test of
    the additive model's squared fitted values added as a regressor; a prediction can be read as the
    half-width of its interval, as a prediction profiler prints it. Checks can also read a run's leverage,
    Cook's distance and studentized residuals, a sum, a median, a minimum and a maximum, the adequate
    precision, and a percentage point of the t distribution (t_value). A term written as the library
    names it, such as C(power)[160.0], is read as that row of the coefficients. For chapters 6 and 7:
    nested_test tests a model against a fuller one fitted to the same runs (Design-Expert's lack of
    fit against pure error, or a group of terms); lenth_t and lenth_p read an effect's pseudo
    t-ratio on Lenth's PSE and its p-value on m/3 degrees of freedom, as JMP's screening platform
    prints them; percent_of_total, curvature (the library's test for pure quadratic curvature),
    max_r_squared, a run's range, column_correlation and generalized_interactions (the effects
    confounded with blocks, as the products of those chosen to generate them); fraction_runs takes
    several generators, and a path into a library result may be a list of keys. For chapter 8: a
    fraction's word_lengths, whether an effect is clear of main effects and two-factor
    interactions, and minimum_aberration (its word lengths against those of the fraction the library
    chooses for its resolution); product_column, a printed column of signs as the product of the
    factor columns it is headed with; same_projections, a two-level design matched to the library's
    by its one-, two- and three-column J-characteristics, without searching relabellings;
    distinct_runs in a projection; unit_std_error, a coefficient's standard error in units of σ;
    the per-run statistics sqrt, arcsin_sqrt and Freeman and Tukey's freeman_tukey_sqrt and
    freeman_tukey_arcsin; and data_rounding on a nested_test and a residual sum of squares or mean
    square, holding a number fitted to unrounded responses to the first-order bound of what the
    printed responses' rounding moves. A design's evaluation and a nested test's fits are made once
    however many of their numbers are read. For chapter 9: component_ss, a 3^k component of
    interaction's sum of squares and group totals, the runs grouped by its defining contrast
    x1 + 2x2 + ... (mod 3); component_blocks and component_fraction, blocks and fractions made by
    such contrasts; component_product and component_relation, generalized interactions, aliases,
    defining relations and resolutions worked modulo 3; component_values and mod3_sum, the
    arithmetic of treatment combinations; projection, a design printed as columns of another entry's;
    interaction_columns, Booth and Cox's E(s²), the confounded pairs and the largest correlations of
    a design's main-effect and two-factor interaction columns; estimable_projections, the projections
    that cannot fit their main effects and interactions; and run_count. unit_std_error can read
    one term, a relative variance, a design the library makes, and categorical factors coded as JMP
    codes them to evaluate a design (each factor's effect-coding columns made orthonormal and scaled to
    a mean square of 1), with which JMP's relative variances reproduce; design_metric can square
    what it reads, as trace(AA') is the alias matrix's squared norm; distinct_runs takes levels
    printed as names, and a subset of the runs. For chapter 10: normal_equations reads an entry of
    X'X, X'y or (X'X)^-1; a prediction reads its interval's half-width for a new observation and the
    point's x0'(X'X)^-1 x0; and dot_product takes a subset of the runs. For chapter 11:
    normal_equations also reads |(X'X)^-1|, its trace, x0'(X'X)^-1 x0 at a point and the D-efficiency
    of one set of runs relative to another; desirability scores several fitted responses at a
    point with the library's desirability functions; run_radius, blocks_orthogonal (both of
    Box and Hunter's conditions, the second the library's squares_orthogonal_to_blocks) and
    fold_over_pairs read a design's runs; interaction_columns reads the correlation of main effects
    with squares and estimable_projections the full quadratic model; nested_test takes its error
    from a third model, as Design-Expert tests a mixture's linear blending; a factor can be coded as
    a pseudocomponent; runs.exact maps settings in a factor's own units too, and "settings": "as_printed" fits them as printed; the lack of fit's degrees of freedom is read directly
    (lack_of_fit_df); a contrast's value is read from a saturated fit; a
    library value or design property can be squared; a path into a result can take sum and prod;
    and the canonical analysis holds only the factors its model holds. For chapter 12:
    transmitted_variance reads a coefficient of the variance model a fitted response model transmits
    from its noise factors, or the variance or propagation of error at a point, worked from the
    library's coefficients; and "exp": true reads a model of ln(s²) back as a variance. For chapter
    13: mean_squares reads a linear combination of the library's mean squares (the
    analysis-of-variance estimate of a variance component), its Satterthwaite degrees of freedom,
    standard error, covariance with a second combination, its Wald and chi-square intervals and the
    modified large-sample lower limit of Ting et al. (1990), and the F test of one combination against
    another; and a variance_component group can be an interaction of factors, such as
    part:operator. For chapter 14: split_plot reads the library's split-plot analysis (REML with
    the whole plots random, Satterthwaite's tests), the whole plots named by the columns that make
    them; a two-level factor can be fitted by its level names ("coding": "name"), so a factor
    nested in it is fitted within each level; and a Wald interval can take JMP's multiplier of 1.96
    itself ("z"), as the JMP of chapter 14 does where that of chapter 13 takes 1.95996. For chapter
    15: box_cox reads SSE(λ) and its log at any λ; a value can be read back from a transformed
    scale ("log10", and "back_transform": "freeman_tukey_sqrt"); cross_products reads an
    analysis of covariance's sums of squares and products, total, treatments and error; and a
    prediction reads its standard error, an adjusted mean's at the covariate's mean. For the
    appendix: aliases takes up_to, so a printed chain must hold every alias of up to that many
    factors and no other; block_effects reads the effects confounded with blocks, each chosen
    effect and every product of them, as alias chains; design_property reads the fraction of the
    full factorial a design runs and its runs per block (blocks); and a defining relation of more
    than ten generators, which the library leaves out of a design's metadata, is worked out with
    evaluate_design, so the 15-factor fraction in 16 runs is compared word by word.

  • Prediction from marginal means, as Taguchi's additive model makes it.
    marginal_means_prediction(design_matrix, responses, at, interactions=()) predicts a response at
    given settings as the grand mean plus each factor's deviation (the mean of the runs at its level
    less the grand mean), plus, for each named pair of factors, the deviation of their two-factor
    mean. On a design whose levels and pairs of levels occur equally often, such as an orthogonal
    array, the main-effect terms are the least-squares estimates; on any other a UserWarning says
    the prediction is not the least-squares one. The reference catalogue checks it (marginal_means)
    against the 42 predictions and deviations of Schmidt and Launsby's lunar concrete study, which it
    held as not recomputed until now: 40 agree, and two are the book's errors (run 14's prediction
    has two digits exchanged, and run 16's deviation does not follow from its values).

  • evaluate_design(..., metric="scaled_condition_number"): the condition number of the model
    matrix with each column scaled to unit length, so the factors' units do not count: 1 for
    orthogonal columns, whatever their units. RS/Discover prints it as Cond. No.; the nine that
    Schmidt and Launsby print (eight plating models and the ball weld D-optimal design) agree.

  • A design catalog, at factori.al/catalog. It lists the reference catalogue's 1039 published
    experiments and designs, and 117 designs the library makes. A reader searches them in words ("4
    factors, <=30 runs, quadratic, since 1990"); filters them by family, application (the industry
    sector of the reference catalogue's topics, such as food and beverages or semiconductors), runs,
    factors, the model they estimate in full, categorical factors, blocks, split plot, mixture, printed
    results, recomputed numbers, and the year the source appeared or the date the entry was added; and
    sees each one on a map of runs against factors, beside the fewest runs each model needs. A design's
    page links to the place its source prints it (for the book and the NIST e-Handbook, the section
    itself), and names the book's tables and figures by their captions. A design opens in Factorial
    with one click: 269 published designs, which the library regenerates run for run, and every
    generated design of the nine types the app makes, an orthogonal array when the app takes every
    column. The filters are kept in the address, so a filtered view can be shared. process_improve.experiments.design_catalog makes the records: catalog_records,
    normalise_family (a source's free-text design type, read into a family), design_facets,
    glyph, printed_checks, short_citation, catalog_sources, catalog_families,
    catalog_topics, figure_name, table_name, where_url, and search_catalog, which filters
    them as the page does. The tool search_design_catalog searches the same records for an agent or
    the MCP server, and returns each design with its page in the catalog. The user guide's new page,
    The Design Catalog, lists what a
    record holds.

  • What a design withstands, read off its runs: process_improve.experiments.design_measures.
    run_loss says whether a design still estimates its model if any one run is lost, and the
    D-efficiency the worst loss leaves: losing run i scales det(X'X) by 1 - h_i, with h_i its
    leverage, so one hat matrix answers it for every run. quadratic_projection is the most factors
    whose every projection estimates the full quadratic in them (3 for a six-factor definitive
    screening design), and projectivity the most whose every projection holds all their two-level
    combinations (3 for the 12-run Plackett-Burman design). fingerprint, same_design and
    design_classes find one design under other labels, its runs, factors or levels reordered: the
    catalog lists 115 designs printed or made in more than one place, among them the 12-run
    Plackett-Burman design, which is also Schmidt and Launsby's Taguchi L12 and Table 3.18 of the NIST
    e-Handbook. estimable_models and model_matrix are here too. The catalog filters on all of them,
    and a design's page draws its runs' leverages.

  • The design catalog compares designs, explores their projections and lists the errata. Up to
    four designs of one size are set side by side on the measures of compare_designs, for the model
    they all fit, with their fraction-of-design-space curves (design_measures.fds_curve); 586 designs
    of numeric factors are scored at build time (design_catalog.catalog_comparisons). A design's
    page projects its runs onto any two or three of its factors, says whether that projection
    estimates the full quadratic, draws its correlation map, and links to the families it can be
    augmented to (catalog_families reads them from the knowledge base). A timeline under the map
    counts the published designs by year in their families' colours, marks the year each family was
    first published, and keeps the years a reader drags across. The errata list the 1381 printed
    numbers the library does not reproduce, each with the value printed, its page and the recorded
    reason (catalog_errata). A source filter and a "no source prints it" filter find the generated
    designs no source in the catalogue prints. catalog/feed.xml is an Atom feed with an entry for
    each source as it enters the catalogue (catalog_feed).

  • Every design in the catalog with a complete table of runs opens in Factorial. Factorial holds
    runs as given (design_type="given" in api_make_design): the runs of a design it does not
    make, such as one a book prints, in their order and their factors' own units, analysed with the
    largest model they estimate in full. 506 published designs open, 269 of them as the app makes
    them, and 99 generated ones. A limit on the coded settings, typed in the catalog (A + B <= 1),
    keeps the designs whose
    every run meets it, marks the runs outside it, and opens a design in Factorial with the limit in
    its own units, where the D-optimal and I-optimal designs make runs inside it. A form for proposing
    a published design for the catalogue is linked from the catalog.

  • Standardised coefficients. Each row of analyze_experiment's "coefficients" (and
    coefficients_actual) now carries standardised_coefficient: the coefficient times the standard
    deviation of its column of the model matrix, over the standard deviation of the response, as
    MYSTAT prints it in its STD COEF column. It has no units, so terms measured in different units
    compare; the intercept's is 0, and it is not a number when the response does not vary. The
    reference catalogue checks it (standardised_coefficient) against the 57 that Schmidt and Launsby
    print in chapters 4, 5 and 7, which it held as not recomputed until now; all 57 agree.

  • The reference catalogue holds chapters 1 to 8 of Schmidt and Launsby, Understanding Industrial
    Designed Experiments
    (4th edition), with the answers of its Appendix J.
    Chapters 1 and 2: bond
    strengths confounded with batches, a twenty-week mileage record with its Cpk, a control chart's
    subgroup averages, the gas mileage and aircraft painting 2^(4-1) fractions analysed for their
    averages and standard deviations, the nickel plating 2^2, a 2 x 3 factorial, L12 and L18 screening
    designs, a 3^2 factorial, and a two-factor central composite design fitted whole and with a row
    missing. Chapter 3: its design matrices, each compared with the design the library makes, and the
    run counts of Tables 3.21, 3.24 and 3.26. Chapter 4: analyses of variance, simple, polynomial and
    multiple regression with MYSTAT's tables and prediction intervals, and a Box-Behnken design fitted
    in actual and in coded units. Chapter 5: an L8 analysed by average effects, analysis of variance
    and regression, and its variance and ln s modelled; signal-to-noise ratios and ln s compared; a
    turbine blade 2^3 with its dispersion effects; dispersion found from the residuals' spread at each
    level; an injection molding L8 with an outer array of noise factors; multi-variate charts of
    wafers and lots; a four-factor face-centred composite design modelled for its average and standard
    deviation; and one plating process run as a composite design, a D-optimal design, a Box-Behnken
    design and a 3^3, with RS/Discover's tables and each model's predictions at 27 points. Chapter 6:
    a wave solder L8 inner array with an L4 outer array of noise factors, analysed by its averages and
    smaller-is-better signal-to-noise ratios. Chapter 7: yield searched one factor at a time and by a
    3^2, then by response surface methods: a 2^2 with centre points and its path of steepest ascent, a
    second 2^2 at the best point along it, and the rotatable composite design that completes it, with
    its stationary point and eigenvalues. Chapter 8: the industrial case studies that print data,
    among them a 2^(8-4) screening design, a one-way analysis of variance with unequal groups, L8
    studies of a linear motor, an injection molded part and gold wire bonding, a simulated computer
    network fitted in its inputs' own units (SAS's three regression tables and lack of fit),
    duplicated 2^3 paper helicopters, lunar concrete in an 18-run D-optimal design, a duplicated L4
    for GaAs doping, an L16 of rubber formulations with seven responses and Design Cube's level
    effects, a plasma etch central composite design, an 18-run D-optimal design with an outer array,
    rivet protrusion regressed in four unbalanced blocks, a quarter fraction of a simulated sludge
    plant, two duplicated Karl Fischer fractions, a 2^4 on circular runout with Q-EDGE's regressions
    of the readings and their standard deviations, a ball weld D-optimal design, an analog filter
    screened in an L12 and modelled in a 33-run composite design on a half fraction, a PSPICE 2^2, a
    solderability L18 with a dummy-level column, a 2^4 on chemiluminescence with centre runs, and the
    run counts of a 136-run Plackett-Burman design for 134 inputs and a mixed-level full factorial of
    49152 cases. Appendix J's answers are checked against the problems they answer. 4520 printed
    numbers, 4253 checked. 400 are recorded as not reproducing, each explained: most come from the
    book's rounding (run averages and standard deviations that do not follow from their readings,
    squares of rounded effects, coefficients that are halves of rounded effects, values cut rather
    than rounded), some are misprints (a wrong sign, two exchanged digits, rows swapped, Yates's
    algorithm run on totals listed in run order rather than Yates order, an answer's resolution IV for
    a design with three-letter words). A catalogue check can now analyse
    each run's mean, total, standard deviation, ln s or one of Taguchi's signal-to-noise ratios
    (larger, smaller and nominal is best), or every reading as an observation of its own, in other
    units than the readings are printed in if need be (summary); solve for the setting of a factor
    at which a fitted line or parabola reaches a target (target_setting); compute a Cpk with
    calculate_cpk (capability); read a term's tolerance as one over its VIF, and its squared
    correlation with the others or a confidence printed as 1 - p as one less that (reciprocal,
    complement); hold a number that software prints with more digits than its arithmetic carries to
    fewer decimals (decimals); allow a coefficient the rounding it carries from responses printed
    rounded, through its row of the pseudo-inverse of the model matrix (data_rounding); read the
    Durbin-Watson statistic (durbin_watson); read a limit of a prediction's interval (bound);
    check Multiple R and the F ratio of the whole regression with its p-value (multiple_r,
    f_regression, f_regression_p); find a dispersion effect as ln(s+²/s-²), from run standard
    deviations or from the residuals' spread at each level (log_variance_ratio, residual_std_dev,
    residual_log_variance_ratio); give a number printed as the difference of two rounded averages
    the rounding of both, with or without a fit (of_rounded); compare a printed design matrix, coded
    or in the factors' own units, with the library's design or stored orthogonal array whatever the
    run order, and if need be the order and signs of its columns, a subset of an array's columns, or
    numbers rounded as printed (same_runs); read a step of steepest ascent in coded units (units);
    check that a printed matrix obeys its printed generators (generator_holds); sum a product of
    columns (dot_product); make a design for more factors than there are letters; read a term's
    degrees of freedom, its sum of squares as a percentage of the total, and Taguchi's percent
    contribution (anova_df, percent_of_total, percent_contribution); read the lack of fit's and
    the pure error's sums of squares and the lack of fit's mean square (lack_of_fit_ss,
    lack_of_fit_ms, pure_error_ss); and split a regression into what one model explains and what
    a larger one adds, each tested against the full model's residual, as RS/Discover splits a
    quadratic into its linear and non-linear parts (extra_ss, extra_ms, extra_f, extra_p).

  • A region that describes its limits, in actual units. DesignRegion now takes its
    constraints as Constraint objects, their dict form or bare expressions such as
    "3*T + 5*D <= 600", and a box region reports: the share of the box it keeps
    (volume_fraction(): exact for straight limits, in closed form for the factors one limit
    ties together and from the polytope's volume for up to five tied together by several;
    else from a fixed Sobol sample, so the same on every platform, which beside straight
    limits counts only what the curved ones take from the share the straight ones leave); whether
    any setting is left (is_empty()); the range each factor can still reach
    (implied_bounds()); a central setting that can be run, to hold unplotted factors at
    (centroid()); the limits that remove nothing the others do not
    (redundant_constraints()); the limits that are curved over the box rather than straight
    (curved_constraints()); each limit's affine form, rounded so no floating-point residue
    shows (linear_forms()); its corners (vertices()); and pictures on any two factors: the
    shadow of the region (shadow(x, y)), a slice through it at given values of the others
    (slice_polygon, slice_lines) and the slack of a grid, at or below zero exactly where a
    point can be run (slice_slack). Linear limits are handled exactly (a polygon, with a
    segment or a point where the region is flat), curved ones by a mask. With 8 factors and 8
    limits, everything a change to one limit needs takes about 70 ms.

  • rename_factors(expression, names): rename factors
    inside a limit, all at once (so a swap works), leaving function names such as sqrt
    alone, and return the canonical text, which renaming back reproduces.

  • A limit proposed from the settings that cannot be run.
    separating_constraint(factors, cannot, can) takes settings that cannot be run (corners
    of the box, say) and settings that can, and proposes the straight limit that rules out
    exactly the first, written for a reader in actual units: marking the corners where T
    and P are both high, with the centre runnable, gives "T + 25 * P <= 250". The cut is
    the plane of maximum margin between the two sets, which is unique, so a symmetric pattern
    gives a symmetric limit and a factor the pattern ignores is left out; its coefficients are
    rounded to the fewest digits that move them by at most 1% and keep every setting on its
    side, and the right-hand side is the roundest number in the middle of the gap. When no
    straight cut separates the sets, NotSeparableError (a ValueError) names the settings
    that lie between those of the other set. constraint_through_cuts(factors, corner, cuts)
    writes the limit through a cut on each factor from one corner, in exact arithmetic: from
    (200, 3), T up to 190 and P up to 2.5 give "T + 20 * P <= 250". Both run under
    Pyodide and give the same text on every platform.

  • Designs compared over the settings that can be run. compare_designs(..., region=) takes a DesignRegion (or its dict) and computes I and G over it rather than
    over the cube: I averages the prediction variance over 20000 points drawn uniformly from
    the region with a fixed seed, and G searches the region's vertices (up to 65536 of
    them; past that g_points says that G can come out low), its support points, points
    on the boundary of a curved limit, the grid's points inside it and that sample.
    With a curved limit, local searches (SLSQP) then climb each design's prediction variance
    from the points where it is largest, since the largest value usually sits where the
    curved boundary meets faces of the box, which no fixed set of points reaches. The other
    measures do not depend on where predictions are made and do not change.
    DesignComparison gains region (also in to_dict()) and a
    measures property whose definitions of I and G say "over the region"; a design with
    runs outside the region is noted. A mixture region, or one that names a factor the
    designs lack, is refused. Without a region every value is what it was.

  • Response plots shade the settings that cannot be run. The contour, 3D surface and
    prediction-variance plots, and visualize_doe, take region= (a DesignRegion or its
    dict). The contour and prediction-variance plots add a second trace after the response
    (which stays data[0]): a translucent constraint contour of the limits' slack, named
    "Cannot be run", so a straight limit is drawn straight. The 3D surface is NaN where a
    setting cannot be run. The Plotly adapter passes a layer's fillcolor and hoverinfo
    through, and the ECharts adapter draws a constraint contour as a masked heatmap. Without
    a region, or with one without limits, every figure is unchanged.

  • A user-guide page on limits on the settings. "Limits on the Settings" covers writing
    limits as text, what they leave of the factor ranges, renaming a factor inside them,
    proposing a limit from the settings that cannot be run, pictures of the region, and
    comparing designs and plotting a response over it; its examples run with the test suite.

  • Factorial takes limits on the settings that can be run. Under the factors, "Settings you
    cannot run" holds up to 8 limits, each an inequality in the factors' own units over any number
    of factors (T + 25*P <= 250, 0.5 <= A/B <= 2, T*F <= 3600), with buttons that type the
    factors' names and the signs a phone lacks. Python reads each limit as the library will and says
    what it rules out, or what to change in it; together, the limits say what share of the ranges
    they leave, whether the center can still be run, and how far each factor can still go. A limit
    can also be had by marking the corners of the ranges that cannot be run: the page proposes the
    straight limit that rules out just those, to add as it is or to adjust factor by factor from
    its corner. A picture shows, for each pair of factors, the settings that can be run, each
    straight limit's boundary and the run sheet's runs, and opens to look inside at values of the
    other factors the reader sets; a curved limit is traced smoothly. With limits, only the
    D-optimal and I-optimal designs are offered, every run is checked to be inside, the designs are
    compared over the settings that can be run, Learn greys the response surface outside them, and
    the Python shown, the notebook, the workbook, saved studies and links all carry them. Renaming a
    factor renames it inside the limits, and the run sheet keeps its runs.

  • Factorial picks a fractional factorial from the trade-off grid. With a fractional factorial,
    the Design step shows runs (4 to 128) against factors (3 to 11), each cell the resolution of the
    minimum-aberration fraction that trade_off_table finds, or Full, coloured in three bands. A
    cell in the column of the brief's factors sets the design: its resolution, V for a higher one, or
    the full factorial. A cell whose runs the page does not make at that resolution is not offered.
    The cell of the design the form makes is marked, and it moves as the factors or the resolution
    change.

  • Factorial makes and analyses mixture designs. For a blend of 3 to 6 components, the design
    list offers a simplex lattice of degree 1 or 2, the simplex centroid (3 or 4 components), and
    extreme vertices for a mixture with bounds; under a mixture, each factor's low and high are its
    lower and upper proportions, 0 and 1 when left blank, and every run's proportions sum to 1. The
    page refuses bounds no blend can meet, a categorical factor or a process variable, and limits on
    the settings, each with the reason. Learn fits the Scheffé model the design supports (linear,
    quadratic or special cubic where the runs estimate it), with no intercept: the mixture ANOVA,
    each component's effect along its Cox direction, and the fitted response drawn over the triangle
    of blends for 3 components, or along each Cox direction for more. Lenth's method and the Pareto
    plot are left out, saying why. A process with one synergistic and one antagonistic blend
    simulates practice results, and the Python shown, the notebook, the workbook, renaming, saved
    studies and links all keep a mixture a mixture. A mixture measures up to five responses as
    other designs do, each simulated from the blend process turned to another component. The
    comparison of designs, the best settings and the balance of the responses are for factors with
    ranges, and say so for a mixture.

Changed

  • Plackett-Burman designs of 24 and 36 runs are the cyclic designs Plackett and Burman
    printed.
    The 24-run design was the 12-run design doubled, which aliases 11 products of three
    columns completely with the intercept; it is now Paley's cyclic design mod 23, as in Montgomery's
    Table 8.23, whose products of three columns have |J| of 0 or 8 only. The 36-run design comes from
    Plackett and Burman's generating row instead of Paley's second construction. The same rule makes
    48 and 80 runs Paley's cyclic designs. Other run counts are unchanged.
  • Fractional factorials of more than 11 factors have minimum aberration where it is quick to
    find.
    At the fewest runs that reach the resolution asked for, every generator set is scored
    when there are few enough (12 to 15 factors in 16 runs): 12 factors at resolution III now have
    16 words of length three, as in Montgomery's Table X, not 17. Otherwise the fraction is the one
    of highest resolution the search reaches at that size: 16 factors asked at resolution III are
    resolution IV in 32 runs.
  • Factorial's three ways in stand out, and links out open in a tab of their own. The header's
    buttons are larger, each in a colour of its own with an icon, and each begins with a verb: Start
    a new study
    , Explore a worked example and Browse the design catalog. Every link from the
    app, its About page and the design catalog to another site (a source, GitHub, Pyodide) opens in a
    new tab, and a link to the book in the book's tab, so the page and its study stay where they are.
  • Factorial warns when the model's terms are correlated. Runs as given, or runs left blank,
    can leave the fitted terms correlated: their standard errors grow, and the model as a whole can
    explain the response while no single term looks active. Each coefficient in Learn now carries its
    variance inflation factor (VIF), from the runs fitted. When a term's VIF is above 5, a note names
    each such term with its VIF, says that its standard error is about √VIF times what uncorrelated
    runs would give, and suggests adding runs that separate the terms or dropping one; the
    coefficients table then shows a VIF column, defined on request, and the Python shown and the
    notebook work the VIFs out with evaluate_design. An orthogonal design, every VIF 1, shows
    neither.
  • generate_omars returns an exhaustively searched design in one fixed orientation. For three and
    four factors at small run sizes the search enumerates every design and picks the best. Designs that differ
    only in factor order and factor signs tie exactly on every criterion, so rounding in the floating-point
    scores picked among them, and the design returned could differ between platforms. The winner is now
    returned in its canonical orientation, which is the same on every platform. It scores as before on every
    criterion, but its columns can be permuted and sign-flipped relative to 1.99.0.
  • analyze_experiment's coding defaults to "auto", so coefficients on factors not already
    coded come back on the -1/+1 scale.
    The change was announced in 1.98.0. A call that passes no
    coding now gets its "coefficients" and "confidence_intervals" refitted with each numeric
    factor mapped from its minimum and maximum to -1 and +1 and each two-level categorical factor
    from its first level to its second; in a named model a categorical factor with more levels gets
    sum-to-zero contrasts. A main effect in a model with interactions is then tested at the centre of
    the design, and the result is reported with coding: "coded", its factor_coding, and the
    equation on the factors' own scale as coefficients_actual. A numeric factor already coded to
    -1/+1 is left as it is, and a Scheffe mixture model keeps "actual". The other analyses do not
    use coding and are unchanged.
    • Pass coding="actual" to keep the old scale. coding=None, and a null in the agent tool, mean
      "auto".
    • The FutureWarning and the coding_note key that announced the change are removed.

Deprecated

  • The module-level DEFAULT_TIMEOUT_S, DEFAULT_MAX_CELLS, DEFAULT_MAX_STRING,
    DEFAULT_MAX_DEPTH and DEFAULT_MEMORY_MB names in process_improve.tool_safety are deprecated
    since 2.0.0 and will be removed in 3.0; use settings.tool_timeout, settings.max_cells,
    settings.max_string, settings.max_depth and settings.max_memory_mb from
    process_improve.config.
    A read still returns the current settings value, and now issues a
    DeprecationWarning. The names were marked for removal in 2.0 but never warned, so the
    deprecation cycle starts with this release.

Removed

  • random_seed is removed; use random_state. It was deprecated since 1.97.0. Passing
    random_seed= to generate_design, evaluate_design, evaluate_all or generate_omars now
    raises TypeError, and the generate_design agent tool refuses it as an unknown key, as it
    refuses any other. random_state takes an int, a numpy.random.Generator or None, and its
    default (42) gives the same designs as before. The parameters that followed random_seed in
    those signatures each move up one position.
  • The i_efficiency metric of evaluate_design is removed; use
    "average_prediction_variance".
    It was deprecated since 1.97.0. Asking for it now raises the
    ValueError any unknown metric raises, which lists the metrics there are. The replacement
    reports the I-criterion itself: the prediction variance averaged over the region, in units of
    the error variance, where lower is better. "i_optimality" and "i_criterion" remain aliases
    for it.
  • optimize_responses(..., desirability_weights=) is removed; use response_importance. It
    was renamed in 1.62.0, since the values are importances, which set how much each response
    counts in the overall desirability, and not the per-goal weight that shapes a response's
    ramp. Passing it now raises TypeError, and the optimize_responses agent tool refuses it as
    an unknown key. The parameters that followed it in the signature each move up one position.
  • The empty ilp extra. It was deprecated since 1.97.0, when generate_omars moved from
    pulp's CBC solver to SciPy's HiGHS, a core dependency. pip install 'process-improve[ilp]' now
    warns that the extra does not exist and installs the core package, which is all it ever added.
  • PCA.predict, MBPCA.predict, MBPLS.predict and TPLS.predict. Each one forwarded to
    diagnose, which returns the same Bunch, so call diagnose instead. PLS.predict and
    OPLS.predict are the scikit-learn regressor method and stay.
  • TPLS.tolerance_. Read TPLS.tol instead.
  • permutation_q2 and pipeline_null. Use check_predictive_signal(x, y, fit_predict) and
    count_discoveries_under_null(select, x, y); check_predictive_signal takes the blocks first.
  • The empirical_fdr key of the count_discoveries_under_null result. Read
    null_to_observed_ratio, which is the same ratio without the clip to [0, 1].
  • OPLS(max_iter=..., tol=...). The single-response algorithm is closed form and never read
    them, so leave them out; passing either now raises TypeError.
  • The md_tol and md_max_iter keys of missing_data_settings on PCA, PLS, MBPCA and
    MBPLS.
    Pass tol and max_iter to the constructor instead. A dict that still holds either
    key raises ValueError at fit, since ignoring a convergence setting would change the fit.
  • PCA.select_n_components(n_iter=..., tol=..., threshold=...). Use ekf_max_iter and
    ekf_tol. threshold was already ignored; selection_rule="q2_increment" with
    min_q2_increase gives a similar preference for fewer components.
  • PCA.select_n_components(cv_scheme="row_wise") and its **pca_kwargs. Use "ekf",
    "ckf", "ek", "sacv" or "gcv", which the ValueError for "row_wise" now lists.
    **pca_kwargs reached PCA only under that scheme, so an unknown keyword now raises TypeError
    instead of being ignored.
  • process_improve.sensory.discriminate_observational. Deprecated since 1.77.0. Use
    find_predictive_descriptors, which takes the same arguments and returns the same result. The old
    name now raises ImportError on import and AttributeError on attribute access.
  • The discriminator= keyword of relate_observational and analyze_descriptive. Deprecated
    since 1.77.0. Use find_predictive=. Passing discriminator= now raises TypeError. The
    sensory_analyze_descriptive tool no longer declares a discriminator field, and because its
    schema forbids unknown keys, a call that sends it now fails validation with
    ToolInputInvalidError.
  • The discriminator keys in sensory results. Deprecated since 1.77.0. Read
    result.relate["predictive_descriptors"] instead of result.relate["discriminator"], and
    result.config["find_predictive"] instead of result.config["discriminator"].
  • q_value and discriminator_significant on the find_predictive_descriptors descriptor
    records.
    Deprecated since 1.77.0. Read p_value_fwer and is_predictive, which carry the same
    values. The q_value on the marginal associations rows of relate_observational is a
    Benjamini-Hochberg q-value and stays.
  • The "z value" and "Pooled standard deviation" keys of ttest_independent. Deprecated
    since 1.70.0. Read "t value" and "Std error of difference", which carry the same values. The
    statistic is a t-statistic, and the second key held the standard error of the difference, not the
    pooled standard deviation, which is "Pooled std dev". The two columns are also gone from
    ttest_independent_from_df. Reading an old key now raises KeyError. The paired test,
    ttest_paired, is unchanged.
  • The z_value and pooled_std fields of the ttest_two_samples tool. Deprecated since 1.70.0.
    Read t_value and std_error_of_difference. The pooled_std_dev field stays. The
    ttest_paired_samples tool is unchanged.

Fixed

  • evaluate_design no longer calls a full-rank model rank-deficient because of its factors'
    units.
    It took the rank of X'X, whose condition number is the square of X's: with a column of
    x1 (to 100) beside one of x1²x2 (to 2,000,000), X's is 7e7 and X'X's passes the precision of a
    double, so the model got no VIFs, D-efficiency or prediction variance. The rank, and the inverse
    of X'X, are now worked on X with each column scaled to unit length, which changes neither. The
    five tolerances of Schmidt and Launsby's Table 4.20, which the reference catalogue could not check
    before, are checked: four agree, and the fifth repeats the next row's value in the book.
  • A Taguchi design for one 2-level and seven 3-level factors takes 18 runs, not 36. The
    library stores the L18 as L18(6^1 3^6), and the design gave each factor a column of its own, so
    the eighth factor found none and the design moved on to L36(3^23). When no array has a column
    for every factor, a column whose level count is a product of two factors' counts now carries both,
    each factor taking a digit of the column's level: the 6-level column is the 2-level and a 3-level
    column of Taguchi's L18, and a 4-level column of L16(4^5) carries two 2-level factors, so one
    4-level and six 2-level factors take 16 runs rather than 32. Every pair of columns is still checked
    to be balanced, metadata["columns"] names a shared column twice, and a design whose array
    already had a column for every factor is unchanged.
  • The reference catalogue's regression sum of squares is the total less the residual's. It
    was the sum of the Type II rows of the ANOVA, which leaves out what correlated terms share, such
    as the squares of a composite design; for orthogonal designs the two are the same, and every
    number already in the catalogue still reproduces.
  • A number the reference catalogue reads in E-notation is held to the digits it prints. 1.25E+08
    allows half a million either side; it was held to half a unit, so a correct number printed that way
    could not agree. No number already in the catalogue was printed in E-notation with a positive
    exponent.
  • Linear constraints in 6 or more factors are recognised as linear. The test for an
    affine constraint fitted it on points that, from 6 factors, do not determine an affine
    function, so every linear constraint was treated as curved: the candidate set of a
    constrained optimal design lost the region's vertices, and its sampler fell back to a
    slower method.
  • Constrained optimal designs and evaluate_design(region=) reach every vertex of a
    region with many limits.
    The vertices among the candidates, and among the support
    points that evaluate_design takes its worst case over, came from solving every choice
    of k boundaries, which was given up past 200000 choices (8 factors and 5 limits): a
    region of 8 factors and 6 limits had 236 of its 758 vertices listed, its D-optimal
    designs lost about 5% of D, and evaluate_design gave a worst case 7% below the
    variance at a vertex. They are now found by cutting the box with one limit at a time, as
    DesignRegion finds them: the same vertices wherever the old way finished, and every
    one up to 8192 of them.
  • Constrained optimal designs keep the corners of a steep straight limit. Candidates,
    supplied candidates and fixed runs were held to each limit with a tolerance of 1e-9 in
    the limit's own units, so a corner lying 1e-12 (coded) off the boundary of a steep limit
    failed it: 120*T + 33*D + 450*F <= 17000 lost 3 of its 8 vertices from the candidates,
    the corners that DesignRegion.vertices() reports were dropped when supplied as
    candidates (30*T + 70*D <= 7000 then kept too few to fit a model), and one of them, as
    a fixed run, was said to lie outside the region. As in DesignRegion.feasible, the
    tolerance is now a distance of 1e-9 in coded units for a straight limit whose coded
    gradient is longer than 1.
  • A constraint that cannot be evaluated over part of the factor box is treated as
    curved.
    Where sqrt or log of a negative number, or a division by zero, made the
    constraint infinite or NaN at some probe point, the test for an affine constraint
    passed it, and its fitted form stood in for it: the secant plane through the points
    where it was finite (0.5 <= A/B <= 2 with B from 0), or a form of NaN, which the
    hit-and-run chains ignore (sqrt(A - 149) + B <= 21 with A from 100 to 150 and B
    from 20 to 60). In a region too thin to sample by rejection, the chains then did not
    keep to the constraint: none of 2000 samples of that sqrt limit met it, so
    evaluate_design(region=) and the moments of an I-optimal design averaged over settings
    outside it, and none of the 6 runs of a maximin or a maxpro design met it.
  • Samples of a thin region no longer depend on the sign of an eigenvector. A region too
    thin to sample by rejection (one that keeps under 1% of the box for the 20000 points that
    compare_designs and an I-optimal design's moments draw, or under 5% for the 100000 of
    evaluate_design) is sampled by hit-and-run chains, whose directions used eigenvectors
    of a covariance, and those have no fixed sign: native Python and Pyodide took different
    steps, and their averages over such a region differed in the third or fourth figure.
    The directions now use the Cholesky factor, which is unique. The chains still magnify
    differences in the last bit of the platforms' arithmetic, so in 6 or more factors these
    averages agree to about 7 to 11 figures, not to every one.
  • DesignRegion.feasible accepts a point on a straight limit's boundary however the
    limit is scaled.
    It compared a limit's value with 1e-9 in the limit's own units, so
    a point on the boundary of 120*T + 33*D + 450*F <= 17000 could fail where the same
    limit divided by 100 passed. For a straight limit whose coded gradient is longer than 1,
    the tolerance is now a distance of 1e-9 in coded units; a gentler limit keeps its
    tolerance in its own units, which is the wider of the two, so nothing that passed before
    fails.
  • A single limit passed outside a list is refused with a clear message.
    constraints="T <= 160" was read character by character and reported that a limit
    named 'T' is not an inequality; a lone string, dict or Constraint now raises a
    TypeError that shows the list to write.