About ALS Stats

ALS Stats is an add-on for Google Sheets™ that adds 31 statistical functions. Their names start with STATS_, and they are used like any other Sheets formula.

How it works

The functions

Report functions

Each returns a report: titled tables with the results, below and to the right of the formula cell.

Regression
Models: multiple linear regression with hierarchical steps and interactions, binary logistic regression, and bootstrap confidence intervals for regression. STATS_LINEAR, STATS_LOGISTIC, STATS_BOOTSTRAP
Correlation
Links between variables: Pearson, Spearman and Kendall correlations, partial correlation with controls, and Cronbach’s alpha for the reliability of a scale. STATS_PEARSON, STATS_SPEARMAN, STATS_KENDALL, STATS_PARTIAL, STATS_ALPHA
Categorical
Categorical answers: a contingency table, the chi-square test of association and Cramér’s V. STATS_CROSSTABS, STATS_CHI2, STATS_CRAMER
Tests (t/ANOVA)
Compare groups and measurements: the one-sample, paired and independent-samples t-tests, their rank-based alternatives (Wilcoxon, Mann–Whitney, Kruskal–Wallis), one-way ANOVA with post-hoc comparisons, and the Shapiro–Wilk test of normality. STATS_NORMALITY, STATS_PAIRED, STATS_WILCOXON, STATS_INDEPENDENT, STATS_MANN_WHITNEY, STATS_ANOVA, STATS_KRUSKAL, STATS_ONE_SAMPLE
Summary / CI / Frequencies
Describe the data: means, spreads, quartiles and other statistics of each column, frequency tables, and the confidence interval of the mean. STATS_DESCRIPTIVE, STATS_FREQUENCIES, STATS_CI
Workflow
Several analyses on one range in one formula, returned as one report. STATS_ANALYZE

Column functions

Each returns new columns, row by row, to use in other formulas.

Transform
New columns from existing ones: computed scores, recoded or reversed answers, min–max normalized values, moving averages and z-scores. STATS_COMPUTE, STATS_RECODE, STATS_NORMALIZE, STATS_MA, STATS_ZSCORES
Prepare
Reshape the data for other functions: keep only complete rows, split a column into one column per group, rename and pick columns. STATS_PAIRWISE, STATS_SPLIT_COLS, STATS_COLUMNS

Compared with SPSS

Many numbers are computed as SPSS computes them, and some reports differ from SPSS on purpose. The page of each function lists these details under “How it is computed”.

Computed as in SPSS

Different from SPSS

How we test

The statistics come from a core library that every function of the add-on is built on. The library went through eight rounds of audit and is checked by more than 4,000 automated tests; its results are compared with reference values computed with SciPy and statsmodels, the statistical libraries of Python. The add-on has tests of its own and went through three rounds of audit.

The examples on this site are computed by the add-on’s code when the site is built, so they show what the formula returns.

Change log

Version 2.2 — October 3, 2026

Centered interactions in regressions, and regressions in STATS_ANALYZE no longer repeat the errors of other calls. A formula keeps its old result until the sheet recalculates it — when its data or the formula changes, or with Extensions › ALS Stats › Recalculate STATS formulas.

  • New: centerInteractions, the last parameter of STATS_LINEAR, STATS_LOGISTIC and STATS_BOOTSTRAP (and of LINEAR, LOGISTIC, BOOTSTRAP in STATS_ANALYZE), also in Settings › Regression defaults. With TRUE an interaction a*b is built from mean-centered values, (a − mean of a) · (b − mean of b): the B of a becomes its effect at the mean of b (not where b is 0), and the VIF of the product drops; B, SE and p of a*b, R Square and F stay the same. A step with an interaction then has the line Interaction terms use mean-centered values: … under its coefficients (one row taller, or added to the Excluded: … cell). Empty or FALSE — as before: existing formulas do not change.
  • STATS_ANALYZE: a LINEAR, LOGISTIC or BOOTSTRAP report printed an Errors: … line with the errors of the other calls of the batch, those after it too. Now it shows only its own errors, as the other reports do, so such a report is two rows shorter and the reports below it move up.
Version 2.1 — September 28, 2026

