tests/testthat/test-indicators.R

context("Biodiversity Indicators")



test_that("'abundance' has been correctly implemented", {

    # reference data: unique taxa
    taxon <- c("a", "b", "c", "d", "e")
    count <- c( 3,   7,  11,  17,  13)
    expected_unnamed <- count
    d <- data.frame(TAXON = taxon, COUNT = count)
    names(count) <- taxon
    expected_named <- count

    # unit tests: unique taxa
    expect_identical(abundance(count = count), expected_unnamed)
    expect_identical(abundance(taxon = taxon, count = count), expected_named)
    expect_identical(abundance(d, count = COUNT), expected_unnamed)
    expect_identical(abundance(d, taxon = TAXON, count = COUNT), expected_named)
    expect_identical(abundance(d, TAXON, COUNT), expected_named)

    # reference data: duplicated taxa
    taxon <- c("a", "b", "c", "a", "b")
    count <- c( 3,   7,  11,  17,  13)
    expected_unnamed <- count
    d <- data.frame(TAXON = taxon, COUNT = count)
    names(count) <- taxon
    tmp <- tapply(X = count, INDEX = taxon, FUN = sum)
    expected_named <- as.numeric(tmp)
    names(expected_named) <- names(tmp)
    
    # unit tests: duplicated taxa
    expect_identical(abundance(count = count), expected_unnamed)
    expect_identical(abundance(taxon = taxon, count = count), expected_named)
    expect_identical(abundance(d, count = COUNT), expected_unnamed)
    expect_identical(abundance(d, taxon = TAXON, count = COUNT), expected_named)
    expect_identical(abundance(d, TAXON, COUNT), expected_named)
    

    # exception handling
    expect_error(
        abundance(taxon = c("a", "b", "c"), count = c(7, 11)),
       "'taxon' and 'count' should have the same length"
    )
    expect_error(
        abundance(taxon = c("a", "b", "c"), count = c(7, 11, -1)),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        abundance(taxon = c("a", "b", "c"), count = c(7, NA, 3)),
        "all elements in 'count' should be nonnegative"
    )
})



test_that("'total abundance' has been correctly implemented", {
    expect_identical(total_abundance(count = c(3, 7, 11, 17, 13)), 51)
    expect_error(
        total_abundance(count = c(7, 11, -1)),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        total_abundance(count = c(7, NA, 3)),
        "all elements in 'count' should be nonnegative"
    )
})



test_that("'species richness' has been correctly implemented", {
    expect_identical(
        species_richness(taxon = c("a", "b", "c", "a"), count = c(3, 7, 1, 9)),
        3L
    )
    expect_identical(
        species_richness(taxon = c("a", "b", "c", "a")),
        3L
    )
    expect_identical(
        species_richness(taxon = c("a", "b", "c"), count = c(3, 0, 1)),
        2L
    )
    expect_error(
        species_richness(taxon = c("a", "b", "c"), count = c(3, 7, 1, 9)),
       "'taxon' and 'count' should have the same length"
    )
    expect_error(
        species_richness(taxon = c("a", "b", "c"), count = c(7, 11, -1)),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        species_richness(taxon = c("a", "b", "c"), count = c(7, NA, 3)),
        "all elements in 'count' should be nonnegative"
    )
})



test_that("'Margalef index of diversity' has been correctly implemented", {
    expect_equal(
        margalef(taxon = c("a", "b", "c", "a"), count = c(3, 7, 1, 2)),
        (3 - 1)/log(13)
    )
    expect_error(
        margalef(taxon = c("a", "b", "c"), count = c(3, 7, 1, 9)),
       "'taxon' and 'count' should have the same length"
    )
    expect_error(
        margalef(taxon = c("a", "b", "c"), count = c(7, 11, -1)),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        margalef(taxon = c("a", "b", "c"), count = c(7, NA, 3)),
        "all elements in 'count' should be nonnegative"
    )
})



