CRAN R_build_status Codecov Bugs Monthly Total

jfa: Bayesian and Classical Audit Sampling

logo

jfa is an R package for statistical audit sampling. The package provides functions for planning, performing, evaluating, and reporting an audit sample compliant with the International Standards on Auditing. Specifically, these functions implement standard audit sampling techniques for calculating sample sizes, selecting items from a population, and evaluating misstatement from a data sample or from summary statistics. Additionally, the jfa package allows the user to create a prior probability distribution to perform Bayesian audit sampling using these functions.

The package and its intended workflow are also implemented with a graphical user interface in the Audit module of JASP, a free and open-source statistical software program.

Overview

For complete documentation of jfa, visit the package website or download the package manual.

  1. Installation
  2. Cheat sheet
  3. Intended workflow
  4. Benchmarks
  5. Statistical tables
  6. References
  7. Package statistics
  8. Contributing

1. Installation

The most recently released version of jfa can be downloaded from CRAN by running the following command in R:

install.packages('jfa')

Alternatively, you can download the development version from GitHub using:

devtools::install_github('koenderks/jfa')

After installation, the jfa package can be loaded with:

library(jfa)

2. Cheat sheet

The cheat sheet below can help you get started with the jfa package and its intended workflow. You can download a pdf version of the cheat sheet here.

cheatsheet

3. Intended workflow

banner

Below you can find an explanation of the available functions in jfa sorted by their occurrence in the standard audit sampling workflow. For detailed examples of how to use these functions, visit the Get started section on the package website.

Create a prior distribution with the auditPrior() function

Lifecycle: stable

The auditPrior() function creates a prior probability distribution according to one of several methods, including a translation of the assessments of the inherent risk and control risk from the audit risk model. The function returns an object of class jfaPrior which can be used with associated summary() and plot() methods. Objects with class jfaPrior can also be used as input for the prior argument in other functions. Moreover, jfaPrior object have a corresponding predict() function to produce the predictions of the prior distribution on the data level.

Full function with default arguments:

auditPrior(method = 'default', likelihood = c('poisson', 'binomial', 'hypergeometric'), 
           N.units = NULL, alpha = NULL, beta = NULL, materiality = NULL, expected = 0, 
           ir = NULL, cr = NULL, ub = NULL, p.hmin = NULL, x = NULL, 
           n = NULL, factor = NULL, conf.level = 0.95)

Supported options for the method argument:

Supported options for the likelihood argument:

Example usage:

# A gamma prior distribution based on minimal information
x <- auditPrior(method = 'default', likelihood = 'poisson')

# A custom beta(1, 10) prior distribution 
x <- auditPrior(method = 'param', likelihood = 'binomial', alpha = 1, beta = 10)

# A beta prior distribution which incorporates inherent risk (70%) and control risk (50%)
x <- auditPrior(method = 'arm', likelihood = 'binomial', materiality = 0.05, ir = 0.7, cr = 0.5)

summary(x) # Prints information about the prior distribution
predict(x, n = 20, cumulative = TRUE) # Predictions for a sample of n = 20

Plan a sample with the planning() function

Lifecycle: stable

The planning() function calculates the minimum sample size for a statistical audit sample based on the Poisson, binomial, or hypergeometric likelihood. The function returns an object of class jfaPlanning which can be used with associated summary() and plot() methods. To perform Bayesian planning, the input for the prior argument can be an object of class jfaPrior as returned by the auditPrior() function, or an object of class jfaPosterior as returned by the evaluation() function.

Full function with default arguments:

planning(materiality = NULL, min.precision = NULL, expected = 0,
         likelihood = c('poisson', 'binomial', 'hypergeometric'), 
         conf.level = 0.95, N.units = NULL, by = 1, max = 5000, 
         prior = FALSE)

Supported options for the likelihood argument:

Example usage:

# Classical planning using the Poisson likelihood
x <- planning(materiality = 0.03, likelihood = 'poisson')

# Bayesian planning using a default minimal information prior
x <- planning(materiality = 0.03, likelihood = 'poisson', prior = TRUE)

