s20x 3.4.0
New features
- predict20x() is now an S3 generic with methods for
lm,glmandtslmfits, so one function covers them all. For aglmfit,typecan be"response"(the default),"link"or"odds". tslm fits withar(p)errors are not supported yet. - predict20x(), summary1way(), summary2way() and summaryStats() now return classed objects with print methods. What they print is unchanged, and printing a saved result shows the same table.
- predict20x() accepts
conf.levelanddigits, and summary1way() and summary2way() acceptdigits. The oldercilevelanddigitstill work. -
LazyData: truemeansdata()is now optional. - The package now has a website, https://stats-uoa.github.io/s20x/, with the function reference and all the case studies as articles, and a logo.
Deprecated and removed
- Deprecated predictCount() and predictGLM() in favour of predict20x().
- Deprecated ciReg(), layout20x(), freq1way(), residPlot(), levene.test(), estimateContrasts(), crossFactors(), crosstabs(), onewayPlot(), twosampPlot(), autocorPlot() and skewness(), which the course no longer uses directly. summary1way() still draws its plot, and summaryStats() still reports skewness.
- Deprecated the
shapiro.wilkargument of normcheck(). - Removed Levene’s test from eovcheck(). Passing
levenenow gives a warning and is ignored. - Removed the demo scripts.
Bug fixes
Results that changed
- summary2way():
page = "nointeraction"appliedFUNtwice, soFUN = expprinted exp(exp(x)). - tslm(): residual diagnostics followed row order rather than
time, which gave misleading ACF and time plots.ar(p)models are now fitted intimeorder, so for data not already sorted, residuals() and fitted() come back in time order. Coefficients do not change. - tslm():
offset()terms were dropped without warning. Usingoffset()withar(p)now gives an error, because nlme::gls() does not support it. - eovcheck():
lmobjects were refitted from the call, which lostsubsetandweightsand failed for models with nodataargument or a stored formula. - predict20x() and predictCount(): named columns in
newdataare now matched by name. They were previously assigned by position, even when in a different order from the model. - predict20x() on a
glmfit now givesglmintervals rather than treating the model as anlmfit. - onewayPlot() on an
lmobject, and summary1way(), ignoredconf.level,interval.type,pooledand the other plotting options. - rowdistr():
comp = "within"printed blank chi-square statistics and p-values.
Errors on valid input
- predict20x(), predictCount() and predictGLM() now work with transformed terms such as
log(x)andfactor(g). - summary1way() now works with transformed terms such as
factor(x). - summary2way():
page = "interaction"no longer fails when a factor level contains a hyphen, and its headings now name the first factor rather than printingc("gender", "picture"). - onewayPlot(y, g) no longer fails when
ylabelandflabelare not supplied. - pairs20x():
pch,col,cexandbgnow work with the base engine, and apply to the scatter plots. - displayPairs() keeps all comparisons when two factors share a level name.
- summaryStats() now accepts
na.action. - cooks20x() now accepts
axisOptswith only some options set. - tslm() now finds variables local to a calling function when
dataortimeis supplied.
Smaller fixes
- summary2way():
print.out = FALSEnow suppresses printing for the default output. - eovcheck():
colnow sets the smoother colour with the base engine. - normcheck() labels a vector’s histogram from the call rather than always
x, and accepts hex and palette-number colours. - openCaseStudy() no longer opens an editor in non-interactive sessions.
Case studies
- Case studies 5.2 and 10.3 now render. A damaged header stopped them working.
- Case study 5.2: corrected the R-squared (43.1%, not 36.7%), the dummy variable description, and a formula that referred to burn rather than price.
- Case study 9.1: corrected swapped intervals for method 3 against methods 1 and 2.
- Case study 10.1: removed a stray digit from an interval, and a decrease given as negative.
- Moved the case studies to predict20x(), replaced
TandFwithTRUEandFALSE, and styled the code with styler.
Documentation and development
- Rewrote the README and moved the release history into this file.
- Corrected the documentation, which described ggplot2 and GGally as optional. Both are required dependencies.
- Strengthened the tests with independent checks of the ANOVA results, prediction intervals, tslm AR fits and plotting defaults.
- Added GitHub workflows for the website, case study styling and R-hub checks.
s20x 3.3.0
CRAN release: 2026-07-01
- Prepared s20x 3.3.0 as a CRAN-facing release after optional plotting engine polish and the tslm() calling-environment compatibility fix.
- Removed obsolete deprecated diagnostics methods that triggered roxygen warnings during documentation regeneration.
- Updated diagnostic API tests so modcheck.lm removal is treated as deliberate while modelcheck remains the supported model diagnostic helper.
- Removed stale roxygen argument tags for deleted diagnostics methods so regenerated Rd usage sections pass CRAN checks.
- Replaced non-standard DESCRIPTION contributor roles with CRAN-standard ctb roles.
- Rendered casestudy() files in a fresh environment with globalenv() as the parent instead of passing .GlobalEnv directly.
- Validated with strict tests, local as-CRAN checks, and external CRAN preflight submissions.
s20x 3.2.325
- Added regression tests comparing tslm() calling-environment fits with explicit data-frame fits.
- Covered both ordinary lm-backed fits and AR gls-backed fits using the existing beer.df and airpass.df teaching datasets.
- Preserved the Stage 21.1 tslm() implementation while locking in the new data-optional behaviour before CRAN submission.
- Kept tests offline, deterministic, and focused on user-visible teaching workflows.
- Validated by the standard s20x stage workflow.
s20x 3.2.323
- Updated tslm() so formulas can be evaluated from the calling environment when data is omitted, matching the familiar lm() and glm() workflow.
- Preserved explicit data-frame use for tslm() while using model-frame-based data handling for safer internal evaluation.
- Added deterministic tests covering omitted data and explicit data for ordinary tslm() fits.
- Kept the change small and backward compatible for the Stage 21.1 CRAN-preparation workflow.
- Validated by the standard s20x stage workflow.
s20x 3.2.320
- Added final release-polish wording for optional plotting engines, with base graphics remaining the default.
- Confirmed Stage 20.1 is limited to dependency-safety and release-note polish rather than new plotting functionality.
- Preserved compatibility by treating ggplot2 and GGally as optional engines rather than required plotting dependencies.
- Used the stage workflow’s validation-mode detection so only changed files trigger package checks.
s20x 3.2.319
- Added final release-polish wording for optional plotting engines, with base graphics remaining the default.
- Confirmed Stage 20.1 is limited to dependency-safety and release-note polish rather than new plotting functionality.
- Preserved compatibility by treating ggplot2 and GGally as optional engines rather than required plotting dependencies.
- Used the stage workflow’s validation-mode detection so only changed files trigger package checks.
s20x 3.2.318
- Adjusted pairs20x() ggplot2 diagonal histogram panels so the y-limits reserve base-like headroom for variable labels.
- Moved diagonal labels above the histogram bars rather than inside the plotted counts.
- Added a regression test for the ggplot2 histogram panel y-limit contract.
- Preserved the base graphics engine as the default and kept ggplot2/GGally optional.
- Validated by the standard s20x stage workflow.
s20x 3.2.317
- Added the missing ggplot2 geom_segment() import used by the base-like modelcheck() Cook’s distance panel.
- Set the returned pairs20x() GGally matrix axisLabels field to document the outside-axis contract used by the optional ggplot2 engine.
- Preserved the Stage 19.7 pairs20x() visual-parity changes and the base graphics default.
- Validated by the standard s20x stage workflow.
s20x 3.2.315
- Added the missing ggplot2 geom_text import used by the modelcheck() Cook’s distance labels.
- Kept the Stage 19.6.3 base-like ggplot2 modelcheck layout and Cook’s distance display unchanged.
- Preserved the base graphics engine as the default and kept ggplot2 optional.
- Validated by the standard s20x stage workflow.
s20x 3.2.313
- Changed the optional eovcheck() ggplot2 smoother example to use the peru.fit regression model rather than the oyster one-way ANOVA-style fit.
- Kept the oyster example for the ggplot2 object-return and Levene/two-standard-deviation demonstrations where it remains appropriate.
- Avoided loess singularity warnings in the documented smoother example while preserving package behaviour.
- Validated by the standard s20x stage workflow.
s20x 3.2.312
- Added an explicit loess formula to the optional modelcheck() ggplot2 smoother so printing the diagnostic plot object is silent.
- Preserved the Stage 19.6 base-like ggplot2 diagnostic styling and Cook’s distance vertical-line display.
- Kept the base graphics engine as the default and preserved the optional ggplot2 object-return paths.
- Validated by the standard s20x stage workflow.
s20x 3.2.310
- Polished the optional ggplot2 eovcheck output so the two-standard-deviation reference lines remain visible.
- Included the plus/minus two-standard-deviation limits in the plotted y-range and matched the base plot line weight more closely.
- Removed the default grey ggplot2 panel styling from the optional eovcheck engine to keep the teaching plot closer to base graphics.
- Kept the base graphics engine as the default and preserved the optional ggplot2 object-return path.
- Validated by the standard s20x stage workflow.
s20x 3.2.309
- Extended the optional normcheck() ggplot2 histogram density curve across the full displayed x-axis range.
- Kept the histogram as a native ggplot2 geom_histogram() layer while replacing stat_function() with explicit density data.
- Preserved base graphics defaults and existing normcheck() return behaviour.
- Documented the Stage 19.5 normcheck density-curve polish notes.
- Validated by the standard s20x stage workflow.
s20x 3.2.308
- Polished the optional ggplot2/GGally engine for pairs20x() while preserving base graphics as the default.
- Renamed internal pairs20x ggplot2 helpers to use clearer *_ggplot2 names.
- Kept the existing ggplot2/GGally example and return-class tests for the optional plot matrix path.
- Documented the Stage 19.4 pairs20x plotting-engine review notes.
- Validated by the standard s20x stage workflow.
s20x 3.2.307
- Polished the optional ggplot2 engine for modelcheck() while preserving base graphics as the default.
- Renamed internal modelcheck ggplot2 helpers and list classes to use clearer *_ggplot2 names.
- Reworked ggplot2 aesthetic mappings to use data-column pronouns and avoid external-vector warnings.
- Added a print method for multiple ggplot2 modelcheck plots and ggplot2-engine examples for individual diagnostics.
- Added offline regression tests for the renamed class and clean plot printing.
- Validated by the standard s20x stage workflow.
s20x 3.2.306
- Polished the optional ggplot2 engine for eovcheck() while preserving base graphics as the default.
- Renamed internal eovcheck ggplot2 helpers to use clearer *_ggplot2 names.
- Reworked ggplot2 aesthetic mappings to use data-column pronouns and avoid external-vector warnings.
- Added ggplot2-engine examples and an offline regression test for clean plot printing.
- Validated by the standard s20x stage workflow.
s20x 3.2.305
- Restored the documented s20xNormcheckGgplot2 return class while retaining the clearer internal s20xNormcheck_ggplot2 class alias.
- Preserved the Stage 19.1 ggplot2 normcheck plotting fixes, examples, and naming cleanup.
- Fixed compatibility with existing diagnostic plotting tests after the internal class-name cleanup.
- Preserved base graphics as the default plotting engine and kept ggplot2 optional.
- Validated by the standard s20x stage workflow.
s20x 3.2.303
- Added regression tests that scan controlled R and test files for namespace operators in executable code.
- Added regression tests that scan controlled R and test files for dynamic namespace lookup helpers.
- Reworked the internal-test helper to avoid getFromNamespace() while preserving access to unexported helpers during tests.
- Preserved the Stage 18.6 import-based plotting cleanup and base graphics defaults.
- Validated by the standard s20x stage workflow.
s20x 3.2.302
- Replaced dynamic ggplot2 and GGally plotting function lookups with direct calls backed by roxygen import declarations.
- Moved ggplot2 and GGally into Imports so their functions can be declared through NAMESPACE.
- Removed namespace operator usage from controlled package and test code by using imported functions and a shared internal-test helper.
- Preserved base graphics as the default plotting engine.
- Validated by the standard s20x stage workflow.
s20x 3.2.301
- Refactored normcheck ggplot2 Q-Q and histogram builders to use grouped optional plotting function lookups.
- Refactored the eovcheck ggplot2 diagnostic builder to use grouped optional plotting function lookups.
- Preserved base graphics as the default engine and kept ggplot2 optional.
- Validated by the standard s20x stage workflow.
s20x 3.2.300
- Added a grouped optional plotting function lookup helper for ggplot2 implementations.
- Refactored modelcheck ggplot2 residual and Cook distance builders to use grouped helper lookups.
- Preserved base graphics as the default engine and kept ggplot2 optional.
- Validated by the standard s20x stage workflow.
s20x 3.2.299
- Centralised optional plotting function lookup behind the internal getPlottingFunction() helper.
- Replaced repeated direct getExportedValue() calls in the ggplot2 and GGally plotting implementations.
- Preserved base graphics as the default engine and kept ggplot2/GGally optional.
- Validated by the standard s20x stage workflow.
s20x 3.2.298
- Added matchPlottingEngine() as a shared internal helper for plotting engine argument matching.
- Replaced repeated match.arg(engine) calls in normcheck(), eovcheck(), modelcheck(), and pairs20x().
- Added a Stage 18.2 plotting engine dispatch note for the cleanup and deferred candidates.
- Ignored the local .s20x_validation_mode file so R CMD check tarballs do not include validation state.
- Preserved base graphics defaults, optional ggplot2/GGally behavior, and teaching-oriented plotting output.
This file records user-facing and developer-facing changes for s20x. It is a release-note summary, not a commit-by-commit history.
s20x 3.2.297
- Added a shared internal helper for optional plotting package availability checks.
- Replaced duplicated ggplot2 and GGally engine checks in normcheck(), eovcheck(), modelcheck(), and pairs20x().
- Added a Stage 18.1 plotting audit note to record remaining cleanup candidates.
- Preserved base graphics defaults, optional ggplot2/GGally behavior, and teaching-oriented plotting output.
s20x 3.2.296
- Clarified README guidance for ggplot2 diagnostic return values.
- Added tests that pin named-list return contracts for multi-plot ggplot2 diagnostics.
- Confirmed single selected diagnostics still return individual ggplot objects where appropriate.
- Preserved base graphics as the default plotting engine.
s20x 3.2.295
Modernisation
- Completed a final consistency pass over README and package-level plotting-engine documentation.
- Clarified optional ggplot2 and GGally requirements for diagnostic plotting helpers.
- Ignored stage-runner validation scratch files in package builds so strict checks do not report them as hidden-file notes.
- No plotting behaviour or public API changed.
s20x 3.2.293
Modernisation
- Added a README-level explanation of the optional diagnostic plotting engines while preserving base graphics as the default teaching workflow.
- Added a Stage 17.4 developer note recording the documentation-only scope and optional-dependency guard pattern.
- No plotting behaviour or public API changed.
s20x 3.2.292
- Removed no-op examplesIf blocks from deprecated, unexported legacy helper documentation.
- Clarified the deprecated boxqq(), stripqq(), and modcheck() descriptions without restoring exported examples.
- Preserved legacy helper behavior while reducing CRAN-facing example clutter in generated Rd files.
- Regenerated documentation should be produced by devtools::document() during the stage runner.
s20x 3.2.291
- Refreshed legacy helper documentation so deprecated, unexported functions no longer show direct internal-call examples.
- Replaced older case-study dontrun examples with interactive examples for CRAN-facing documentation hygiene.
- Preserved case-study and deprecated-helper behavior while making the examples clearer for current teaching material.
- Regenerated documentation should be produced by devtools::document() during the stage runner.
s20x 3.2.290
- Clarified that the default base plotting engine preserves direct teaching graphics while optional ggplot2 engines return reusable plot objects.
- Added guarded examples for optional ggplot2 and GGally plotting engines in normcheck(), eovcheck(), modelcheck(), and pairs20x().
- Kept ggplot2 and GGally usage behind requireNamespace() guards so examples remain compatible when optional packages are unavailable.
- Regenerated documentation should be produced by devtools::document() during the stage runner.
s20x 3.2.288
Development notes
- Archived the Stage 16 plotting modernisation developer note under Completed.
- Recorded that pairs20x(), normcheck(), eovcheck(), and modelcheck() now have optional ggplot2 engines with base graphics preserved as the default.
- Kept this as a documentation wrap-up stage with no intended plotting behavior changes.
s20x 3.2.274
Data
- Add
nzarrivals.df, a monthly Stats NZ Infoshare arrivals data set, and fix the Stage 14colors()import so note-level checks remain strict.
s20x 3.2.268
Modernisation
- Deprecated legacy diagnostic plotting helpers
modelcheck(),modcheck(),boxqq(),stripqq(), and theautocor.plot()alias, and removed them from the exported API while keeping their internal compatibility definitions.
s20x 3.2.267
Modernisation
- Added prediction-wrapper regression coverage for multi-row return shapes, binomial-logit
predictGLM()output, and wrapper-level quasi interval multiplier behaviour without changing prediction internals.
s20x 3.2.264
Modernisation
- Standardised
predictGLM()return shape to a data frame with stablefit,lwr, anduprcolumns, while preserving link/response scale calculations and legacy fallback to link-scale output for unsupportedtypevalues.
s20x 3.2.262
Modernisation
- Consolidated prediction-wrapper
newdatadata-frame validation into a shared internal helper and removed duplicated validation frompredictGLM()without changing prediction output or error text.
s20x 3.2.259
Modernisation
- Audited exported help examples for strict-check suitability, confirmed remaining synthetic examples are deterministic or guarded, and tightened
freq1way()documentation wording without changing behaviour.
s20x 3.2.257
Modernisation
- Guarded the
displayPairs()help example so it only runs the optionalemmeansworkflow whenemmeansis available, keeping examples suitable for strict checks without changing package behaviour.
s20x 3.2.256
Modernisation
- Clarified prediction helper and AR-error model documentation so teaching wrappers are distinguished from ordinary
predict()and independent-error ANOVA behaviour without changing package behaviour.
s20x 3.2.255
Modernisation
- Replaced the artificial
summary1way()help example withcomputer.df, made thesummaryStats()matrix example dataset-based, and tightened summary-helper documentation wording without changing behaviour.
s20x 3.2.252
Modernisation
- Replaced the
interactionPlots()help examples with thearousal.dfteaching dataset and clarified the deprecated vector-form example wording without changing plotting behaviour.
s20x 3.2.248
Modernisation
- Documented and tested
crosstabs()androwdistr()printed-output and invisible-return conventions without changing behaviour.
s20x 3.2.247
Modernisation
- Documented and tested
summary2way()printed-output and invisible-return conventions without changing behaviour.
s20x 3.2.246
Modernisation
- Documented and tested
summary1way()printed-output and invisible-return conventions without changing behaviour.
s20x 3.2.245
Modernisation
- Documented and tested
summaryStats()printed-output and invisible-return conventions without changing behaviour.
s20x 3.2.240
Modernisation
- Consolidated shared confidence-interval arithmetic for prediction teaching wrappers without changing public prediction behaviour.
Modernisation
- Extracted shared internal prediction helpers for linear-model and GLM teaching wrappers without changing public prediction behaviour.
Modernisation
- Added a deeper Stage 11 legacy API audit focused on outdated teaching wrappers, deprecation candidates, and future modernisation priorities.
Modernisation
- Added a camelCase
outputDiralias for rendered case-study helpers while preservingoutput_dircompatibility. - Clarified prediction helper documentation so their teaching-wrapper roles and return values are explicit.
- Added a Stage 11 API consistency audit for prediction helpers before changing public interfaces.
- Completed the Stage 10 style-normalisation sweep for remaining legacy helpers without changing public interfaces.
- Normalised style in Cook’s distance plotting helpers without changing their public interface.
- Normalised style in count prediction helpers without changing their public interface.
- Normalised style in row distribution helpers without changing their public interface.
- Normalised style in residual diagnostic plotting helpers without changing their public interface.
- Normalised style in autocorrelation plotting helpers without changing their public interface.
- Normalised style in trend scatter plotting helpers without changing their public interface.
- Normalised style in two-way ANOVA summary helpers without changing their public interface.
- Normalised style in summary statistics helpers without changing their public interface.
- Normalised style in the deprecated one-way frequency table helper without changing its public interface.
- Normalised style in the one-way ANOVA summary helper without changing its public interface.
- Normalised style in package version and skewness utility helpers without changing their public interface.
- Normalised style in regression confidence interval helpers without changing their public interface.
- Normalised style in generalised linear model prediction helpers without changing their public interface.
- Normalised style in one-way comparison helper functions without changing their public interface.
- Normalised style in case study helper functions without changing their public interface.
- Normalised style in deprecated grouped QQ plotting helpers.
- Normalised style in small utility files as part of the staged modernisation work.
- Added package infrastructure for automated R CMD check runs.
- Updated package build ignores for repository-only infrastructure files.
s20x 3.2.2
CRAN release: 2026-01-14
A small number of the datasets have been slightly altered, and their associated documentation accordingly. The changes consist of adding some useful extra variables to the three time series datasets airpass.df, beer.df and larain.df. These variables are t which is just a time index to save the user creating it if they want to fit a lag response model, and either month and year or both. These are factor variables giving the year the observation recorded, and if relevant the month. These extra variables can be used for time series analysis or plots.
In addition we have made an attempt to use SI units rather than imperial units where sensible. Some examples of where it is sensible: converting inches to millimetres, pounds to kilograms, and acre-feet/gallons to litres (or megalitres). Some examples of where it is not sensible are carats (industry standard) and converting blood pressue to kiloPascals instead of millimetres of mecury (mm Hg), which again is the health profession standard. If these conversions have been made, then they have been done as extra variables added to the dataset, rather than replacing the original measurements. The logic for this is to preserve the datasets as is to avoid lecture notes mismatches - at least for the time being.
s20x 3.1-24
A new function called modcheck has been added. This allows all four standard 20x model checking plots – residuals versus fitted values, a normal Q-Q plot, a histogram of residuals, and a Cook’s distance plot – to be drawn on the same plot at once. This function needed a much more flexible version of normcheck, and needed modifications to eovcheck and cooks20x. I have not put it on CRAN yet because of the chance that it will fail for our current students. We really need some unit testing in this package so that this process can be sped up.
s20x 3.1-21
Ben Stevenson added some code to summary2way so the attribute information from TukeyHSD is preserved. That is so you see this
> summary2way(fit, page = "interaction")
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = fit)
$`store:crust`
instead of this
> summary2way(fit, page = "interaction")
$`store:crust`