test_that("'Margalef index of diversity' has been correctly implemented", {
    expect_equal(
        rygg(taxon = c("a", "b", "c", "a"), count = c(3, 7, 1, 2)),
        log(3)/log(log(13))
    )
    expect_identical(
        rygg(taxon = c("a"), count = 0),
        NA_real_
    )
    expect_identical(
        rygg(taxon = c("a"), count = 1),
        NA_real_
    )
    expect_identical(
        rygg(taxon = c("a"), count = 2),
        NA_real_
    )
    expect_identical(
        rygg(taxon = c("a"), count = 3),
        0
    )
    expect_identical(
        rygg(taxon = c("a"), count = 3, adjusted = TRUE),
        0
    )
    expect_equal(
        rygg(taxon = c("a", "b", "c", "a"), count = c(3, 7, 1, 2), adjusted = TRUE),
        log(3)/log1p(log1p(13))
    )
    expect_error(
        rygg(taxon = c("a", "b", "c"), count = c(3, 7, 1, 9)),
       "'taxon' and 'count' should have the same length"
    )
    expect_error(
        rygg(taxon = c("a", "b", "c"), count = c(7, 11, -1)),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        rygg(taxon = c("a", "b", "c"), count = c(7, NA, 3)),
        "all elements in 'count' should be nonnegative"
    )
})



test_that("'Shannon index' has been correctly implemented", {
    expect_equal(
        shannon(taxon = c("a", "b", "c"), count = c( 3,   7,  11)),
        -sum(
             3/21 * log2( 3/21) + 
             7/21 * log2( 7/21) + 
            11/21 * log2(11/21)
        )
    )
    expect_equal(
        shannon(taxon = c("a", "b", "c", "d"), count = c( 3,   7,  11, 0)),
        -sum(
            3/21 * log2( 3/21) + 
                7/21 * log2( 7/21) + 
                11/21 * log2(11/21)
        )
    )
    expect_true(is.nan(shannon(taxon = "x", count = 0)))
    expect_error(
        shannon(taxon = c("a", "b", "c"), count = c(3, 7, 1, 9)),
       "'taxon' and 'count' should have the same length"
    )
    expect_error(
        shannon(taxon = c("a", "b", "c"), count = c(7, 11, -1)),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        shannon(taxon = c("a", "b", "c"), count = c(7, NA, 3)),
        "all elements in 'count' should be nonnegative"
    )
})



test_that("'AMBI-index' has been correctly implemented", {
    expect_equal(
        ambi(
            taxon = letters[1:5],
            count = c( 3,    7,    11,   17,   13),
            group = c("I", "II", "III", "IV", "III")
        ),
        1.5 * sum((0:4) * c(I = 3, II = 7, III = 24, IV = 17, V = 0) / 51)
    )
    expect_error(
        ambi(taxon = c("a", "b", "c"), count = c(3, 7, 1, 9), 
             group = c("I", "II", "III", "IV", "III")),
       "'taxon' and 'count' should have the same length"
    )
    expect_error(
        ambi(taxon = c("a", "b", "c"), count = c(3, 7, 1), 
             group = c("X", "Y", "III")),
       "'group' should be one of: I, II, III, IV, V"
    )
    expect_error(
        ambi(taxon = c("a", "b", "c"), count = c(7, 11, -1), 
             group = c("I", "II", "III")),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        ambi(taxon = c("a", "b", "c"), count = c(7, NA, 3), 
             group = c("I", "II", "III")),
        "all elements in 'count' should be nonnegative"
    )
    expect_true(has_ambi(taxon = "a", group = "I"))
    expect_false(has_ambi(taxon = "a"))
})



