## EXAMPLE 1 (from Scott et al. 2008, Table 1):
## A new diagnostic test was trialled on 1586 patients. Of 744 patients that
## were disease positive, 670 were test positive. Of 842 patients that were
## disease negative, 640 were test negative. What is the likeliood ratio of
## a positive test? What is the number needed to diagnose?
dat.v01 <- c(670,202,74,640)
rval.tes01 <- epi.tests(dat.v01, method = "exact", digits = 2,
conf.level = 0.95)
print(rval.tes01)
## Test sensitivity is 0.90 (95% CI 0.88 to 0.92). Test specificity is
## 0.76 (95% CI 0.73 to 0.79). The likelihood ratio of a positive test
## is 3.75 (95% CI 3.32 to 4.24).
## What is the number needed to diagnose?
rval.tes01$detail
## The number needed to diagnose is 1.51 (95% CI 1.41 to 1.65). Around 15
## persons need to be tested to return 10 positive tests.
## EXAMPLE 2:
## Same as Example 1 but showing how a 2 by 2 contingency table can be prepared
## using tidyverse:
if (FALSE) {
library(tidyverse)
## Generate a data set listing test results and true disease status:
dis <- c(rep(1, times = 744), rep(0, times = 842))
tes <- c(rep(1, times = 670), rep(0, times = 74),
rep(1, times = 202), rep(0, times = 640))
dat.df02 <- data.frame(dis, tes)
tmp.df02 <- dat.df02 %>%
mutate(dis = factor(dis, levels = c(1,0), labels = c("Dis+","Dis-"))) %>%
mutate(tes = factor(tes, levels = c(1,0), labels = c("Test+","Test-"))) %>%
group_by(tes, dis) %>%
summarise(n = n())
tmp.df02
## View the data in conventional 2 by 2 table format:
pivot_wider(tmp.df02, id_cols = c(tes), names_from = dis, values_from = n)
rval.tes02 <- epi.tests(tmp.df02, method = "exact", digits = 2,
conf.level = 0.95)
summary(rval.tes02)
}
## Test sensitivity is 0.90 (95% CI 0.88 to 0.92). Test specificity is
## 0.76 (95% CI 0.73 to 0.79). The likelihood ratio of a positive test
## is 3.75 (95% CI 3.32 to 4.24).
## EXAMPLE 3:
## A biomarker assay has been developed to identify patients that are at
## high risk of experiencing myocardial infarction. The assay varies on
## a continuous scale, from 0 to 1. Researchers believe that a biomarker
## assay result of greater than or equal to 0.60 renders a patient test
## positive, that is, at elevated risk of experiencing a heart attack
## over the next 12 months.
## Generate data consistent with the information provided above. Assume the
## prevalence of high risk subjects in your population is 0.35:
set.seed(1234)
dat.df03 <- data.frame(out = rbinom(n = 200, size = 1, prob = 0.35),
bm = runif(n = 200, min = 0, max = 1))
## Classify study subjects as either test positive or test negative
## according to their biomarker test result:
dat.df03$test <- ifelse(dat.df03$bm >= 0.6, 1, 0)
## Generate a two-by-two table:
dat.tab03 <- table(dat.df03$test, dat.df03$out)[2:1,2:1]
rval.tes03 <- epi.tests(dat.tab03, method = "exact", digits = 2,
conf.level = 0.95)
print(rval.tes03)
## What proportion of subjects are ruled out as being at high risk of
## myocardial infarction?
rval.tes03$detail[rval.tes03$detail$statistic == "p.rout",]
## Answer: 0.61 (95% CI 0.54 to 0.68).
## What proportion of subjects are ruled in as being at high risk of
## myocardial infarction?
rval.tes03$detail[rval.tes03$detail$statistic == "p.rin",]
# Answer: 0.38 (95% CI 0.32 to 0.45).
## What is the proportion of false positive results? That is, what is the
## proportion of test positive individuals among those that are disease
## negative, p.tpdn?
rval.tes03$detail[rval.tes03$detail$statistic == "p.tpdn",]
# Answer: 0.37 (95% CI 0.29 to 0.45).
## What is the proportion of false negative results? That is, what is the
## proportion of test negative individuals among those that are disease
## positive, p.tndp?
rval.tes03$detail[rval.tes03$detail$statistic == "p.tndp",]
# Answer: 0.58 (95% CI 0.44 to 0.70).
Run the code above in your browser using DataLab