# cNORM:news and change-log
This file documents the development of the package as well as open issues or points for further improvements.


### Version in 3.4.1
Date: 11.05.2025


Changes:

*    revision of beta binomial function to robustly handle scales with large n
*    deprecated function calcPolyInLBase removed
*    corrected bug in computeWeights when there is a single SV with two levels, enhanced type safety 
*    Link to NHANES corrected



### Version in 3.4.0
Date: 04.11.2024


Changes:

*    new function 'compare' added to visually compare models
*    inclusion of 10-fold subsampling and averaging of model coefficients in model estimation
     which produces more stable results




### Version in 3.3.1
Date: 16.10.2024


Changes:

*    added check on score data in cnorm.betabinomial
*    switch to rankByGroup in cnorm in case age variable is plausibly grouping variable
*    bug in subtitles of plotPercentileSeries fixed
*    adjusted output and model recommendations in cnorm.cv
*    fixed legend in plotDensity()
*    bug in predictRaw fixed, which caused plotDerivative to plot wrong results
*    improved initial starting and control parameters in cnorm.betabinomial2
*    bugs in diagnostics.betabinomial fixed
*    vignettes revised



### Version in 3.3.0
Date: 2024.08.26


Changes:

*    checkConsistency performance improvement; now runs 100 times faster
*    visualization improvement in 'plotDerivative'
*    bug in subheadline of plotPercentileSeries fixed
*    reduced number of messages
*    Starting work on inclusion of regularized Taylor models. Since simulation
     studies with glmnet did not show improvement, we generate much more models
     and preselect those, which pass an initial consistency check.
     Now, the a consistent model with the highest R2 is selected. R^2 and terms
     can of course still be specified as usual.
*    plotSubset improved: now indicates, which models did not pass the initial 
     consistency check via empty circles
*    Plots improved generally, now prints formula and statistical indicators
     in Greek letters and R^2 with the 2 uppercase
  



### Version in 3.2.0
Date: 2024.08.17


Changes:

*    Parametric modelling with beta binomial functions now fully implemented
*    S3 functions predict, plot and summary added for bet a binomial models
*    Fixed input validation in getNormScoreSE    
*    Started intensive work on regularization in Taylor models (planned for v4.0)
*    Vignette on modelling with beta binomial distribution
*    Transition from lattice to ggplot2
*    Code on covariates removed from the complete package
*    cNORM-Demo vignette revised
*    code simplification in plotting functions, parameters removed
*    new parameter to plot raw scores in plotPercentiles (default FALSE)
*    'buildCnormObject' function added to help with compatibility (joins data and model
     to cnorm object)
*    cNORM.GUI() updated
*    datasets life, mortality and EPM removed
*    performance optimization



### Version in 3.1.0
Date: 2024.07.19


Changes:

*    Added parametric continuous norming with beta binomial family and new functions
     betaCoefficients, betaTable, betaByGroup and betaContinuous; beware - still experimental (Jan. 2024)
*    Fixed bug in bestModels function when predictors are specified     


### Version in 3.0.4
Date: 2023.10.08


Changes:

*    Added warning in 'cnorm' in case, both age and group is specified
*    extended cnorm.cv for use of weights and sliding window
*    added silent option to several functions to reduced the number of messages
*    revised function documentation



### Version in 3.0.3
Date: 2023.05.22


Changes:

*    fixed regression bug in the internal predictNormByRoots-function for R4.3.0
*    added new references
*    new results in printSubset and plotSubset: F-tests on consecutive models
*    internal improvements in calcPolyInLBase2 for retrieving regression function coefficients at specific
     age. This speeds up norm score retrieval by 40%, leading to vast performance improvements in 
     large datasets and in cross validation by cnorm.cv
*    Added WPS publisher as a funder. WPS helped financing the weighting procedure for post stratification 
     based on iterative proportional fitting ("Raking")
*    citeEntry replaced by bibentry in inst/citation  



### Version in 3.0.2
Date: 2022.08.18


Changes:

*    fix for bug in normTable function when ranking order is reversed
*    added option to apply conventional norming in 'cnorm' by leaving
     out the grouping variable