Fixes in recoding and value labels. A formula keeps its old result until the sheet recalculates it — when its data or the formula changes, or with Extensions › ALS Stats › Recalculate STATS formulas.

  • STATS_RECODE
    • Every rule works on its own, and new values can be text. A rule with text on the right (control:group_a) or an empty item (a trailing comma) used to make the whole list silently do nothing, correct rules included; now control:group_a recodes control to group_a, and an empty item is skipped.
    • A pair is read by the type of the column. In a text column Never:1 and 1:Never both recode Never to 1. In a numeric column low:1 now recodes 1 to low (it used to leave the numbers as they were). low:1:3 gives the values from 1 up to 3 the text low (it was read as "3 → 1" and gave wrong numbers).
    • A wrong rule shows one error cell that names it, instead of being dropped: no rules at all, an empty side (:1 turned 1 into 0), a bound that is not a number, an empty range (9:3:1), the bare word reverse after other rules (1:2,reverse), reverse:1 in a numeric column. A pair with text over numeric and text columns at once is an error too: recode them in separate formulas. Such formulas used to show a column; now they show one cell.
  • Value labels
    • A labels row with spaces around the colon (Never : 1, Often : 2) works: the space is no longer part of the label. Text answers used to match no label, so the whole column counted as missing. STATS_FREQUENCIES now shows a row per label instead of one _other row (the block is taller: keep the cells below it free); STATS_DESCRIPTIVE counts the answers in n; STATS_CROSSTABS, STATS_CHI2, STATS_SPLIT_COLS and the tests use the codes. Numeric columns only lose the space in the label (low → low).
    • An empty lower bound of a range is open, as the help says: low::0 catches every negative value in STATS_FREQUENCIES, STATS_CROSSTABS, STATS_SPLIT_COLS and in a labels row above the names. Negative values used to go to _other; a _other row or group that held only them disappears.
  • Values that are not defined are empty, not 0
    • STATS_COMPUTE with sum: a row where no item is answered shows . instead of 0 (also inside an expression, sum*2), so a respondent who answered nothing no longer looks like the lowest score. A row with some answers still sums the answered items.
    • STATS_DESCRIPTIVE: sum, sumOfSquares, sumCenteredSquares of a column without a single number, slope and weight of a single value, and weight of a column without spread are empty cells instead of 0.
  • Help: STATS_RECODE rules by column type, text new values and error messages; labels with open bounds (low::0); when sum, slope, sumOfSquares, sumCenteredSquares and weight are empty.
Version 2.0 — September 26, 2026

A major update: many results are now computed as in SPSS, and problems in the data are reported instead of being silently worked around. A formula keeps its old result until the sheet recalculates it — when its data or the formula changes, or with Extensions › ALS Stats › Recalculate STATS formulas.

What to check in your sheets

  • STATS_SPLIT_COLS now fills the whole height of the sample: keep the cells below it empty, or the formula shows #REF!.
  • Cells, charts and formulas that point to single cells of a report: rows can move (category order, STATS_MA, the Kendall pair report is one row shorter, the paired t-test one row taller) and numbers can change (Levene, posthoc p-values, quartiles).
  • If you changed pop or the Welch auto thresholds in Settings: they now apply. With pop on, STATS_DESCRIPTIVE spreads, STATS_ZSCORES, STATS_COMPUTE expressions with std or variance, the Pearson covariance and STATS_ANALYZE with them change; other thresholds can switch the Student/Welch choice.
  • MATCH or VLOOKUP by the text of a report: some labels changed (Levene (based on median), Correlation matrix, Mean difference).

