# The following tests come from examples reported by end users which resulted in
# unexpected values.
library(pedbp)
################################################################################
# 23 January 2025
#
# The following record would return unexpectely high blood pressure percentiles.
#
pat1 <-
data.frame(age = 16.8, # months
height = 79.8, # cm
weight = 11.6, # kg
male = 0,
sbp = 92, # mmHg
dbp = 54 # mmHg
)
# first, stature for age. Expect that height_for_age will return NaN and a
# warning when source is CDC becuase the CDC starts start at 24 months, and WHO
# starts at 61 months
expr <- expression(with(pat1, p_height_for_age(q = height, male = male, age = age, source = "CDC")))
test1a <- tryCatch(eval(expr), warning = function(w) w)
stopifnot(inherits(test1a, "warning"))
test1b <- suppressWarnings(eval(expr))
stopifnot(is.na(test1b))
expr <- expression(with(pat1, p_height_for_age(q = height, male = male, age = age, source = "WHO")))
test1c <- tryCatch(eval(expr), warning = function(w) w)
stopifnot(inherits(test1c, "warning"))
test1d <- suppressWarnings(eval(expr))
stopifnot(is.na(test1d))
# second the length_for_age should return useful values for both the CDC and WHO
# sources
stopifnot(
all.equal(
with(pat1, p_length_for_age(age = age, male = male, q = height, source = "CDC")),
0.6251524,
tol = 1e-7
)
)
stopifnot(
all.equal(
with(pat1, p_length_for_age(age = age, male = male, q = height, source = "WHO")),
0.5493427,
tol = 1e-7
)
)
# The blood pressure precentiles are not as expected
# When using only age and sex then the flowchart for source = "martin2022" says
# that the percentiles should come from NHLBI
test2 <- with(pat1, p_bp(age = age, male = male, q_sbp = sbp, q_dbp = dbp))
stopifnot(identical(attr(test2, "bp_params")$source, "nhlbi"))
stopifnot(all.equal(attr(test2, "bp_params")$height_percentile, 50))
stopifnot(identical(attr(test2, "bp_params")$male, 0L))
stopifnot(all.equal(attr(test2, "bp_params")$age, 12))
stopifnot(all.equal(attr(test2, "bp_params")$sbp_mean, 86.00094, tol = 1e-6))
stopifnot(all.equal(attr(test2, "bp_params")$sbp_sd, 10.92093, tol = 1e-6))
stopifnot(all.equal(attr(test2, "bp_params")$dbp_mean, 40.00094, tol = 1e-6))
stopifnot(all.equal(attr(test2, "bp_params")$dbp_sd, 10.92093, tol = 1e-6))
stopifnot(all.equal(test2$sbp_p, 0.7086064, tol = 1e-6))
stopifnot(all.equal(test2$dbp_p, 0.9000536, tol = 1e-6))
# when height is given, again the NHLBI data should be used, and the height
# percentile should be calculated.
#
# The problem is that as of version 2.0.2 the height_percentile being used is 5,
# which suggests to me that the height_for_age method is being used instead of
# the length_for_age method for calculating the height_percentile.
#
# The problem was in src/blood_pressue.cpp where height_percentile needed to be
# multiplied by 100 before confronting the lookup table.
#
# given that the height percentile is 54, the look up table should use the
# median value and return the same thing as test2
test3 <- with(pat1, p_bp(age = age, male = male, height = height, q_sbp = sbp, q_dbp = dbp))
stopifnot(all.equal(test2, test3))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.