R/descriptive_stats.R

Defines functions iqv.table iqv.default iqv n_nonmissing n_ok n_missing q3 q1

Documented in iqv iqv.default iqv.table n_missing n_nonmissing n_ok q1 q3

#' **[!!]** Descriptive statistics
#'
#' @param y Variable to summarize
#' @param ... futher arguments to methods
#' @inheritParams stats::quantile
#'
#' @return Summary statistic(s).
#' @export
#' @keywords utilities
#'
#' @aliases summary_funs q1 q3 n_missing n_ok
#'
#' @name summary_funs
q1 <- function(y, na.rm = TRUE,
               type = 7, names = FALSE, ...) {
  quantile(y, probs = 0.25, names = names, type = type, na.rm = na.rm, ...)
}

#' @rdname summary_funs
#' @export
q3 <- function(y, na.rm = TRUE,
               type = 7, names = FALSE, ...) {
  quantile(y, probs = 0.75, names = names, type = type, na.rm = na.rm, ...)
}

#' @rdname summary_funs
#' @export
n_missing <- function(y) {
  sum(is.na(y))
}

#' @rdname summary_funs
#' @export
n_ok <- function(y) {
  sum(!is.na(y))
}

#' @rdname summary_funs
#' @export
n_nonmissing <- function(y) {
  sum(!is.na(y))
}

#' @rdname summary_funs
#' @export
# iqv - index of qualitative variation.
# Ranges from 0 (no variation) to 1 (maximum possible variation).
#
# iqv(chickwts$feed)
# with(chickwts, iqv(feed))
#
# iqv(as.table(c(900,   0,   0)))
# iqv(as.table(c(600, 200, 100)))
# iqv(as.table(c(300, 300, 300)))
#
iqv <- function(y, ...) {
  UseMethod("iqv")
}

#' @rdname summary_funs
#' @export
iqv.default <- function(y, ...) {
  # Assert inputs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  checkmate::assert_vector(y, any.missing = FALSE)

  # Calculate ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  f <- table(y, useNA = "no")
  iqv.table(f)
}

#' @rdname summary_funs
#' @export
iqv.table <- function(y, ...) {
  # Assert inputs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  f <- y
  checkmate::assert_integerish(as.vector(f))

  if (length(dim(f)) != 1) {
    stop("`y` must be frequency table of exactly one variable.")
  }

  # Calculate ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  # IQV formula from:
  # Cekanavicius ir Murauskas. Statistika ir jos taikymiai I.
  # TEV 2006 Vilnius, p. 42.
  n <- sum(f)
  k <- length(f)

  # Formula of IQV
  (k * (n^2 - sum(f^2))) / (n^2 * (k - 1))
}
GegznaV/BioStat documentation built on Aug. 14, 2020, 9:30 p.m.