\name{NEWS}
\title{News for Package \pkg{sasLM}}
\section{Version 1.0.1 (2026-06-20)}{
  \itemize{
    \item{\code{IQLM} added: a self-contained Installation Qualification (IQ) report in pdf documenting whether \pkg{sasLM} is correctly installed, intact, loadable, and operational (environment, version, dependency satisfaction, MD5 file integrity, namespace/exports, a functional \code{GLM} check against a SAS reference, an overall QUALIFIED/NOT QUALIFIED verdict, a sessionInfo appendix, and a per-file md5 checksum appendix).}
    \item{\code{OQLM} added: a self-contained Operational Qualification (OQ) report in pdf. It runs a set of \code{GLM} scenarios (shipped in \file{inst/OQ}) on the user's machine and lists every computed value - the ANOVA table, the fit statistics, and the Type I, II and III sums of squares - next to its SAS/textbook reference value, with the absolute and relative difference and a pass flag, and an overall verdict. The first release covers \code{GLM}; other procedures can be added by extending \file{inst/OQ}. Reference values are the SAS PROC GLM / textbook results documented in the package validation report.}
    \item{\code{writeMD5LM} added: writes the standard R \file{MD5} integrity manifest into an installed package directory (using \code{tools::md5sum}) so that the \code{IQLM} file-integrity check reports PASS for local installs. CRAN installs already include this manifest.}
    \item{\code{addSigFieldLM} added (and a \code{sigField} argument to \code{IQLM}/\code{OQLM}): insert Adobe Acrobat Reader signature fields into the report PDF (pure base-R PDF incremental update, no external tools) so it can be signed with one click in the free Acrobat Reader, instead of printing and scanning.}
    \item{\code{signPDFLM} and \code{verifyPDFLM} added: digitally sign a report PDF (a detached SHA-256 signature written to \file{<pdf>.sig}, using the \pkg{openssl} package) and verify it, as a scriptable alternative.}
    \item{No change to any existing computation. The three vignette sources (\file{bioequivalence-with-sasLM.Rmd}, \file{sasLM-for-SAS-users.Rmd}, \file{stratified-2x2-tables.Rmd}) were moved from \file{inst/doc} to the standard \file{vignettes} directory and \code{VignetteBuilder: knitr} was declared, so the vignettes are registered and rebuilt by the build tools instead of being shipped as pre-built static files.}
    \item{The static validation report PDFs were moved from \file{inst/doc} to \file{inst/extdoc} so they are plain installed files (they were never registered vignettes) and are no longer removed by build tools that treat \file{inst/doc} as a vignette-output directory.}
  }
}
\section{Version 1.0.0 (2026-06-12)}{
  \itemize{
    \item{First stable release.}
    \item{Large speed-up for big data: Type II/III contrast generation (ex, e2, e3) and REG no longer form an n-by-n projection (hat) matrix. With 20,000 rows and about 60 columns, GLM is more than 100 times faster (165 s to 1.3 s), REG about 48 times, and aov2/aov3/EMS/RanTest/T3test benefit similarly. Results are unchanged.}
    \item{GLM and REG with Weights: Fitted and Residual are now returned in the original scale as SAS OUTPUT P= R= does. Previously they were returned in the sqrt(weight)-transformed scale.}
    \item{GLM and REG with Weights: observations with nonpositive weights are now excluded from the analysis (including degrees of freedom) as SAS does, with a warning.}
    \item{GLM and REG now validate the length of Weights and align it correctly when rows with NA are dropped from Data.}
    \item{PDIFF with adj="dunnett": ref now defaults to the first level as SAS does, an invalid ref is rejected with a clear message, and the two-level case no longer fails.}
    \item{UNIV now uses quantile type 2 (the SAS default) for Q1, Q3, and IQR as documented. It previously used type 6, the SPSS default.}
    \item{All manual pages were reviewed and revised: typos and grammar corrected, and several value sections were aligned with the actual outputs (Cor.test, RDinv, RRinv, ORinv, ORcmh, UNIV, regD, seqBound, OR).}
    \item{RDmn (stratified) confidence bounds now use the score statistic recomputed at each candidate value instead of a fixed point estimate approximation, and root-finding tolerances in RDmn and RRmn are tightened to 1e-10. RDmn and RRmn now agree with ratesci::scoreci(weighting="MN", skew=FALSE) to 8 decimal places including zero-cell strata.}
    \item{ORmn (stratified) is improved as planned since 0.10.6. It now uses the inverse-variance weighted score with the score bias correction, and the common odds ratio point estimate is the zero of the weighted score statistic. It agrees with ratesci::scoreci(contrast="OR", stratified=TRUE, skew=FALSE) by Pete Laud to 7 decimal places over standard, multi-strata, zero-cell, and extreme cases. ORmn1 (single stratum) remains the classical Miettinen-Nurminen interval.}
  }
}

\section{Version 0.10.8 (2026-03-08)}{
  \itemize{
    \item{Code quality improvement: T/F replaced with TRUE/FALSE for CRAN policy compliance.}
    \item{Global assignment (<<-) in ORmn removed using environment object pattern.}
    \item{options(warn) replaced with suppressWarnings() in ORmn, RRmn, RDmn, RDmn1 to prevent options leak on error.}
    \item{Unsafe 1:length() pattern replaced with seq_along()/seq_len() across 14 files.}
    \item{Redundant comparison in G2SWEEP (BasicUtil.R) fixed.}
    \item{Max function uses na.rm=TRUE for consistency with Min.}
    \item{DESCRIPTION cleaned up: removed redundant Author/Maintainer fields.}
  }
}

\section{Version 0.10.7 (2025-09-28)}{
  \itemize{
    \item{CumAlpha function improved to handle changing z values and arbitrary time points.}
    \item{OBFBound function added for exact O'Brien-Fleming bounds.}
    \item{GLM function validated again, and the result is OK.}
  }
}

\section{Version 0.10.6 (2025-07-22)}{
  \itemize{
    \item{Thanks to Pete Laud, RDmn and RRmn are corrected. ORmn will be improved further later.}
  }
}

\section{Version 0.10.5 (2024-10-02)}{
  \itemize{
    \item{RDmn1 for extreme case (R1=1, R2=1) fixed.}
  }
}

\section{Version 0.10.4 (2024-05-31)}{
  \itemize{
    \item{g2inv function bug with p=0 fixed.}
  }
}

\section{Version 0.10.3 (2024-05-01)}{
  \itemize{
    \item{UNIV can compute geometric mean and CV excluding NA values}
  }
}

\section{Version 0.10.2 (2024-02-23)}{
  \itemize{
    \item{g2inv function for generalized type 2 inverse matrix for non-square matrix is newly introduced.}
    \item{G2SWEEP checks if the input is a square matrix.}
  }
}

\section{Version 0.10.1 (2024-01-24)}{
  \itemize{
    \item{dunnett adjustment no longer use Miwa algorithm}
  }
}

\section{Version 0.10.0 (2023-11-19)}{
  \itemize{
    \item{Functions for group sequential design (seqBound, CumAlpha, PocockBound, Drift, ExitP, seqCI) are added.}
    \item{If the matrix dimension for Dunnett test is less than 11, Miwa algorithm is used for multi-variate t distribution.}
  }
}

\section{Version 0.9.12 (2023-09-08)}{
  \itemize{
    \item{RRinv revised}
  }
}

\section{Version 0.9.11 (2023-08-09)}{
  \itemize{
    \item{RDmn1 can handle more extreme cases.}
  }
}

\section{Version 0.9.10 (2023-07-10)}{
  \itemize{
    \item{Typo correction}
  }
}

\section{Version 0.9.9 (2023-06-05)}{
  \itemize{
    \item{TTEST, mtest, tmtest, ztest, vtest functions are added.}
    \item{Every time just before calling mvtnorm::pmvt, mvtnorm::qmvt, set.seed(5) is called.}
  }
}

\section{Version 0.9.8 (2023-05-05)}{
  \itemize{
    \item{RanTest with no fixed effect and only 1 random effect return correct result.}
    \item{T3test supports H and E options}
    \item{LIbin, LIpois, LInorm, and RDLI are removed, and will be included in a separate package.}
  }
}

\section{Version 0.9.7 (2023-04-05)}{
  \itemize{
    \item{Skewness function revised.}
    \item{Bugs of some cases at RDmn1, RDmn, ORmn1, ORmn are fixed.}
    \item{LIbin, LIpois, LInorm, and RDLI are introduced.}
  }
}

\section{Version 0.9.6 (2023-03-06)}{
  \itemize{
    \item{RanTest function added for test with random effect.}
    \item{T3MS will be deprecated soon. Use EMS instead.}
    \item{SLICE function's options are renamed.}
    \item{Typos in manual are corrected.}
  }
}

\section{Version 0.9.5 (2023-02-06)}{
  \itemize{
    \item{GLM, REG, aov1, aov2, aov3 functions return yhat and residuals with Resid=TRUE option.}
    \item{aov1, aov2, aov3 functions return beta coefficients with BETA=TRUE option.}
    \item{T3test is significantly improved for complex cases.}
    \item{RDmn handles more extreme values.}
    \item{LSM plotting order is ascending by default.}
  }
}

\section{Version 0.9.4 (2023-01-07)}{
  \itemize{
    \item{ORmn: Special cases of OR - 0, infinity or NaN - are checked in the input.}
  }
}

\section{Version 0.9.3 (2022-11-04)}{
  \itemize{
    \item{GLM and REG supports weighted regression with WEIGHTS option.}
    \item{REG displays tests using HC0, HC3, and White's first and second moment specification test.}
    \item{Code refactored to cope better with a singular or ill-conditioned matrix.}
    \item{Some unused arguments such as eps (in GLM, REG, aov1, aov2, and aov3) are removed.}
    \item{\code{e1}, \code{e2}, \code{e3} arguments are simplified to reduce unnecessary calculation.}
  }
}

\section{Version 0.9.2 (2022-10-05)}{
  \itemize{
    \item{corFisher function for correlation test by Fisher's Z transformation is added.}
    \item{RDmn, RRmn, ORmn use MN weights for point estimates also.}
    \item{RDmn1 finds confidence interval better.}
    \item{Some typo fixed.}
  }
}

\section{Version 0.9.1 (2022-09-05)}{
  \itemize{
    \item{RDinv, RRinv, ORinv, ORcmh for stratified or meta-analysis of 2x2 are added.}
    \item{GLM reports adjusted R-squared}
    \item{QuartileRange returns type 2 IQR by default.}
    \item{UNIV returns MAD and type 2 IQR too.}
    \item{Coll calculates like SAS, not like SPSS}
    \item{lfit help updated}
  }
}

\section{Version 0.9.0 (2022-08-05)}{
  \itemize{
    \item{RD, RR, OR, RDmn1, RRmn1, ORmn1, RDmn, RRmn, ORmn functions for 2x2 table with or without stratification are added.}
  }
}

\section{Version 0.8.1 (2022-05-10)}{
  \itemize{
    \item{Description corrected in satt help.}
  }
}

\section{Version 0.8.0 (2022-03-21)}{
  \itemize{
    \item{GLM function's arguments changed: SOLUTION to BETA, LSMEANS to EMEAN}
  }
}

\section{Version 0.7.0 (2022-03-14)}{
  \itemize{
    \item{ANOVA function is removed, because it is almost a duplicate of GLM function.}
    \item{GLM function's arguments changed.}
  }
}

\section{Version 0.6.7 (2022-03-12)}{
  \itemize{
    \item{Descriptive statistics functions such as N, Mean, SD, SEM, Min, Max, Median, UCL, LCL, trimmedMean, Range, QuartileRange, Skweness, SkewnessSE, Kurtosis, KurtosisSE now accept a non-numeric vector that can be converted to a numeric vector.}
    \item{A bug with no incercept model in \code{e3} is fixed.}
  }
}

\section{Version 0.6.6 (2022-02-19)}{
  \itemize{
    \item{A bug at "adj" option in \code{LSM} fixed, which also affects GLM.}
    \item{\code{PLOT} option related codes are revised.}
  }
}

\section{Version 0.6.5 (2022-01-20)}{
  \itemize{
    \item{\code{UNIV} added for descriptive statistics}
  }
}

\section{Version 0.6.4 (2021-11-25)}{
  \itemize{
    \item{\code{G2SWEEP} became faster for large sparse matrix}
  }
}

\section{Version 0.6.3 (2021-09-18)}{
  \itemize{
    \item{\code{REG} function warns in case of completely aliased model and data and increases epsilon tolerance to 1e-5.}
  }
}

\section{Version 0.6.2 (2021-08-19)}{
  \itemize{
    \item{\code{Diffogram} and \code{plotDiff} option 'Title' removed. Use 'main' option instead.}
  }
}

\section{Version 0.6.1 (2021-07-15)}{
  \itemize{
    \item{Descriptive statistic functions (Mean, SD, ...) return NA with inappropriate inputs.}
    \item{\code{geoMean} and \code{geoCV} added}
    \item{\code{reverse} option added to \code{PDIFF}}
  }
}

\section{Version 0.6.0 (2021-06-15)}{
  \itemize{
    \item{\code{Diffogram} added}
    \item{\code{PLOT} option added to \code{LSM} and \code{PDIFF}}
    \item{\code{LSM} supports grouping when a term is specified.}
    \item{\code{PDIFF} and \code{est} support common multiple comparison methods, such as "lsd"(no adj), "bon", "tukey", "scheffe", "duncan", and "dunnett".}
    \item{\code{ESTM} function added.}
    \item{\code{CONTR} function added.}
    \item{\code{SLICE} function added.}
    \item{\code{satt} changed the way of weights calculation. Now, one can give integer weights.}
    \item{\code{lsm} now properly supports models without intercept.}
    \item{\code{e2} now properly supports single factor models (Type II SS of Oneway ANOVA) without intercept.}
    \item{Checks inputs and errors during calculation more.}
  }
}

\section{Version 0.5.3 (2021-05-15)}{
  \itemize{
    \item{\code{aov2} and \code{e2} support no intercept model.}
    \item{\code{aov1}, \code{aov3}, \code{ANOVA}, \code{GLM} handle no intercept model properly.}
    \item{A column of estimability will be shown when some coefficients are not estimable in \code{REG} and \code{GLM}.}
  }
}

\section{Version 0.5.2 (2021-04-15)}{
  \itemize{
    \item{Some errata in help/manual are corrected.}
    \item{\code{CV} (coefficient of variation) in percentage added.}
    \item{\code{cSS} has now \code{m} arguments for non-zero mean hypothesis.}
    \item{A bug with no intercept model in \code{lr} fixed.}
    \item{Incomplete interaction term names of \code{PDIFF} fixed.}
  }
}

\section{Version 0.5.1 (2021-03-15)}{
  \itemize{
    \item{\code{LSM} does not show estimates which are not estimable, and supports more models}
    \item{\code{est} has more arguments to test estimability}
  }
}

\section{Version 0.5.0 (2021-02-15)}{
  \itemize{
    \item{\code{lr0} function for simple linear regressions with each independent variable}
  }
}

\section{Version 0.4.1 (2021-02-15)}{
  \itemize{
    \item{\code{lr} function for linear regression with g2 inverse}
    \item{\code{tsum} wrapper function for \code{tsum0}, \code{tsum1}, \code{tsum2}, \code{tsum3}}
    \item{\code{bt} function removed to remove dependency on \code{knitr}}
    \item{\code{NOINT} option in REG, ModelMatrix is removed. Use conventional R formula.}
    \item{Order of coefficients (parameters) changed to be more similar to SAS.}
    \item{\code{T3MS} revived.}
    \item{\code{EMS} has different arguments from T3MS.}
  }
}

\section{Version 0.4.0 (2021-01-29)}{
  \itemize{
    \item{\code{GLM} function now has \code{lsm} option for least square mean}
    \item{\code{LSM} function added for Least Square Means in SAS}
    \item{\code{PDIFF} to do pairwise comparison}
    \item{\code{BY} function to run functions by levels of a variable}
    \item{\code{tsum0}, \code{tsum1}, \code{tsum2}, \code{tsum3} functions for the summary table of a continuous dependent variable}
    \item{\code{bk} function to beautify the output of knitr::kable()}
    \item{\code{bt} function to beautify the output of tsum2, tsum3}
    \item{\code{G2SWEEP} function explained}
    \item{\code{regD} function optimized}
    \item{\code{T3MS} renamed as \code{EMS}, because it can handle other types also.}
    \item{\code{CIest} function's arguments and return values changed.}
  }
}

\section{Version 0.3.0 (2021-01-16)}{
  \itemize{
    \item{\code{regD} function added for influence diagnostics}
  }
}

\section{Version 0.2.1 (2020-09-27)}{
  \itemize{
    \item{\code{T3test} a bug fixed for one row table}
    \item{\code{CIest} added for confidence interval estimation}
  }
}

\section{Version 0.2.0 (2020-09-18)}{
  \itemize{
    \item{\code{e3} function revised for RANDOM test functionality}
    \item{\code{satt} added for Satterthwaite approximation}
    \item{\code{T3MS} added for Type 3 Expected Mean Square formula}
    \item{\code{T3test} added for hypothesis test with different error term}
  }
}

\section{Version 0.1.4 (2020-06-02)}{
  \itemize{
    \item{Unnecessary lines in source removed}
    \item{Contrast input for \code{cSS} changed from column vectors to row vectors.}
    \item{\code{REG} can return \code{lfit} result with \code{summarize=FALSE} argument.}
  }
}

\section{Version 0.1.3 (2020-05-13)}{
  \itemize{
    \item{Type III SS function improved}
    \item{Miscellaneous errata corrected}
  }
}

\section{Version 0.1.2 (2020-04-13)}{
  \itemize{
    \item{Code refactored}
  }
}

\section{Version 0.1.1 (2020-04-08)}{
  \itemize{
    \item{An erratum is fixed}
  }
}

\section{Version 0.1.0 (2020-04-08)}{
  \itemize{
    \item{First version}
    \item{TO DO: Function to add - e4, aov4}
    \item{TO DO: Items to add - R2, R2ADJ - v0.4.1 \code{lr} does this.}
  }
}