*    extended plotPercentiles, plotNorm and plotRaw for usage with conventional
     norming
*    vignette extend for explaining conventional norming



### Version in 3.0.1
Date: 2022.04.11


Changes:

*    t parameter added to data preparation in the shiny GUI
*    default paremeters in cnorm now k = 5 and t = 3
*    error in shiny GUI corrected: Download data
*    WeigtedRegression vignette extended
*    Additional descriptive information in modeling when using weights
*    Vignette cNORM-Demo revised




### Version in 3.0.0
Date: 2022.03.28


Changes:

*    Major version: Includes weighting functions to overcome biased norm samples,
     by providing marginal means factor levels of stratification variables in the 
     population as a data frame
     New function: computeWeights()
*    Newly developed, highly performant and unbiased weighted ranking procedure
*    New vignette: 'WeightedRanking'
*    Modelling returns info on range of weights if post stratification is used
*    automatically remove  cases with missings in 'cnorm' function
*    ppvt dataset exchanged with unstratified sample with additional background
     variables (migration, region, sex)
*    Documentation updated
*    Author sequence changed. Alex is now first and corresponding author. Please
     direct questions to lenhard@psychometrica.de
*    minor changes: if(class(x) == "cnorm") exchanged with if(inherts(x, "cnorm"))
     throughout package




### Version in 2.1.1
Date: 2021.10.13


Changes:

*    normList parameter in plotNormCurves not working in non T score scales fixed 
*    lower CI not reported correctly in normTable and rawTable corrected
*    documentation in normTable and rawTable extended
*    internal prettyPrint function corrected; now it displays interval in the middle of the tables
     correctly in rawTable and normTable function



### Version in 2.1.0
Date: 2021.08.10


Changes:

*    add remarks on decrease of age power parameter in computePowers when R2 is low
*    add parameter for powers of a in computePowers, prepareData, bestModel and cnorm
*    predictNorm is now able to handle NA
*    count, how often terms had been selected in cnorm.cv
*    pretty print option added to normTable and rawTable to collapse intervals and round
     to meaningful precision
*    Bug corrected in normTable when using age vector to compute series of norm tables     



### Version in 2.0.4
Date: 2021.07.24


Changes:

*    Fixed bug in setting getNormScoreSE and added option to calculate RMSE (now default)
*    Corrected y axis label in plotDerivative
*    changes header in plotNorm from SE to RMSE
*    exceptions catched in predictNorm 



### Version in 2.0.3 
Date: 2021.04.10


Changes:

*    Fixed bug in setting minNorm and maxNorm in predictNorm, if attribute is missing
*    Aligned function in predictNorm for single scores and vectors
*    Code simplification
*    suboptimal model selection when leaps.setups dependencies found; bug fixed



### Version in 2.0.2
Date: 2021.01.30


Changes:

*    Fixed bug in rankBySlidingWindow due to ranking
*    New function for building groups and assign group means: getGroups
*    display errors fixed in plotPercentiles, function optimized
*    Fixed regression: Clipping of minRaw and maxRaw in predictRaw



### Version in 2.0.1
Date: 2021.01.05


Changes:

*    Fixing errors in the context of weighted percentile modelling
*    Code change of weighted rank estimation from https://aakinshin.net/posts/weighted-quantiles/
     code by Andrey Akinshin
*    Additional message for plotting, when weighted percentiles are used
*    Use weighted percentiles in plotPercentiles
*    automatic weighting deactivated in bestModel, since it is already applied in ranking
*    suppressWarnings in weighted ranking



### Version in 2.0.0 (release)
Date: 2020.12.04
Version 2.0.0 features many fundamental improvements both relating to the procedure but as well to the
package itself. It introduces weighted percentiles and thus helps in correcting violations of 
representativeness in the norm sample. There is a new main function 'cnorm()' that returns a
cnorm object. Most functions now accept this cnorm object and do not require separate data objects and
statistical models. And finally S3 methods plot(), summary() and print() have been introduced.


Changes:

*    Preparing for next major release with complete redesign of S3 method structure and weighting
*    New function cnorm() that does all the data preparation and modelling in one step
     It returns a cnorm object, which can be used in all model check, plotting and prediction functions
*    New S3 functions: print, plot, summary
*    Vignette revised
*    All functions have been extended to accept a cnorm object instead of data and / or model
*    prepareData, rankByGroup and rankBySlidingWindow no have the option to provide a
     weighting parameter to compensate for imbalances. The percentiles are weighted
     accordingly. The weighted ranking is based on an adaption of wtd.rank of the Hmisc
     package, provided by the courtesy of Frank Harrell
*    bestModel automatically uses the weighting parameter from the ranking (if applied)
*    prepareData, rankByGroup and rankBySlidingWindow can now directly handle vectors
     instead of a data frame, e. g.
     rankByGroup(raw = elfe$raw, group = elfe$group)
*    If no group is provided and only a raw vector is present e.g. ranByGroup(raw=elfe$raw),
     traditional ranking of a single group is done
*    Power parameter k added to prepareData
*    New convenience function modelSummary
*    New method getNormScoreSE added: Compute SE for regression based norm scores sensu Oosterhuis
     van der Ark & Sijtsma (2016)



### Version in 1.2.4 (release)
Date: 2020.10.14


Changes:

*    Improvements in Shiny GUI: download buttons for data and model, introduction page, CI for norm tables
*    Descending order bugs corrected in Shiny GUI
*    Option to automatically compute confidence intervalls in rawTable() and normTable() via CI and reliability parameters
*    repeated cross validation cnorm.cv now calculates RMSE for norm scores
*    repeated cross validation cnorm.cv can now use a prespecified formula
*    data cleaning in output of cnorm.cv



### Version in 1.2.3 (release)
Date: 2020.06.18

Changes:

*    Error in citation fixed
*    Improved explanations in the Shiny GUI
*    Additional 'Update'-Buttons in norm and raw scores plot in visualization tab of shiny gui
*    removed unnecessary import askYesNo
*    spell checking in diverse function descriptions
*    correction for monotonicity in rawTable and normTable (now default)
*    predictRaw can now return matrices for list of norm x age
*    new dataset added on the basis of the EPM paper
*    Bug in plotPercentiles fixed for datasets with descending ranking order
*    'descend' parameter added to prepareData
*    rawTable can now return matrices


### Version in 1.2.2 (fifth release)
Date: 2019.09.18

Changes:

*    Error in rankByGroup and rankBySlidingWindow when covariate variable name was used
*    warning added to rankBySlidingWindow in case, age and group do not correspond
*    rankBySlidingWindow accepts age variable in addition to age variable name
*    plotPercentiles now allows plotting both degrees of binary covariate
*    code cleaning in plotPercentiles
*    bestModel automatically does plotPercentiles if parameter plot set to TRUE
*    Citation file added





### Version in 1.2.1
Date: 2019.08.01

Changes:

*    prepareDate issues warnings if age and group values do not relate
*    modified message in bestModel function if R2 is not reached
*    if R2 and terms are not specified in bestModel function, fall back to model 5
     in case R2 does not reach .99 in most complex model
*    Additional message in bestModel in case of high number of terms     
*    Code simplification in computePowers by using 'poly' function
*    Performance improvement and code cleaning in checkConsistency
*    Multiple R2 output added to computePowers
*    new option to add index labels to data points in plotSubset
*    cnorm.cv now respects sliding window ranking
*    silent parameter added to prepareData and computePowers
*    rankBySlidingWindo and rankByGroup add width parameter to data preparation
*    pCutoff in cnorm.cv now adjusts for sample size



### Version in 1.2.0 (fourth release)
Date: 2019.07.26

Changes:

*   Preparing for the inclusion of a binary covariate. The package is been
    rewritten by larger parts
    NOTE: The inclusion of a covariate is currently still experimental and not
    optimized. Please use carefully! If covariates are central for your research
    question, consider packages like GAMLSS or quantreg