All changes

  • Changes that can move or resize existing reports
    • STATS_SPLIT_COLS: every value stays on its respondent's row, and rows of the other groups show .. The block is now as tall as the whole sample: if the cells below it are not empty, the formula shows #REF! until you clear them or move the formula.
    • STATS_FREQUENCIES, STATS_CROSSTABS, STATS_CHI2: categories are ordered as in SPSS: numbers ascending, text alphabetically, or in the order of your labels. The counts are the same, but rows can swap places.
    • STATS_SPLIT_COLS: text groups without labels are in alphabetical order, as the help says (they came in the order they appear in the data, so sorting the sheet reordered the columns). The numbers of each group do not change, but the group columns can swap places; give labels to keep your own order.
    • STATS_MA: each average is shown on the last row of its window, and the first rows show .. The block keeps its height, but the values move down.
    • Rows of . (not applicable) at the end of a range are no longer cut as empty: derived columns and STATS_SPLIT_COLS reach that row (the block is taller by those rows), STATS_FREQUENCIES counts them in not applicable, STATS_CROSSTABS in Not applicable rows. Only blank cells make the empty tail.
    • A row of value labels above the names needs at least two labels in each non-empty cell (low:1,high:2). A header such as T:1, Ratio 1:2 or Note: is read as names again: it used to be taken for labels, so the first data row became the names and was lost. A sheet whose labels row has a cell with one label now reads that row as names: add a second label, or give the label in the labels parameter.
    • STATS_DESCRIPTIVE: the line Some calculations made with epsilon 1e-12. appears only when epsilon was put in place of zero or a tiny value (geometricMean, harmonicMean); on positive data the block is one row shorter. The numbers do not change.
    • STATS_ANOVA on two groups no longer builds a posthoc table (it would repeat the ANOVA). One comment line is shown instead.
    • Cohen's d, the effect size that APA asks for next to a t-test. STATS_INDEPENDENT: a cohenD column in Test results (pooled standard deviation, also after Welch, as SPSS); the block keeps its size. STATS_PAIRED: a cohenD row after n (dz: the mean difference divided by the SD of the differences, as SPSS), so the block is one row taller and the confidence interval sits one row lower. In STATS_ANALYZE every report below a paired t-test moves one row down.
    • STATS_LINEAR with two or more steps: the Regression row of each step's ANOVA table has five more columns, as SPSS Change Statistics — R Square Change, F Change, df1, df2, Sig. F Change — so you can see whether a step adds anything to the one before. The block keeps its height but is wider (up to 11 columns): keep the cells to its right free. One-step models do not change.
    • STATS_ALPHA: the title names the number of rows the alpha rests on (Cronbach Alpha for q (N = 48)): a row with any empty item is left out, which on a long scale can be a large part of the sample. The "Alpha if item deleted" table has one more column, corrected item-total correlation (the item against the sum of the other items, as SPSS), so it is one column wider: keep the cell to its right free. A MATCH by the old title no longer finds it.
    • STATS_KENDALL on two columns (and a Kendall pair in STATS_ANALYZE): the report is one row shorter. The row t is gone: it repeated z, and Kendall's p comes from the normal distribution, not from t. p and the confidence interval now start one row higher, so a cell reference to them points one row too low. tau, z and p do not change; the correlation matrix of three or more columns does not change.
  • Changes in numbers and labels
    • Quartiles and percentiles (q1, q3, p10, p90, iqr, percentile) are computed as in SPSS, so they can differ from the Sheets QUARTILE function. The median does not change.
    • Levene's test uses absolute deviations, as it is defined. Its table is now titled Levene (based on median) or Levene (based on mean), and the automatic Student/Welch choice can switch.
    • STATS_ANOVA: after a Welch ANOVA, Test metrics shows the classic sums of squares, eta² and omega². Tukey and Games–Howell p-values and intervals are exact. With auto, a classic ANOVA is followed by Tukey.
    • STATS_INDEPENDENT, STATS_PAIRED, STATS_ONE_SAMPLE with more columns than the test needs use the first two (one-sample: the first) for the whole report. The extra columns used to stay in the title and in the homogeneity test of STATS_INDEPENDENT, where they could switch Student/Welch and change t, df, p and the interval; in STATS_PAIRED they removed rows, and a text column among them was an error.
    • Correlations on very few common rows leave a cell empty instead of a value that means nothing: the statistic and p below 3 rows (they showed 0, Infinity or 1), the confidence interval below 4 rows (it showed the point r … r). Matrix pairs with few common answers the same. The block keeps its layout.
    • STATS_ANOVA posthoc: t has the sign of the mean difference (group1 − group2), so pairs with a negative difference show a negative t (it was always positive). p, Adjusted p and the interval do not change.
    • Spearman intervals are slightly wider, and Kendall p-values have no continuity correction (both as in SPSS).
    • Kendall confidence intervals use the Fisher transform (variance 0.437/(n − 4)) and narrow as tau approaches ±1: for n = 10, tau = 0.9 the interval is 0.737 … 0.964 instead of 0.413 … 1. They need 5 common rows. tau, z and p do not change.
    • Values that cannot be computed are now empty cells instead of 0: skewness and kurtosis of too few or equal values, a correlation with a constant column, alpha of items without spread, and interval bounds for a single value.
    • STATS_DESCRIPTIVE: a metric that fails for a column (percentile.150) leaves its cell empty instead of error 0, and the Errors: line reads x: percentile.150 - q must be in [0,100] (it was 0:x:percentile.150 error - …).
    • Report labels spelled right: correlation matrices say Correlation matrix and Correlation data (were Corelation …), the posthoc table of STATS_ANOVA says Mean difference (was Mean differencies). A MATCH or VLOOKUP by the old text no longer finds these cells.
    • Very small p-values are shown as they are (for example 2.08E-24) instead of 0.
    • STATS_COMPUTE reads the whole expression: decimals (score*0.5), exponents and powers of brackets are computed correctly. A row with a missing value gives ..
    • A number stored as text now always counts as a number (before, only when the whole row was numeric), and checkboxes count as 1/0.
    • STATS_LOGISTIC: lambda now actually penalizes the model.
    • STATS_PARTIAL with a perfect correlation (1 or -1) and a one-sided alternative: Significance follows the direction of the hypothesis, as in STATS_PEARSON. A correlation of -1 with "greater" (or 1 with "less") now shows 1, not 0: the relation goes the other way, so it is not significant. Two-sided and every |r| < 1 do not change.
    • STATS_LINEAR and STATS_LOGISTIC with lambda above 0 (ridge) say in the report that the model tests are not valid for a penalized model: the line under Model Summary reads Calculated with lambda 1. F and Sig. are not valid tests of a penalized (ridge) model., and the logistic header reads Omnibus Tests of Model Coefficients (not a valid test with lambda > 0). The numbers stay, and the blocks keep their size; a MATCH by the old text of these two cells no longer finds them. With lambda 0 nothing changes.
    • STATS_DESCRIPTIVE: flatness no longer uses epsilon — it is the geometric mean of the values as they are over their mean, so it always stays between 0 and 1 (tiny values were raised to epsilon in the geometric mean but not in the mean, and the ratio could come out above 1). A zero among the values now gives exactly 0 instead of a tiny number that depended on epsilon, and flatness alone no longer adds the line Some calculations made with epsilon …: such a block is one row shorter.
    • STATS_RECODE with "reverse,…" (the bare word reverse first, other rules after it) reverses the scale, as "reverse"; it used to apply only the other rules (1, 2, 3 with "reverse,1:2" gave 1, 1, 3, now 3, 2, 1).
  • Clear messages instead of misleading reports
    • A formula shows one cell that explains the problem: a column name that does not exist (Column nope does not exist), two columns with the same header, a logistic regression Y not coded 0 and 1, a dependent variable without variance, a parameter out of range (for example ciLevel 95 instead of 0.95), or a misspelled option.
    • An empty header cell over values shows The name of column 2 is empty: a column with values needs a name in every formula on that range, even when the column is not selected; it used to get the name column1. Give the column a name, or leave it out of the range. An empty right edge of the range (no name, no values) is fine.
    • Text columns without value labels are no longer analysed as numbers. A list of columns skips them with a note, and a test on a pair of columns or a model shows an error. Add value labels or recode the column to numbers.
    • A column filter that selects no column (a regular expression without a match, index numbers past the end, exclusions that remove everything) shows one error cell that names the filter and the columns of the range: colFilter "/^Q/" selects no columns (columns: q1, q2, t). STATS_COLUMNS, STATS_RECODE, STATS_ZSCORES, STATS_NORMALIZE, STATS_MA, STATS_SPLIT_COLS used to show #REF!, reports an empty block, tests need at least 2 observations.
    • STATS_PEARSON, STATS_SPEARMAN, STATS_KENDALL on one column show the error as the other tests do: Pearson Test requires at least 2 columns, got: a (it was Error:Minimum two samples required. Got:a), naming the text columns that were skipped.
    • STATS_LINEAR, STATS_LOGISTIC, STATS_BOOTSTRAP: an exclusion in steps ("x1,x2|-x1") shows Step "-x1": exclusions are not supported in regression steps - list the predictors to add. It used to remove the column from the whole table, so the first step lost x1 too.
    • welch and posthoc read 0/1 as FALSE/TRUE: welch 0 is Student (it silently gave Welch), posthoc 0 turns the table off and 1 is auto (both were errors).
    • STATS_ALPHA: ifItemsDeleted and standardized accept TRUE/FALSE, 1/0 and their text; anything else shows ifItemsDeleted must be TRUE or FALSE (or 1, 0), got "no". Before, any text except "false" and "0" turned the option on ("no" built the "if item deleted" table).
    • STATS_LINEAR, STATS_LOGISTIC, STATS_BOOTSTRAP with an empty Y show Linear Regression needs the predicted column (yName) instead of The predicted column not found in table or requires at least 2 groups.
    • STATS_COMPUTE with a repeated new name ("a|a", or the same expression twice) shows Duplicate column name: a, as STATS_COLUMNS and STATS_RECODE, instead of two columns with the same header.
    • STATS_DESCRIPTIVE without metrics, or with text columns only, shows one error cell (Descriptive statistics needs metrics, e.g. "mean,std", … needs numeric columns, text columns: …) instead of a table without numbers. An empty item among metrics ("mean,,std") no longer adds an Errors: line.
    • Regressions leave out a constant or duplicate predictor and name it in an Excluded: line, instead of showing empty or wrong coefficients.
    • STATS_ALPHA on two items with "if item deleted" shows alpha and a note instead of an error.
    • STATS_BOOTSTRAP shows how many resamples were usable (for example 8 of 50) and leaves the interval empty when too few of them are.
  • Fixes
    • A header made of numbers stored as text (for example years 2025, 2026 in cells formatted as text) no longer breaks the formulas with values.filter is not a function: the report is computed. The same holds for a header with real numbers, dates (named as 2025-01-01) or checkboxes (TRUE, FALSE), even when only one header cell is such. Numbers as column names under a row of value labels are now read as names; they used to be read as the first data row, with the labels row as the column names.
    • STATS_INDEPENDENT and STATS_ANOVA: the welch mode is used as written: "Welch" or " student " no longer fall back to the automatic choice, a TRUE/FALSE cell means Welch/Student, and a typo ("studnt") or an unknown threshold name shows an error instead of a silent automatic choice. Thresholds such as "varRatioMaxStudent=3" apply to that formula only and no longer carry over to other formulas.
    • Settings: clearing a number field now restores its default value; it used to save 0 (for fixed that meant rounding every report to whole numbers, for maxIter an error). When one value is rejected, the error names it and the other changes are still saved and shown. The message stays under the Save button, so it is in view however far the panel is scrolled; the empty choice of posthoc is labelled none (no posthoc table) and stays selected after reopening.
    • Menu items when a permission was not granted: Google lets you untick single permissions when you install an add-on, and without the one for panels Functions list, Settings, About or Recalculate STATS formulas stopped with a technical error about scopes. Now the item explains that a permission is missing and gives a Grant access link (or the link as text, if even a dialog is not allowed); after granting, choose the item again.
    • A formula no longer fails with Google's No item with the given ID could be found… when the settings of the file cannot be read (for example in a fresh copy of a spreadsheet): it computes with the default settings instead.
    • Settings that were saved but never used now apply to every formula: pop, the Welch auto thresholds (alphaHomogeneity, varRatioMaxStudent, balanceMaxStudent, smallNForStudent) and eps. None of them is a parameter of a function, and formulas computed with the defaults whatever the panel said. If you saved one of them, numbers change after recalculation: with pop on, STATS_DESCRIPTIVE says Calculated for Population. and uses population formulas (variance, std, cv, skewness, kurtosis and the metrics built on them), STATS_ZSCORES divides by the population standard deviation, STATS_COMPUTE expressions with std or variance change, the Pearson covariance divides by n (r and its test do not change), and STATS_ANALYZE follows its reports. STATS_CI, the t-tests and ANOVA keep the sample standard deviation, as SPSS; alpha does not depend on pop. With other thresholds the automatic Student/Welch choice can switch. Nothing changes if you never touched them.
    • Functions list: code and bold words in the descriptions are shown formatted, not as raw markdown marks (asterisks and backticks).
    • Recalculate STATS formulas works in a spreadsheet with a chart on its own sheet (or a connected-data sheet): it stopped with The action is not supported for OBJECT sheet and recalculated nothing. Such sheets are skipped, and a sheet that cannot be read is listed under Failed while the others are recalculated.
    • Faster posthoc, bootstrap and Kendall, with the same numbers: STATS_ANOVA with Games–Howell or Tukey on many groups, STATS_BOOTSTRAP with a large B and STATS_KENDALL on thousands of rows take a fraction of the time they did. Ten ANOVAs of 12 groups in one STATS_ANALYZE take a few seconds instead of coming close to the 30-second limit of Sheets, and a Kendall matrix of 20 columns and 5000 rows no longer runs out of it.
  • New
    • STATS_NORMALITY(range, colFilter): the Shapiro–Wilk test of normality for every selected column, as the SPSS table "Tests of Normality" — Statistic (W), df and Sig. per column. It tells whether a t-test or ANOVA fits the data or a rank test is the better choice. A column with fewer than 3 or more than 5000 values, or with no spread, shows one error cell that names it.
    • STATS_MANN_WHITNEY(range, colFilter, alternative): the Mann–Whitney U test for two independent samples, the rank replacement for STATS_INDEPENDENT. Ranks (N, Mean Rank, Sum of Ranks) and Test Statistics (U, Wilcoxon W, Z, Asymp. Sig.) as in SPSS, and the exact p (Exact Sig.) for small samples without ties.
    • STATS_WILCOXON(range, colFilter, alternative): the Wilcoxon signed-rank test for two measurements of the same rows, the rank replacement for STATS_PAIRED. The difference is the second column minus the first, as in SPSS, and the rank rows say so: Negative Ranks (after < before). With "greater" the second column is expected to be larger — the opposite reading of STATS_PAIRED.
    • STATS_KRUSKAL(range, colFilter): the Kruskal–Wallis test for independent groups, the rank replacement for STATS_ANOVA; each column is a group. Ranks (N, Mean Rank) and Test Statistics (H corrected for ties, df, Asymp. Sig.). It tells whether the groups differ, not which ones: there are no pairwise comparisons yet.
    • STATS_PARTIAL(range, colFilter, controls, ciLevel, alternative): the partial correlation — the correlation of two variables with the controls held constant (SPSS PARTIAL CORR); three variables or more give a matrix, as STATS_PEARSON. A constant control leaves Correlation and Significance empty on purpose: it almost always means the wrong column was picked.
    • STATS_ALPHA takes a fifth argument standardized: with TRUE the report adds standardized alpha (as SPSS "Based on Standardized Items") next to alpha and in the "if item deleted" table, so the block is wider. Existing formulas do not change.
    • STATS_ANOVA posthoc: bonferroni and scheffe, and none (or FALSE) to turn the posthoc table off.
    • STATS_CROSSTABS takes a fourth argument details: with TRUE three tables follow the summary — Row percentages, Column percentages and Adjusted residuals (as SPSS CROSSTABS). Residuals beyond ±2 show the cells behind a significant chi-square. Off by default, so existing reports do not change.
    • STATS_MA window options: "3:2" averages a window of 3 rows once at least 2 values are present; "3:3:1" is the prior window and "3:3:2" the centered window (SPSS PMA and MA).
    • STATS_ANALYZE accepts functions as they are written in a cell, without STATS_ and the range: PAIRED('a,b', 0.99, 'greater') ANOVA('g,x1'). In the old syntax, parameters now follow the order of the STATS functions and are no longer ignored (ci(x|0.9) now uses 90%).
    • STATS_LINEAR, STATS_LOGISTIC, STATS_BOOTSTRAP: a step in steps is read as a column filter, so regular expressions and index rules select predictors ("/^x/", "x1|/^x2$/"); | inside /.../ does not split steps; * in a step is every column but Y ("age,sex|*": the controls first, then every predictor), it was the error Column * does not exist. They used to show the error lines The predictor /^x/ not found in this table and Step with /^x/ not executed.Because ….
    • Column filters accept regular expressions with commas, such as /^x1{1,2}$/.
    • The test value mu0 in Settings can be any number, including decimals and negative numbers.
    • About has a link to the official website, als-stats.net; it opens in a new tab.
    • Functions list: "Link to documentation" opens each function's page in a new tab (all pages used to open in one and the same window); its tooltip says what the page holds — what every number in the report means.
  • Help
    • STATS_MA and windowSize: the "w:min:kind" window, where each average stands and why rows show ., with examples and the error messages.
    • STATS_DESCRIPTIVE and its metrics: what each metric means (cv is std / mean, relativeDispersion std / median, mad without the 1.4826 factor), synonyms (stdDev = std, rSlope = regressionSlope, wmean = weightedMean, spd), percentiles on one 0–100 scale and quartiles as in SPSS, empty cells for metrics that are not defined, and skipped text columns.
    • STATS_ANOVA and posthoc: an empty posthoc means auto (Tukey after a classic ANOVA, Games–Howell after Welch), "none" or FALSE turns it off; the table appears only when the ANOVA is significant; the report sections and error messages.
    • welch and posthoc: the allowed values list everything a formula accepts — TRUE and FALSE for welch, "none", TRUE and FALSE for posthoc.
    • STATS_PARTIAL: missing values are described as they are computed — in a matrix each pair uses the rows complete in its two variables and every control (the help said a row with a gap anywhere was dropped).
    • labels, STATS_FREQUENCIES, STATS_SPLIT_COLS, STATS_CROSSTABS, STATS_CHI2: exact values and ranges label:min:max, labels given in the formula win over the labels of the column, _other, the order of categories (as labels, or numbers ascending and text alphabetically), the missing and not applicable rows, and how split columns are named and placed.
    • STATS_ANALYZE and tests: the new syntax PAIRED('before,after', 0.99, 'greater') next to the old one, parameters in the order of the STATS functions (descriptive(mean,std,n|x1,x2)), regular expressions with brackets in the new syntax only, and how errors are listed after the reports. The broken examples are fixed.
    • colFilter and outputNames: a column name that does not exist is an error, commas inside a regular expression, the rules applied in order, * only on its own, a filter saved in Settings, and new names that must be different. Two STATS_COLUMNS examples named columns that the example table does not have (they now show an error); they use existing columns again.
    • STATS_LINEAR, STATS_LOGISTIC, STATS_BOOTSTRAP: which predictor is left out and why (the written order decides), Y without variance, Y coded 0 and 1 for the logistic model, what ridge lambda changes and that the Settings value applies to both regressions, and the error messages. The examples now compute on real columns.
    • STATS_COMPUTE and query: the arithmetic of an expression (decimals, exponents, ^ right to left, no functions — x^0.5 instead of sqrt), the row metrics, . for missing values (0/0 too), a non-zero value divided by zero as #NUM! in its cell — as =1/0 in Sheets, not an empty cell as the help used to say — and the error messages. STATS_ZSCORES, STATS_NORMALIZE: text with value labels by its codes. STATS_RECODE: reverse as a mirror of the scale and reverse:1:7. STATS_COLUMNS: it returns only the selected columns, in the order of the range, with the names given in the order of colFilter (the help used to say the other columns stay), and <name>_missing without outputNames.
    • Options (alternative, type, homogeneity, welch, ciLevel, mu0, eps): accepted spellings and values, 1/-1 for greater/less, the error message for anything else, and one-sided intervals.
    • Report texts that changed: Levene (based on median) / (based on mean), the one-sample interval of the difference mean − μ₀, the hypothesis named once in t-test titles, the Spearman interval, Kendall p without continuity correction, how Spearman and Kendall p are computed (approximate on fewer than about 10 rows, no permutations), empty cells for undefined correlations and alpha, STATS_CI on one value, and alpha on two items.
    • STATS_NORMALITY is the Shapiro–Wilk part of the SPSS table (no Kolmogorov–Smirnov) and one of the checks, not a rule that picks the test; STATS_KRUSKAL works from two groups; STATS_MANN_WHITNEY names ranks and rating scales instead of "ordinal".
    • STATS_SPEARMAN, STATS_KENDALL: the descriptions say first what each correlation is for; the details of the interval and the p are on the website.
    • posthoc: the table only after a significant ANOVA is a rule of ALS Stats (SPSS prints a requested table anyway), and with two groups the line "Posthoc tests are not performed" appears only then.
    • lambda, STATS_LINEAR, STATS_LOGISTIC: with lambda above 0 nothing is excluded in either regression, and the model F (linear), the omnibus chi-square and AIC/BIC (logistic) are still printed but are not valid tests of a penalized model.
    • STATS_PAIRWISE is described for what it does — it keeps the complete rows, the columns stay the same — and the help of columns explains once what counts as a number: the type of a column, numbers written as text, checkboxes, the sign ., and text with or without value labels.