test_that("'ITI-index' has been correctly implemented", {
    expect_equal(
        iti(
            taxon = letters[1:5],
            count = c( 3,    7,    11,   17,   13),
            group = c("I", "II", "III", "IV", "III")
        ),
        100/3 * sum((3:0) * c(I = 3, II = 7, III = 24, IV = 17) / 51)
    )
    expect_error(
        iti(taxon = c("a", "b", "c"), count = c(3, 7, 1, 9), 
             group = c("I", "II", "III", "IV", "III")),
       "'taxon' and 'count' should have the same length"
    )
    expect_error(
        iti(taxon = c("a", "b", "c"), count = c(3, 7, 1), 
             group = c("X", "Y", "III")),
       "'group' should be one of: I, II, III, IV"
    )
    expect_error(
        iti(taxon = c("a", "b", "c"), count = c(7, 11, -1), 
             group = c("I", "II", "III")),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        iti(taxon = c("a", "b", "c"), count = c(7, NA, 3), 
             group = c("I", "II", "III")),
        "all elements in 'count' should be nonnegative"
    )
    expect_true(has_iti(taxon = "a", group = "I"))
    expect_false(has_iti(taxon = "a"))
})



test_that("'Hurlbert index' has been correctly implemented", {
    expect_equal(
        hurlbert(taxon = c("a", "b", "c", "d", "e"), count = c(96, 1, 1, 1, 1)),
        5
    )
    expect_equal(
        hurlbert(taxon = c("a", "b", "c"), count = c(100, 100, 100), n = 1),
        1
    )
    expect_equal(
        hurlbert(taxon = c("a", "b", "c"), count = c(100, 100, 100), n = 2),
        1.66889632107
    )
    expect_equal(
        hurlbert(taxon = c("a", "b", "c"), count = c(100, 100, 100), n = 5),
        2.61155015984
    )
    expect_equal(
        hurlbert(taxon = c("a", "b", "c"), count = c(100, 0, 100), n = 100),
        2
    )
    expect_error(
        hurlbert(taxon = c("a", "b", "c"), count = c(7, -1, 3)),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        hurlbert(taxon = c("a", "b", "c"), count = c(7, NA, 3)),
        "all elements in 'count' should be nonnegative"
    )
})



test_that("'Simpson's index' has been correctly implemented", {
    expect_equal(
        simpson(taxon = c("a", "b", "c"), count = c(1000, 1000, 1000)),
        3 * (1/3)^2, tolerance = 0.001
    )
    expect_gt(
        simpson(taxon = c("a", "b", "c"), count = c(1000, 1, 1)),
        0.99
    )
    expect_error(
        simpson(taxon = c("a", "b", "c"), count = c(7, -1, 3)),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        simpson(taxon = c("a", "b", "c"), count = c(7, NA, 3)),
        "all elements in 'count' should be nonnegative"
    )
})