*   Entering systematic testing
*   BUG fixed: retrieving normtables and norm scores in large datasets could
    produce outlier (hashing function to remove duplicates was flawed)
*   Corrected keywords for datasets




### Version in 1.1.9
Date: 2019.07.07

Changes:

*   weighting added to bestModel-function
*   cast to data.frame in prepareData method to prevent SPSS import failing
*   Ordering of raw table when using descending values
*   Warning message added to computePowers function in case the multiple R2 between the explanatory variable
    and the raw score is below .05; modelling norm scores in dependence of age is questionable in that case
*   prepareData, rankByGroup and rankBySlidingWindow now accept variables instead of variable names as well
*   rankByGroup and rankBySlidingWindow display warning in case of small groups



### Version in 1.1.8 (Third release to CRAN)
Date: 2019.03.15 (mainly testing and cleaning minor errors)

Changes:

*   fixing exceptions
*   group and age can now be deactivated, resulting in conventional norming procedure, based in ranking + regression over powers of L



### Version in 1.1.7
Date: 2019.02.28

Changes:

*   bestModel function now accepts a formula as a predictors object
*   plotPercentile now accepts descending ranking
*   rawTable and normTable adapted for descending values
*   rangeCheck prints additional information
*   Leaner GUI with more options
*   predictNorm now much faster through using lookup tables, large speed gains as well for depending functions
*   Setting age = FALSE in computePowers prevents computation of powers of age and interactions. All plotting and modelling functions changed accordingly. cNORM in this case models norm score tables simply based on regression without computing different groups
*    normTable automatically chooses default values for minNorm, maxNorm and step



### Version in 1.1.6
Date: 2019.02.07, third release on CRAN

Changes:

*   Improvement to cv function in GUI and in package



### Version in 1.1.5
Date: 2019.02.06, third release on CRAN

Changes:

*   Cross Validation added to shiny GUI
*   cnorm.cv documentation improved
*   added information to BestModel output




### Version in 1.1.4
Date: 2018.12.18

Changes:

*   scale parameter added to prepareData function
*   fix for plotNorm by group with missing values



### Version in 1.1.3 - Second release on CRAN
Date: 2018.12.09

Changes:

*   rmarkdown moved from imports to suggests
*   cnorm.cv info added to README



### Version in 1.1.2
Date: 2018.12.08

Changes:

*   deleted code in vignette needing to much build time
*   removed UTF-8 attributes from ppvt dataset and cleared all datasets from non ASCII signs
*   deleted code in vignette needing to much build time
*   additional tests run on R-hub
*   added rmarkdown to imports



### Version in 1.1.1
Date: 2018.12.01

Changes:

*    Parameters added to cv.norm: Significance level for stratification process
*    Additional plot in cv.norm: delta R2 in norm score validation
*    Example in readme improved
*    CDC data: group variable set to center of interval
*    descend parameter removed from plotPercentileSeries, plotPercentiles, checkConsistency,
     rawTable & normTable; instead take default from model; vignette updated accordingly
*    stop criterion added to data sampling in cnorm.cv  
*    cv.norm: lines added to R2 delta plot
*    normTable and rawTable can now produce list of tables



### Version in 1.1.0
Date: 2018.11.23

Changes:

*    Cross validation added: new function: cnorm.cv() for assessing RMSE for raw data and R2 and CROSSFIT for norm data
*    Data table output for cnorm.cv
*    rankBySlidingWindow now accessible via prepareData()
*    group, raw, age and width can now be provided in cnorm.cv
*    parameter for full cross validation (separate ranking for train and validation)
*    Additional NA checks and warning messages
*    plotPercentiles now with R2adjr in title



### Version in 1.0.3
Date: 2018.11.16

Changes:

*    Additional instruction on series section of visualization tab in Shiny GUI
*    Code cleanup in bestModel function
*    SE added to plotNorm based on Oosterhuis, van der Ark & Sijtsma (2016)
*    RMSE added to model object (m$subsets), to plotRaw and to plotSubset
*    additional plotting options added to GUI:
     +    plotting of differences in raw and norm plot
     +    RMSE in model selection information function