Version 1.2 — May 1, 2026
  • New categorical analysis functions
    • Added STATS_CROSSTABS() for contingency tables with row totals, column totals, and grand total.
    • Added STATS_CHI2() for Pearson chi-square tests between two categorical columns.
    • Added STATS_CRAMER() for Cramer's V effect size.
    • These reports exclude paired missing values and keep category order from labels when labels are available.
  • Batch analysis updates
    • STATS_ANALYZE() now supports categorical commands: crosstabs, chi2, chisquare, and cramer.
    • Spaces around | in batch commands are now trimmed before running the analysis.
  • Regression fixes
    • Regression functions now use only the selected target and predictors, so unused short columns no longer change the analyzed rows.
    • Interaction terms are built inside the selected regression data and do not change the source table.
    • Hierarchical regression steps now use the same row scope across all declared model variables, making step comparisons consistent.
Version 1.15 — April 30, 2026
  • Correlation report updates
    • STATS_PEARSON(), STATS_SPEARMAN(), and STATS_KENDALL() now show the selected alternative hypothesis in matrix report titles.
    • Correlation confidence intervals are now included directly in the matrix data report instead of being shown as a separate table.
    • Two-variable STATS_SPEARMAN() and STATS_KENDALL() reports now use the same compact vertical layout as STATS_PEARSON().
    • STATS_KENDALL() matrix data now labels the statistic as tau and preserves zero tau values correctly.
    • STATS_SPEARMAN() now handles perfect positive/negative correlations correctly for one-sided alternatives (greater / less).
  • Report title readability
    • Longer selected column lists can now remain visible in report titles before being shortened to a variable count.
