## ----setup, include = FALSE-------------------------------
knitr::opts_chunk$set(tidy.opts=list(width.cutoff=60),
  collapse = TRUE,
  comment = "#>"
)
library(cNORM)
library(ggplot2)


## ----echo=FALSE, fig.align='center', fig.width=10---------
knitr::include_graphics("plos.png")

## ----eval=FALSE-------------------------------------------
#  ## Basic example code for modeling the sample dataset
# 
# library(cNORM)
# 
# # Start the graphical user interface (needs shiny installed)
# # The GUI includes the most important functions. For specific cases,
# # please use cNORM on the console.
# 
# cNORM.GUI()
# 
# # Using the syntax on the console: The function 'cnorm' performs
# # all steps automatically. Please specify the raw score and the
# # grouping variable. The resulting object contains the ranked data
# # via object$data and the model via object$model.
# 
# cnorm.elfe <- cnorm(raw = elfe$raw, group = elfe$group)
# 
# # Plot different indicators of model fit depending on the number of
# # predictors
# 
# plot(cnorm.elfe, "subset", type=0) # plot R2
# plot(cnorm.elfe, "subset", type=3) # plot MSE
# 
# # NOTE! At this point, you usually select a good fitting model and rerun
# # the process with a fixed number of terms, e. g. 4. Avoid models
# # with a high number of terms:
# 
# cnorm.elfe <- cnorm(raw = elfe$raw, group = elfe$group, terms = 4)
# 
# # Powers of age can be specified via the parameter 't'.
# # Cubic modeling is usually sufficient, i.e., t = 3.
# # In contrast, 'k' specifies the power of the person location.
# # This parameter should be somewhat higher, e.g., k = 5.
# 
# cnorm.elfe <- cnorm(raw = elfe$raw, group = elfe$group, k = 5, t = 3)
# 
# # Visual inspection of the percentile curves of the fitted model
# 
# plot(cnorm.elfe, "percentiles")
# 
# # Visual inspection of the observed and fitted raw and norm scores
# 
# plot(cnorm.elfe, "norm")
# plot(cnorm.elfe, "raw")
# 
# # In order to compare different models, generate a series of percentile
# # plots with an ascending number of predictors, in this example between
# # 5 and 14 predictors.
# 
# plot(cnorm.elfe, "series", start=5, end=14)
# 
# # Cross validation in order to choose appropriate number of terms
# # with 80% of the data for training and 20% for validation. Due to
# # the time consumption, the maximum number of terms is limited to 10
# # in this example with 3 repetitions of the cross validation.
# 
# cnorm.cv(cnorm.elfe$data, max=10, repetitions=3)
# 
# # Cross validation with prespecified terms of an already
# # existing model
# 
# cnorm.cv(cnorm.elfe, repetitions=3)
# 
# # Print norm table (in this case: 0, 3 or 6 months at grade level 3)
# # (Note: The data is coded such that 3.0 represents the beginning and
# # 3.5 the middle of the third school year)
# 
# normTable(c(3, 3.25, 3.5), cnorm.elfe)
# 

## ----eval=FALSE-------------------------------------------
# # Application of cNORM for the generation of conventional norms
# # for a specific age group (in this case age group 3):
# 
# data <- elfe[elfe$group == 3,]
# cnorm(raw=data$raw)

## ----eval=FALSE-------------------------------------------
#     # Creates a grouping variable for the variable 'age'
#     # of the ppvt data set. In this example, 12 equidistant
#     # subgroups are generated.
# 
#     group <- getGroups(ppvt$age, 12)

## ----fig0, fig.height = 4, fig.width = 7------------------
library(cNORM)
# Models the 'raw' variable as a function of the discrete 'group' variable
model <- cnorm(raw = elfe$raw, group = elfe$group)

## ---------------------------------------------------------
print(model)

## ----eval=FALSE-------------------------------------------
# # Generates a series of percentile plots with increasing number of predictors
# 
# plotPercentileSeries(model, start = 1, end = 15)

## ----fig1, fig.height = 4, fig.width = 7------------------
    plot(model, "subset", type = 0)

## ---------------------------------------------------------
predictNorm(15, 4.7, model, minNorm = 25, maxNorm = 75)


## ---------------------------------------------------------
predictRaw(55, 4.5, model, minRaw = 0, maxRaw = 28)

# ... or for several norm scores and age levels ...
predictRaw(c(45, 50, 55), c(2.5, 3, 3.5), model) 

## ---------------------------------------------------------
normTable(3, model, minRaw = 0, maxRaw = 28, minNorm=30.5, maxNorm=69.5, step = 1)

## ---------------------------------------------------------
rawTable(3.5, model, minRaw = 0, maxRaw = 28, minNorm = 25, maxNorm = 75, step = 1, CI = .95, reliability = .89)

# generate several raw tables
table <- rawTable(c(2.5, 3.5, 4.5), model, minRaw = 0, maxRaw = 28)

## ----irt-cnorm, eval = FALSE------------------------------
# library(TAM)
# 
# # 1. Simulate a Rasch dataset with 700 persons and 30 items
# data <- simulateRasch(n = 700, items.n = 30)
# data <- data$sim[, (ncol(data$sim) - 30):(ncol(data$sim) - 1)] # only use item data
# 
# # 2. Fit a Rasch model and extract WLE person abilities
# tam.model <- tam(data)
# theta     <- tam.wle(tam.model)$theta
# 
# # 3. Model continuous norms for the latent ability scores
# cnorm.model <- cnorm(raw = theta, group = data$sim$group)

## ----fig2, fig.height = 7, fig.width = 7------------------
plot(model, "raw", group = TRUE)

## ----fig3, fig.height = 7, fig.width = 7------------------
plot(model, "norm", group = TRUE, minNorm = 25, maxNorm = 75)

## ----fig4, fig.height = 4, fig.width = 7------------------
plot(model, "density", group = c (2, 3, 4))

## ----fig5, fig.height = 4, fig.width = 7------------------
plot(model, "derivative")