test_that("'Hill's diversity number' has been correctly implemented", {
    expect_equal(
        hill(taxon = c("a", "b", "c"), count = c(100, 100, 100), a = -Inf),
        1
    )
    expect_equal(
        hill(taxon = c("a", "b", "c"), count = c(1, 10, 100), a = -Inf),
        1
    )
    expect_equal(
        hill(taxon = c("a", "b", "c"), count = c(100, 100, 100), a = Inf),
        1
    )
    expect_equal(
        hill(taxon = c("a", "b", "c"), count = c(1, 10, 100), a = Inf),
        1
    )
    expect_equal(
        hill(taxon = c("a", "b", "c"), count = c(100, 100, 100), a = 0),
        3
    )
    expect_equal(
        hill(taxon = c("a", "b", "c"), count = c(100, 100, 100), a = 0),
        hill0(taxon = c("a", "b", "c"), count = c(100, 100, 100))
    )
    expect_equal(
        hill0(taxon = c("a", "b", "c"), count = c(100, 100, 100)),
        species_richness(taxon = c("a", "b", "c"), count = c(100, 100, 100))
    )
    expect_equal(
        hill(taxon = c("a", "b", "c"), count = c(1, 10, 100), a = 0),
        3
    )
    expect_equal(
        hill(taxon = c("a", "b", "c"), count = c(100, 100, 100), a = 1),
        hill1(taxon = c("a", "b", "c"), count = c(100, 100, 100))
    )
    expect_message(
        hill(taxon = c("a", "b", "c"), count = c(100, 100, 100), a = 1),
        "N_a(a=1) is undefined. Therefore N_a(lim a->1) will be returned",
        fixed = TRUE
    )
    expect_equal(
        hill1(taxon = c("a", "b", "c"), count = c(100, 100, 100)),
        exp(shannon(taxon = c("a", "b", "c"), count = c(100, 100, 100), base = exp(1)))
    )
    expect_equal(
        hill1(taxon = c("a", "b", "c"), count = c(1, 10, 100)),
        exp(shannon(taxon = c("a", "b", "c"), count = c(1, 10, 100), base = exp(1)))
    )
    expect_equal(
               hill(taxon = c("a", "b", "c"), count = c(1000, 1000, 1000), a = 2),
        1 / simpson(taxon = c("a", "b", "c"), count = c(1000, 1000, 1000)),
        tolerance = 0.001
    )
    expect_equal(
               hill(taxon = c("a", "b", "c"), count = c(1, 10, 100), a = 2),
        1 / simpson(taxon = c("a", "b", "c"), count = c(1, 10, 100)),
        tolerance = 0.01
    )
    expect_equal(
        hill(taxon = c("a", "b", "c"), count = c(1000, 1000, 1000), a = 2),
        hill2(taxon = c("a", "b", "c"), count = c(1000, 1000, 1000)),
        tolerance = 0.001
    )
    expect_equal(
        hill( taxon = c("a", "b", "c"), count = c(10, 100, 1000), a = 2),
        hill2(taxon = c("a", "b", "c"), count = c(10, 100, 1000)),
        tolerance = 0.001
    )
    expect_error(
        hill(taxon = c("a", "b", "c"), count = c(7, -1, 3)),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        hill(taxon = c("a", "b", "c"), count = c(7, NA, 3)),
        "all elements in 'count' should be nonnegative"
    )
})



test_that("'hpie' has been correctly implemented", {
    expect_equal(
        hpie(taxon = c("a", "b"), count = c(100, 100)),
        sum((c(100, 100) / (100 + 100)) * 
                ((100 + 100) -  c(100, 100)) / 
                ((100 + 100) - 1)) # Hurlbert's Delta1
    )
    expect_equal(
        hpie(taxon = c("a", "b"), count = c(13, 71)),
        sum((c(13, 71) / (13 + 71)) * 
                ((13 + 71) - c(13, 71)) / 
                ((13 + 71) - 1)) # Hurlbert's Delta1
    )
    expect_equal(
        hpie(taxon = c("a", "b"), count = c(10, 100)),
        1 - simpson(taxon = c("a", "b"), count = c(10, 100))
    )
    expect_error(
        hpie(taxon = c("a", "b", "c"), count = c(7, -1, 3)),
        "all elements in 'count' should be nonnegative"
    )
    expect_error(
        hpie(taxon = c("a", "b", "c"), count = c(7, NA, 3)),
        "all elements in 'count' should be nonnegative"
    )
})



test_that("'hpie' has been correctly implemented (test by simulation)", {
    skip_on_cran()
    # see e-mail Kurt Hornik 2019-03-05T12:59
    suppressWarnings(RNGversion("3.5.0"))
    set.seed(314)
    N <- 1000000L
    d <- rep.int(x = 1:2, times = c(100, 100))
    r <- replicate(n = N, {sample(x = d, size = 2L)})
    expect_equal(
        hpie(taxon = c("a", "b"), count = c(100, 100)),
        mean(r[1, ] !=  r[2, ]),
        tolerance = 1.0e-3
    )
})

Try the benthos package in your browser

Any scripts or data that you put into this service are public.

benthos documentation built on Aug. 22, 2022, 5:07 p.m.