Version 1.14 — April 27, 2026
  • Fixed STATS_SPLIT_COLS
Version 1.13 — April 25, 2026
  • Report output updates
    • Report values now return rounded numbers instead of formatted strings.
    • fixed now controls numeric rounding precision, while Google Sheets formatting controls displayed decimal places.
  • Report title cleanup
    • Long variable lists in report titles are shortened to the number of selected variables.
    • Short variable lists are still shown by name.
  • Missing value scope
    • STATS_DESCRIPTIVE() and STATS_FREQUENCIES() now count missing values inside the selected report scope after column filtering.
    • Empty trailing cells outside the selected scope are ignored; empty cells inside the selected scope are still counted as missing.
Version 1.12 — April 23, 2026
  • Install notice UX update
    • Replaced the install-time modal warning with a non-blocking right sidebar notice.
    • Removed action buttons from the install notice to reduce visual noise.
    • Updated install copy for clarity: activation is required in each new spreadsheet before use.
    • Replaced alarming red emphasis with a softer warning-style yellow highlight for "will not work".
Version 1.11 — April 7, 2026
  • Column rename/recode naming updates
    • Shared output naming parser now handles templates with ranges/lists: name{1-3}, name{1,3,6}, reversed ranges (name{4-2}), and empty braces (name{}).
    • Mixed explicit names via | keep safe fallback names (<source>_missing) when generated names are fewer than selected columns.
    • STATS_COLUMNS() now uses in-place rename mode (keeps selected columns in source order; non-selected columns stay untouched).
    • Backward compatibility preserved for non-string output names in recode/rename flows (fallback names are used instead of throwing).
  • Cronbach Alpha update
    • STATS_ALPHA() supports optional 4th argument commonPrefix.
    • If commonPrefix is omitted, prefix is auto-detected from selected item names when possible and appended to title as Cronbach Alpha for <prefix>.
