Author: Jakob Schöpe
Date: 2025-10-06

# Validation

#### Jakob Schöpe

#### 2025-10-06

## Test Suite

The following fictitious example of a prospective cohort study will be used to validate the correct estimation of the BSW package in R.

| Exposed | Non-Exposed
--- | --- | ---
Cases | 200 | 50
Non-Cases | 50 | 200

    library(testthat)
    library(BSW)
    df <- data.frame(y = rep(c(0, 1), each = 250),
                     x = rep(c(0, 1, 0, 1), times = c(200, 50, 50, 200))
                     )
    RR <- (200 * 250) / (50 * 250)
    SE <- sqrt((1/200 + 1/50) - (1/250 + 1/250))
    fit <- bsw(y ~ x, df)
    out <- summary(fit)
    Call:
    bsw(formula = y ~ x, data = df)

    Convergence: TRUE
    Coefficients:
                 Estimate Std. Error   z value     Pr(>|z|)  RR      2.5%    97.5%
    (Intercept) -1.609438  0.1264911 -12.72372 4.365487e-37 0.2 0.1560848 0.256271
    x            1.386294  0.1303840  10.63239 2.106385e-26 4.0 3.0979677 5.164676

    Iterations: 6

The relative risk for exposed individuals compared to non-exposed individuals can be calculated from

\(RR = \displaystyle\frac{200 * 250}{50*250} = 4\).

    test_that(desc = "Estimated relative risk is equal to 4",
              code = {
                      expect_equal(object = unname(exp(coef(fit)[2])),
                                   expected = RR)
                }
              )
    Test passed 🎊

The standard error of the natural logarithm of the relative risk can be calculated from

\(SE(ln(RR)) = \displaystyle\sqrt{\Big(\frac{1}{200} + \frac{1}{50}\Big) - \Big(\frac{1}{250}+\frac{1}{250}\Big)} = 0.130384\).

    test_that(desc = "Estimated standard error is equal to 0.1303840",
              code = {
                      expect_equal(object = unname(out$std.err[2]),
                                   expected = SE)
                }
              )
    Test passed 🥇

The z-value can be calculated from

\(z = \displaystyle\frac{1.386294}{0.130384} = 10.63239\).

    test_that(desc = "Estimated z-value is equal to 10.63239",
              code = {
                      expect_equal(object = unname(out$z.value[2]),
                                   expected = log(RR) / SE)
                }
              )
    Test passed 😀

The 95% confidence interval limits can be calculated from

\(exp(1.386294 \pm 1.959964 * 0.1303840) = [3.097968; 5.164676]\).

    test_that(desc = "Estimated 95% confidence interval limits are equal to 3.097968 and 5.164676",
              code = {
                      expect_equal(object = unname(exp(confint(fit)[2,])),
                                   expected = exp(log(RR) + SE * qnorm(c(0.025, 0.975))))
                }
              )
    Test passed 🎊