# Bayesian planning using a custom beta(1, 10) prior
x <- planning(materiality = 0.03, 
              prior = auditPrior(method = 'param', likelihood = 'binomial', alpha = 1, beta = 10))

summary(x) # Prints information about the planning

Select items with the selection() function

Lifecycle: stable

The selection() function takes a data frame and performs statistical sampling according to one of three algorithms: fixed interval sampling, cell sampling, or random sampling in combination with either record (attributes) sampling or monetary unit sampling (MUS). The function returns an object of class jfaSelection which can be used with associated summary() and plot() methods. The input for the size argument can be an object of class jfaPlanning as returned by the planning() function.

Full function with default arguments:

selection(data, size, units = c('items', 'values'),
          method = c('interval', 'cell', 'random', 'sieve'), values = NULL,
          order = NULL, decreasing = FALSE, randomize = FALSE,
          replace = FALSE, start = 1)

Supported options for the units argument:

Supported options for the method argument:

Example usage:

# Selection using random record (attributes) sampling
x <- selection(data = BuildIt, size = 100, units = 'items', method = 'random')

# Selection using fixed interval monetary unit sampling (using column 'bookValues' in BuildIt)
x <- selection(data = BuildIt, size = 100, units = 'values', method = 'interval', values = 'bookValues')

summary(x) # Prints information about the selection

Evaluate a sample with the evaluation() function

Lifecycle: stable

The evaluation() function takes a sample or summary statistics of the sample and performs evaluation according to the specified method and sampling objectives. The function returns an object of class jfaEvalution which can be used with associated summary() and plot() methods. To perform Bayesian evaluation, the input for the prior argument can be an object of class jfaPrior as returned by the auditPrior() function, or an object of class jfaPosterior as returned by the evaluation() function.

Full function with default arguments:

evaluation(materiality = NULL, min.precision = NULL, method = 'poisson',
           alternative = c('less', 'two.sided', 'greater'), conf.level = 0.95, 
           data = NULL, values = NULL, values.audit = NULL, times = NULL, 
           x = NULL, n = NULL, N.units = NULL, N.items = NULL, 
           r.delta = 2.7, m.type = 'accounts', cs.a = 1, cs.b = 3, cs.mu = 0.5, 
           prior = FALSE)

Supported options for the method argument:

Example usage:

# Classical evaluation using the Poisson likelihood (and summary statistics)
x <- evaluation(materiality = 0.03, x = 1, n = 100, method = 'poisson')

# Bayesian evaluation using a default minimal information prior (and summary statistics)
x <- evaluation(materiality = 0.03, x = 1, n = 100, method = 'poisson', prior = TRUE)

# Bayesian evaluation using a custom beta(1, 10) prior (and summary statistics)
x <- evaluation(materiality = 0.03, x = 1, n = 100, 
                prior = auditPrior(method = 'param', likelihood = 'binomial', alpha = 1, beta = 10))

summary(x) # Prints information about the evaluation

Create a report with the report() function

Lifecycle: experimental

The report() function takes an object of class jfaEvaluation as returned by the evaluation() function and automatically creates a html or pdf report containing the analysis results and their interpretation.

Full function with default arguments:

report(object, file = 'report.html', format = c('html_document', 'pdf_document'))

Example usage:

# Generate an automatic report
report(object = x, file = 'myReport.html')

For an example report, see the following link.

4. Benchmarks

To validate the statistical results, jfa’s automated unit tests regularly verify the main output from the package against the following benchmarks:

5. Statistical tables

Below you can find several informative tables that contain statistical sample sizes, upper limits, one-sided p values, and Bayes factors. These tables are created using the planning() and evaluation() functions provided in the package.

Sample sizes

Upper limits

One-sided p values

Bayes factors

6. References

7. Package statistics

8. Contributing

jfa is an open-source project that aims to be useful for the audit community. Your help in benchmarking and extending jfa is therefore greatly appreciated. Contributing to jfa does not have to take much time or knowledge, and there is extensive information available about it on the Wiki of this repository.

If you are willing to contribute to the improvement of the package by adding a benchmark, please check out the Wiki page on how to contribute a benchmark to jfa. If you are willing to contribute to the improvement of the package by adding a new statistical method, please check the Wiki page on how to contribute a new method to jfa.