### Version in 1.0.2
Date: 2018.11.16

Changes:

*    Improvements in precision of plotPercentiles
*    error corrected in ppvt dataset: groups did not represent group means
*    function description in 'ranBySlidingWindow' updated
*    checking for missing packages in shiny GUI improved
*    user menu asking to install missing packages added
*    derive-function: more general approach with "order" parameter
*    plotDerivative function can now plot derivatives of higher order
*    exclude cases with missing values in rankByX functions
*    percentile columns added to rawTable and normTable
*    additional data cleansing for data objects imported from Excel file format



### Version in 1.0.1  - First release on CRAN
Date: 2018.11.03

Changes:

*   Improvements in the GUI: Waiting circle shown to indicate ongoing computation
*   Additional help texts on best model in GUI
*   Additional plotting options in cNORM.GUI(): Raw Score and Norm Score plots
*   User input asking for missing suggested packages to install



### Version in 1.0.0
Date: 2018.10.26

Changes:

*   Final polishing finished; releasing first major version



### Version in 0.9.20
Date: 2018.10.24

Changes:

*   GUI with Shiny finished
*   ... now working on finally releasing the package



### Version in 0.9.19
Date: 2018.10.20

Changes:

*   API changed: predictNormValue renamed to predictNorm
*   Shiny GUI enhanced
*   Additional plotting options in plotNorm and plotRaw
*   less strict warning messages in predictNormValue function and checkConsistency



### Version in 0.9.18
Date: 2018.10.08

Changes:

*   First shiny prototype (many thanks to Sebastian Gary); please use cNORM.GUI() to start user interface


### Version in 0.9.17
Date: 2018.10.01

Changes:

*   predictNormValue fixed and optimized (many thanks to Sebastian Gary)
*   API change with respect to predictNormValue, rawTable and plotNorm
*   plotNorm: norm score boundaries guessed by min and max score from modelling 



### Version in 0.9.16
Date: 2018.09.21

Changes:

*   bug in predictNormValue partly fixed (further optimization necessary)
*   API change: plotValues renamed to plotRaw
*   new function: plotNorm



### Version in 0.9.15
Date: 2018.09.18

Changes:

*   plotDensity function added
*   attributes added to data.frame to increase usability



### Version in 0.9.13
Date: 2018.09.16

Changes:

*   predictNormValue with higher precision and effectivity
*   rawTableQuick removed from source code



### Version in 0.9.12
Date: 2018.09.11

Changes:

*   'simulateRasch' to simulate test data was added
*   old sim functions removed
*   documentation improved
*   new parameters to bestModel in order to force covariates into regression
*   additional checks in box cox functions



### Version in 0.9.9
Date: 2018.09.06

Changes:

*   Enhancements to the 'prepareData' function



### Version in 0.9.8
Date: 2018.09.05

Changes:

*   Life expectancy dataset of the World Bank added
*   Mortality of infants per 1000 life birth from 1960 to 2017 added
*   Minor changes in functions to check data integrity and exceptions
*   Vignette updated



### Version in 0.9.7
Date: 2018.08.31

Changes:

*   License changed to AGPL
*   Capitalizations in labels of plots
*   min and max renamed to minRaw and maxRaw (where appropriate)
*   terminology: standard or normal score instead of norm; score instead of value
*   new function for model validation: plotPercentileSeries
*   many functions now draw the default values from the model (plotting and predicting)



### Version in 0.9.6
Date: 2018.08.28

Changes:

*   Minor improvements in function descriptions
*   API of plotSubset changed due to new plotting options



### Version in 0.9.5
Date: 2018.08.25

Changes:

*   New, large dataset for BMI centile estimation from CDC included, type ?CDC for explanation
*   Extensive documentation available via https://www.psychometrica.de/cNorm_en.html (in progress)



### Version in 0.9.4
Date: 2018.08.23

Changes:

*   Generating group variable in rankBySlidingWindow
*   parameters in plotPercentile to restrict age range
*   ppvt dataset restricted



### Version in 0.9.3
Date: 2018.08.20

Changes:

