## ----setup, include = FALSE-------------------------------
knitr::opts_chunk$set(
  tidy.opts = list(width.cutoff = 60),
  collapse = TRUE,
  comment = "#>"
)
options(width = 60)

library(cNORM)

## ----pmf-figure, fig.height = 3.6, fig.width = 7, echo = FALSE----
x <- 0:45
op <- par(mar = c(4, 4, 1, 1))
plot(x, dcmp(x, mu = 20, nu = 3), type = "l", lwd = 2, col = "#1b9e77",
     ylim = c(0, 0.17), xlab = "Raw score", ylab = "P(Y = y)", bty = "l")
lines(x, dcmp(x, mu = 20, nu = 1),   lwd = 2, col = "#7570b3")
lines(x, dcmp(x, mu = 20, nu = 0.5), lwd = 2, col = "#d95f02")
legend("topright", bty = "n", lwd = 2,
       col = c("#1b9e77", "#7570b3", "#d95f02"),
       legend = c(expression(nu == 3 ~ "(under-dispersed)"),
                  expression(nu == 1 ~ "(Poisson)"),
                  expression(nu == 0.5 ~ "(over-dispersed)")))
par(op)

## ----data-------------------------------------------------
head(speed)
range(speed$fluency)

## ----dispersion-------------------------------------------
by_year <- split(speed$fluency, floor(speed$age))
round(t(sapply(by_year, function(x)
  c(n = length(x), mean = mean(x), sd = sd(x), dispersion = var(x) / mean(x)))), 2)

## ----fig1, fig.height = 4, fig.width = 7------------------
model.open <- cnorm.cmp(age = speed$age, score = speed$fluency,
  mu_degree = 3, nu_degree = 2, # default values
)

## ----ceiling-mass-----------------------------------------
age_old <- max(speed$age)
tab <- normTable.cmp(model.open, ages = age_old, start = 0, end = 150)[[1]]
p_above <- 1 - tab$Pcum[tab$x == 75]

## ----fig-ceiling, fig.height = 4, fig.width = 7-----------
model.cmp <- cnorm.cmp(
  age = speed$age,
  score = speed$fluency,
  mu_degree = 3,
  nu_degree = 2,
  max_score = 75,
  plot = TRUE
)

## ---------------------------------------------------------
summary(model.cmp, age = speed$age, score = speed$fluency)

## ----eval = FALSE-----------------------------------------
# # Grid: degrees 1 to 4 for mu, 0 to 2 for nu (0 = constant dispersion).
# # Use min_nu = -1 to include the Poisson model (nu fixed at 1) as a candidate.
# model.best <- autoselect.cmp(
#   age = speed$age,
#   score = speed$fluency,
#   max_mu = 4,
#   max_nu = 2,
#   min_nu = 0,
#   max_score = 75
# )
# 
# # Evaluated models, sorted by BIC
# head(model.best$selection$evaluated)

## ---------------------------------------------------------
cases <- data.frame(
  age = c(7.5, 8.5, 9.5, 10.5),
  raw = c(18, 24, 30, 35)
)

cases$T_Score <- round(predict(model.cmp, age = cases$age, score = cases$raw), 1)
cases$PR <- round(predict(model.cmp, age = cases$age, score = cases$raw,
                          type = "percentile"), 1)
cases

## ---------------------------------------------------------
tables <- normTable(
  c(8.0, 9.0),
  model.cmp,
  reliability = 0.88,
  CI = 0.90
)

head(tables[["8"]], 10)

## ---------------------------------------------------------
moments <- predictMoments(model.cmp, age = seq(7, 11, by = 1), censor = FALSE)
moments$dispersion <- moments$variance / moments$mean
round(moments, 2)

## ----fig2, fig.height = 4, fig.width = 7------------------
model.taylor <- cnorm(raw = speed$fluency, age = speed$age, plot = FALSE)

compare(
  model.taylor,
  model.cmp,
  age = speed$age,
  score = speed$fluency,
  title = "Taylor Polynomial vs. Conway-Maxwell-Poisson"
)