Version 1.10 — April 4, 2026
  • Recode updates
    • STATS_RECODE() now supports the shortcut rule reverse to invert values by unique sorted order.
    • Fixed numeric-string rule detection so rules like 1:7,2:6,... are handled by numeric exact recode logic (instead of string:number mode).
    • reverse behavior is covered across direct recode, single-column recode, and multi-column recode flows.
Version 1.09 — April 3, 2026
  • ColFilter improvements
    • colFilter now supports index-based rules: #N, #A-#B, -#N, -#A-#B.
    • Mixed include/exclude index rules are now handled deterministically by rule order.
    • #... tokens in colFilter are reserved for index syntax to avoid ambiguity with column names.
  • Frequencies fixes
    • STATS_FREQUENCIES() now keeps group order according to labels order.
    • Fixed string labels parsing/type conversion so exact label rules work correctly with numeric source values.
    • Unused labels are no longer emitted as rows with undefined counts.
  • Output naming updates (recode flow)
    • STATS_RECODE() output names now support template naming (for example name{1}, code{5}).
    • Short |-separated output name lists now use safer fallback names for missing entries.
  • New tab function: STATS_COLUMNS(columns,colFilter,outputNames).
    • Renames selected columns in the output table.
    • Supports suffix naming, explicit |-separated names, and template naming (for example name{1}).
    • Supports short explicit name lists with safe fallback names (<oldName>_missing).