*   plotNormCurves enhanced (Thanks to Sebastian Gary)
*   new function to plot semi parametric analyses via box cox power transformation: plotBoxCox
*   variable "explanatoryVariable" and "normVariable" in computePowers function renamed for easier API



### Version in 0.9.2
Date: 2018.08.18

Changes:

*   Additional dataset: vocabulary development (PPVT4)



### Version in 0.9.1
Date: 2018.08.16

Changes:

*   Added predictRawBC and predictNormBC for computing norm and raw values based on the parametric box cox power function parameters
*   New contributor: Sebastian Gary, welcome to the team!
*   Missing raw variable definition in plotValues corrected



### Version in 0.9.0
Date: 2018.08.14

Changes:

*   Box Cox power transformation for regression model at specific age: optional parametric modelling for non-parametric regression model



### Version in 0.8.9

Date: 2018.08.13

Changes:

*   Convenience method for selection best model added: 'printSubset'
*   predictNormValue now accepts lists of values as well



### Version in 0.8.8
Date: 2018.08.12

Changes:

*   parameter checks added
*   new parameter 'descriptives' added to rankByGroup and rankBySlidingWindow added to retrieve descriptive statistics for each observation
*   improvements in the documentation
*   errors in bestModel and plotPercentiles corrected, when variable names are not as in example sample



### Version in 0.8.6
Date: 2018.08.11

Changes:

*   new function: 'rankBySlidingWindow' which can be used for data sets with continuous age variables
*   error corrected for data being loaded from SPSS files
*   improvements in the documentation



### Version in 0.8.5
Date: 2018.08.06

Changes:

*   new function for simulating data



### Version in 0.8.3
Date: 2018.08.03

Changes:

*   Code cleaning and formatting



### Version in 0.8.2
Date: 2018.08.02

Changes:

*   new internal function: rawTableQuick for speeding up generating norm tables
  Still has to be checked for working with descending values.
  Works only, if model assumptions are valid



### Version in 0.8.0
Date: 2018.08.01

Changes:

*   new function: rawTable allows creating norm tables with assignment of raw -> norm values solves inverse function of regression model with brute force



### Version in 0.7.11
Date: 2018.07.31

Changes:

*   improved 'prepareData' function



### Version in 0.7.10
Date: 2018.07.28

Changes:

*   Description for computePowers improved
*   option in plotPercentile to use percentile scale or self defined c(mean, sd)



### Version in 0.7.9
Date: 2018.07.28

Changes:

*   'descend' parameter added to consistencyCheck and normTable
*   dependency rColorBrewer removed; plotPercentiles changed accordingly
*   latticeExtra moved to 'suggests'



### Version in 0.7.8
Date: 2018.07.27

Changes:

*   'descend' parameter added to consistencyCheck and normTable



### Version in 0.7.7
Date: 2018.07.27

Changes:

*   Small changes to error messages in bestModel
*   printing of min value in plotDerivate removed



### Version in 0.7.6

Date: 2018.07.27

Changes:

*   parameter 'predictors' added to allow self defined regression functions, e. g. for the inclusion of other ranking parameters like sex
*   'type' parameter added to 'plotPercentile' to allow selection of quantile algorithm. Please consult help(quantile) for further information on 'type'



### Version in 0.7.5
Date: 2018.07.26

Changes:

*   dependency dplyr removed: rankByOrder and plotPercentiles rewritten
*   API-change: derivationPlot renamed to plotDerivate
*   small changes to vignette and readme
*   parameter "raw" added to rankByGroup to specify raw value variable
*   rawVar and groupVar in plotPercentiles renamed to raw and group to make API more coherent



### Version in 0.7.4

Date: 2018.07.25

Changes:

*   rankByOrder: ranking in descending order added



### Version in 0.7.3
Date: 2018.07.25

Changes:

*   Additional ranking algorithms: Filliben, Levenbach, Yu & Huang; API changed to index
*   scale can be specified as double vector with c(mean, sd)
*   vignette updated accordingly



### Version in 0.7.2
Date: 2018.07.24

Changes:

*   None. This is the first release