Version 1.08 — March 25, 2026
  • Update for summary functions
    • STATS_FREQUENCIES() now returns a more informative expanded report with columns: Variable, Group, Amount, Percentage, Valid Percentage.
    • STATS_DESCRIPTIVE() now supports the missing metric.
    • Functions now support labels row in the input range and mixed numeric/string column handling.
    • Full backward compatibility is preserved for existing workflows, except that the STATS_FREQUENCIES() report is now more informative and expanded.
Version 1.075 — March 4, 2026
  • Empty-row handling fix for tab functions
    • Internal fully empty rows are now preserved instead of being removed before processing.
    • Only trailing empty rows are trimmed, so large column ranges still avoid unnecessary spill expansion.
    • This fixes row-count shrinkage in single-column transforms such as STATS_RECODE() while preserving backward compatibility for trimmed empty tails.
  • Recode improvements
    • STATS_RECODE() now supports direct string-to-number rules such as "male:1,female:2".
    • Existing numeric exact-match and range recode rules keep the same behavior.
    • When explicit output names are passed as a |-separated list with missing entries, fallback names now use <column>_recoded instead of appending the whole raw names string.
Version 1.07 — March 3, 2026
  • Documentation update for transform functions
    • STATS_COMPUTE() and STATS_RECODE() now document the last parameter as outputNames.
    • The parameter description now explains both supported modes: suffix naming and explicit output names passed as a |-separated list.
    • Backward compatibility is preserved: the old postFix behavior still works, only the documentation name was updated.
    • Fixed STATS_COMPUTE() result column order for explicit output names that start with numbers.
Version 1.06 — March 2, 2026
  • Google Sheets regression functions
    • STATS_LOGISTIC() now shows the actual number of performed iterations in the Meta section.
    • STATS_LOGISTIC() help text now explains the report sections and uses a corrected example signature.
    • STATS_BOOTSTRAP() now reports hierarchical steps correctly, including the predictor added at each step.
    • STATS_BOOTSTRAP() output now includes Summary, per-step Meta, and Bootstrap Estimates sections.
    • STATS_BOOTSTRAP() help text and examples now match the current function signature and output structure.
Version 1.05 — February 28, 2026
  • Interface updated across menu sidebars (Functions, Settings, About).
  • Settings panel now loads current saved defaults from server on open.
  • Added menu action: Recalculate STATS formulas (manual refresh after settings updates).
  • Updated Settings hints to explain formula refresh flow.
  • Descriptive comment now shows "population" and "epsilon" notes selectively, only for relevant metrics.