Title: | Meta-Analysis of Diagnostic Accuracy Studies with Several Cutpoints |
---|---|
Description: | Provides methods by Steinhauser et al. (2016) <DOI:10.1186/s12874-016-0196-1> for meta-analysis of diagnostic accuracy studies with several cutpoints. |
Authors: | Gerta Rücker [aut] , Susanne Steinhauser [aut], Srinath Kolampally [aut], Guido Schwarzer [aut, cre] |
Maintainer: | Guido Schwarzer <[email protected]> |
License: | GPL (>= 2) |
Version: | 0.6-0 |
Built: | 2024-10-31 06:05:58 UTC |
Source: | https://github.com/guido-s/diagmeta |
R package diagmeta implements the method by Steinhauser et al. (2016) for the meta-analysis of diagnostic test accuracy studies with multiple cutoffs.
Main function of R package diagmeta is the eponymous
diagmeta
. Corresponding functions for printing and
plotting are available: print.diagmeta
,
plot.diagmeta
Furthermore, a summary function and corresponding print function
are available to provide a briefer output:
summary.diagmeta
,
print.summary.diagmeta
Additional functions provided in diagmeta are
diagstats
to calculate additional statistical
measures for the diagnostic test accuracy meta-analysis and
ipd2diag
to transform individual participant data to
the data format required by diagmeta
.
Type help(package = "diagmeta")
for a listing of R functions and
datasets available in diagmeta.
Type citation("diagmeta")
for the preferred citation of
R package diagmeta.
To report problems and bugs
type bug.report(package = "diagmeta")
if you do not
use RStudio,
send an email to Guido Schwarzer [email protected] if you use RStudio.
The development version of diagmeta is available on GitHub https://github.com/guido-s/diagmeta.
Gerta Rücker [email protected], Susanne Steinhauser [email protected], Srinath Kolampally [email protected], Guido Schwarzer [email protected]
Steinhauser S, Schumacher M, Rücker G (2016): Modelling multiple thresholds in meta-analysis of diagnostic test accuracy studies. BMC Medical Research Methodology, 16, 97
Useful links:
Extract data frame from objects of class diagmeta
.
## S3 method for class 'diagmeta' as.data.frame(x, row.names = NULL, optional = FALSE, ...)
## S3 method for class 'diagmeta' as.data.frame(x, row.names = NULL, optional = FALSE, ...)
x |
An object of class |
row.names |
Argument of R function |
optional |
Argument of R function |
... |
Other arguments. |
A data frame is returned by the function as.data.frame
.
Guido Schwarzer [email protected]
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) as.data.frame(diag1)
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) as.data.frame(diag1)
Diagnostic tests may be based on an ordinal or continuous biomarker or an ordinal score together with a cutoff. The decision whether the target condition is present or not (positive or negative test result) depends on whether the observed value is above or below the cutoff.
Sensitivity and specificity of the test depend on the chosen cutoff and vary with the cutoff. In meta-analysis of diagnostic accuracy studies, results are often reported for multiple cutoffs within a study, and the cutoffs may differ between studies. The multiple cutoffs model creates a link between the range of cutoffs and the respective pairs of sensitivity and specificity and thus allows identifying cutoffs at which the test is likely to perform best (Steinhauser et al., 2016).
diagmeta( TP, FP, TN, FN, cutoff, studlab, data = NULL, distr = "logistic", model = "CICS", equalvar = FALSE, lambda = 0.5, direction, log.cutoff = FALSE, method.weights = "invvar", level = 0.95, incr = 0.5, n.iter.max = 1000, tol = 1e-08, silent = TRUE, ... )
diagmeta( TP, FP, TN, FN, cutoff, studlab, data = NULL, distr = "logistic", model = "CICS", equalvar = FALSE, lambda = 0.5, direction, log.cutoff = FALSE, method.weights = "invvar", level = 0.95, incr = 0.5, n.iter.max = 1000, tol = 1e-08, silent = TRUE, ... )
TP |
Numeric vectors giving the number of true positives or and
object created with |
FP |
Numeric vector giving the number of false positives. |
TN |
Numeric vector giving the number of true negatives. |
FN |
Numeric vector giving the number of false negatives. |
cutoff |
A number vector indicating the cutoff values. |
studlab |
A numeric or a character vector with study labels. |
data |
An optional data frame containing the study information. |
distr |
A character indicating the distribution (see Details). |
model |
A character indicating the model (see Details). |
equalvar |
A logical indicating whether the variances of the biomarker in both groups are thought equal (see Details). |
lambda |
A numeric between 0 and 1 indicating the weight of the population with higher values of the underlying biomarker (such that the group with lower values receives weight 1 - lambda). |
direction |
A character string specifying whether the probability of
the target condition (e.g., a disease) is |
log.cutoff |
A logical indicating whether the cutoffs should be log-transformed. |
method.weights |
A character indicating the method for
weighting the studies: |
level |
A numeric indicating the significance level (1 - alpha) for tests (default is 0.95). |
incr |
A numeric between 0 and 1 that is added as a continuity correction. |
n.iter.max |
A numeric indicating the maximal number of common point iterations for finding the optimal cutoff. |
tol |
A numeric indicating the tolerance for convergence of the common point iteration. |
silent |
A logical indicating whether iterations should be suppressed. |
... |
Additional arguments. |
Each row of the data set provides at least a study label, a cutoff and the numbers of true positives, false positives, true negatives and false negatives. Different studies may contribute a varying number of cutoffs, as well as different sets of cutoffs.
By default (argument direction = "increasing"
), we assume
that higher values of the biomarker indicate a greater probability for the
target condition (e.g., a disease). This association can be reversed setting
argument direction = "decreasing"
. In this case, the following
transformation is used internally to reverse the values for the biomarker:
min(cutoff) + max(cutoff) - cutoff
.
In printouts and figures, the original biomarker values are depicted;
likewise the optimal cutoff is printed on the original scale.
The multiple cutoffs model is a multi-level random effects model. At the study level, for the group of patients without the target condition (in short disease-free), the specificities at all available cutoffs together provide an estimate of the cumulative distribution function (cdf) of the test results within the disease-free individuals. Likewise, for patients with the target condition (in short diseased), via the observed sensitivities at all observed cutoffs we obtain an estimate of the cdf of the test results within the diseased patients. At the meta-analytic level, the model fits the data for both groups and all available cutoffs over all studies. Based on a parametric model, it provides estimates of the two cdfs for the two groups across all studies, accounting for the between-study heterogeneity and correlation between groups.
Users have the choice between the normal (argument
distr="normal"
) and the logistic distribution (argument
distr="logistic"
which is the default). In addition, it is
possible to log-transform the cutoffs (argument log.cutoff
,
default is FALSE
). For log-transformed cutoffs and argument
direction = "decreasing"
, the following
transformation is used internally to reverse the values for the biomarker:
min(log(cutoff)) + max(log(cutoff)) - log(cutoff)
.
The cdf, transformed using the quantile function of the chosen
distribution, is modelled by one of eight mixed linear models
("DIDS", "CIDS", "DICS", "CICS", "DS", "CS", "DI", "CI") as
described in Steinhauser et al. (2016). The argument
equalvar
indicates if the variances of the biomarker in both
groups are assumed to be equal (equalvar = TRUE) or unequal
(equalvar = FALSE).
The pooled sensitivity and specificity values can be obtained at every cutoff; a multiple cutoffs summary ROC (sROC) naturally follows while preserving cutoff information. The optimal cutoff is defined as the cutoff where the maximum of a weighted sum of sensitivity and specificity is obtained: lambda * sensitivity + (1 - lambda) * specificity. The 95% confidence intervals of sensitivities, specificities and the optimal cutoff are estimated using the delta method (Steinhauser et al., 2016).
An object of class "diagmeta" with corresponding print, summary, and plot function. The object is a list containing the following components
TP , FP , TN , FN
|
As defined above. |
cutoff , studlab
|
As defined above. |
Sens |
Sensitivity (original data). |
Spec |
Specificity (original data). |
distr , model , equalvar , lambda
|
As defined above. |
log.cutoff , method.weights
|
As defined above. |
level , incr
|
As defined above. |
k |
The number of studies in the meta-analysis. |
optcut |
The optimal cutoff. |
lower.optcut , upper.optcut
|
Corresponding lower and upper confidence limits (for normal distribution). |
Sens.optcut |
The sensitivity at the optimal cutoff. |
lower.Sens.optcut , upper.Sens.optcut
|
Corresponding lower and upper confidence limits. |
Spec.optcut |
The specificity at the optimal cutoff. |
lower.Spec.optcut , upper.Spec.optcut
|
Corresponding lower and upper confidence limits. |
AUCSens , AUCSpec
|
Area under the curve (AUC) |
AUCSens.lower , AUCSens.upper
|
Corresponding lower and upper confidence limits (based on the confidence region for the sensitivity, given the specificity) |
AUCSpec.lower , AUCSpec.upper
|
Corresponding lower and upper confidence limits (based on the confidence region for the specificity, given the sensitivity) |
var.diseased , var.nondiseased
|
The within-study variance for the diseased and non-diseased group, respectively. |
AIC |
The value of the Akaike information criterion of the lmer object. |
BIC |
The value of the Bayesian information criterion of the lmer object. |
data.lmer |
A list with elements Study (study labels), Group (group labels (0 or 1)), Cutoff, N (group sizes), Negative (number of negative test results), NN (frequencies of negative test results). |
result.lmer |
An object of class |
weights |
Normalized weights per study, group, and cutoff such that the sum of weights is twice the number of cutoffs over all studies. |
regr |
A list with point estimates, variances, and covariances
from regression parameters of |
dist |
A list containing estimated means, standard deviations, and variances of distributions from diseased (ending with 1) and non-diseased (ending with 0). |
Cov.common |
Covariance matrix from common effects model. |
call |
Function call. |
version |
Version of R package diagmeta used to create object. |
Gerta Rücker [email protected], Susanne Steinhauser [email protected], Srinath Kolampally [email protected], Guido Schwarzer [email protected]
Steinhauser S, Schumacher M, Rücker G (2016): Modelling multiple thresholds in meta-analysis of diagnostic test accuracy studies. BMC Medical Research Methodology, 16, 97
plot.diagmeta, summary.diagmeta
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) summary(diag1) plot(diag1)
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) summary(diag1) plot(diag1)
diagmeta
The user can provide cutoffs, sensitivities, and / or specificities to calculate the respective quantities (with confidence intervals). Furthermore, positive predictive values (PPV), negative predictive values (NPV), and probabilities of disease (PD) are calculated if the prevalence is provided.
diagstats(x, cutoff = x$optcut, sens, spec, prevalence, level = 0.95)
diagstats(x, cutoff = x$optcut, sens, spec, prevalence, level = 0.95)
x |
An object of class |
cutoff |
A numeric or vector with cutoff value(s). |
sens |
A numeric or vector with sensitivity value(s). |
spec |
A numeric or vector with specificity value(s). |
prevalence |
A numeric or vector with the prevalence(s). |
level |
The level used to calculate confidence intervals. |
A data frame of class "diagstats" with the following variables:
cutoff |
Cutoffs provided in argument |
Sens |
Sensitivities provided in argument |
lower.Sens , upper.Sens
|
Lower and upper confidence limits of the sensitivities. |
Spec |
Specificities provided in argument |
lower.Spec , upper.Spec
|
Lower and upper confidence limits of the specificities. |
prevalence |
As defined above. |
PPV |
Positive predictive value (based on the prevalence). |
lower.PPV , upper.PPV
|
Lower and upper confidence limits of positive predictive values. |
NPV |
Negative predictive value (based on the prevalence) |
lower.NPV , upper.NPV
|
Lower and upper confidence limits of negative predictive values. |
PD |
Probability of disease if the given cutoff value was observed as the measurement for an individual. |
lower.PD , upper.PD
|
Lower and upper confidence limits of probabilities of disease. |
dens.nondiseased |
Value of the model-based density function at the cutoff(s) for non-diseased individuals. |
dens.diseased |
Value of the model-based density function at the cutoff(s) for diseased individuals. |
Gerta Rücker [email protected], Srinath Kolampally [email protected], Guido Schwarzer [email protected]
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) # Results at the optimal cutoff # diagstats(diag1) # Results for cutoffs 25 and 50 (and a prevalence of 10%) # diagstats(diag1, c(25, 50), prevalence = 0.10) # Results for sensitivity and specificity of 0.95 # diagstats(diag1, sens = 0.95, spec = 0.95)
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) # Results at the optimal cutoff # diagstats(diag1) # Results for cutoffs 25 and 50 (and a prevalence of 10%) # diagstats(diag1, c(25, 50), prevalence = 0.10) # Results for sensitivity and specificity of 0.95 # diagstats(diag1, sens = 0.95, spec = 0.95)
Function to transform individual patient data (IPD) to enter them
into diagmeta
ipd2diag(studlab, value, status, data = NULL, direction = "increasing")
ipd2diag(studlab, value, status, data = NULL, direction = "increasing")
studlab |
A vector with study labels. |
value |
A vector with individual patients' measurements of a discrete or continuous variable. |
status |
A vector with information of the individual's status (0 = non-diseased, 1 = diseased). |
data |
An optional data frame containing the study information. |
direction |
A character string specifying whether the probability of
the target condition (e.g., a disease) is |
A data frame with additional class 'ipd2diag' containing the following variables:
studlab |
As defined above. |
cutoff |
Cutoff values. |
TP , FP , TN , FN
|
Number of true positives, false positives, true negatives and false negatives. |
Gerta Rücker [email protected], Srinath Kolampally [email protected]
diagmeta, plot.diagmeta,
print.diagmeta, summary.diagmeta
# Simulate IPD data for three studies, each with 30 patients based # on normally distributed marker values # set.seed(20) k <- 3 n <- 60 m <- c(20, 23, 26) d <- 10 s <- 5 studlab <- c(rep(1, n), rep(2, n), rep(3, n)) status <- rep(c(rep(0, n / 2), rep(1, n / 2)), k) measurement <- c(rnorm(n / 2, m[1], s), rnorm(n/2, m[1] + d, s), rnorm(n / 2, m[2], s), rnorm(n/2, m[2] + d, s), rnorm(n / 2, m[3], s), rnorm(n/2, m[3] + d, s)) # IPDdata <- data.frame(studlab, measurement, status) str(IPDdata) # Transform these data using ipd2diag() # diagdata <- ipd2diag(studlab, value = measurement, status = status) str(diagdata) # Run diagmeta() # diag1 <- diagmeta(diagdata, distr = "normal") summary(diag1) plot(diag1) par(mfrow = c(1, 2)) plot(diag1, which = "ROC", lines = TRUE) plot(diag1, which = "SROC", ciSens = TRUE, ciSpec = TRUE, lines = TRUE, shading = "hatch")
# Simulate IPD data for three studies, each with 30 patients based # on normally distributed marker values # set.seed(20) k <- 3 n <- 60 m <- c(20, 23, 26) d <- 10 s <- 5 studlab <- c(rep(1, n), rep(2, n), rep(3, n)) status <- rep(c(rep(0, n / 2), rep(1, n / 2)), k) measurement <- c(rnorm(n / 2, m[1], s), rnorm(n/2, m[1] + d, s), rnorm(n / 2, m[2], s), rnorm(n/2, m[2] + d, s), rnorm(n / 2, m[3], s), rnorm(n/2, m[3] + d, s)) # IPDdata <- data.frame(studlab, measurement, status) str(IPDdata) # Transform these data using ipd2diag() # diagdata <- ipd2diag(studlab, value = measurement, status = status) str(diagdata) # Run diagmeta() # diag1 <- diagmeta(diagdata, distr = "normal") summary(diag1) plot(diag1) par(mfrow = c(1, 2)) plot(diag1, which = "ROC", lines = TRUE) plot(diag1, which = "SROC", ciSens = TRUE, ciSpec = TRUE, lines = TRUE, shading = "hatch")
Provides several plots for meta-analysis of diagnostic test accuracy studies with the multiple cutoffs model
## S3 method for class 'diagmeta' plot( x, which = c("regression", "cdf", "sensspec", "youden", "roc", "sroc"), xlab = "Threshold", main, ci = FALSE, ciSens = FALSE, ciSpec = FALSE, mark.optcut = FALSE, mark.cutpoints = FALSE, points = TRUE, lines = FALSE, rlines = TRUE, line.optcut = TRUE, col.points = "rainbow", cex = 1, pch.points = 16, col = "black", col.ci = "gray", col.optcut = "black", cex.marks = 0.7 * cex, lwd = 1, lwd.ci = lwd, lwd.optcut = 2 * lwd, lwd.study = lwd, shading = "none", col.hatching = col.ci, lwd.hatching = lwd.ci, ellipse = FALSE, level = x$level, xlim = NULL, ylim = NULL, ... )
## S3 method for class 'diagmeta' plot( x, which = c("regression", "cdf", "sensspec", "youden", "roc", "sroc"), xlab = "Threshold", main, ci = FALSE, ciSens = FALSE, ciSpec = FALSE, mark.optcut = FALSE, mark.cutpoints = FALSE, points = TRUE, lines = FALSE, rlines = TRUE, line.optcut = TRUE, col.points = "rainbow", cex = 1, pch.points = 16, col = "black", col.ci = "gray", col.optcut = "black", cex.marks = 0.7 * cex, lwd = 1, lwd.ci = lwd, lwd.optcut = 2 * lwd, lwd.study = lwd, shading = "none", col.hatching = col.ci, lwd.hatching = lwd.ci, ellipse = FALSE, level = x$level, xlim = NULL, ylim = NULL, ... )
x |
An object of class |
which |
A character vector indicating the type of plot, either
|
xlab |
An x axis label. |
main |
A logical indicating title to the plot. |
ci |
A logical indicating whether confidence intervals should
be plotted for |
ciSens |
A logical indicating whether confidence intervals
should be plotted for sensitivity, given the specificity in
|
ciSpec |
A logical indicating whether confidence intervals
should be plotted for specificity, given the sensitivity in
|
mark.optcut |
A logical indicating whether the optimal cutoff
should be marked on |
mark.cutpoints |
A logical indicating whether the given
cutoffs should be marked on |
points |
A logical indicating whether points should be plotted
in plots |
lines |
A logical indicating whether polygonal lines
connecting points belonging to the same study should be printed
in plots |
rlines |
A logical indicating whether regression lines or
curves should be plotted for plots |
line.optcut |
A logical indicating whether a vertical line
should be plotted at the optimal cutoff line for plots
|
col.points |
A character string indicating color of points,
either |
cex |
A numeric indicating magnification to be used for plotting text and symbols. |
pch.points |
A numeric indicating plot symbol(s) for points. |
col |
A character string indicating color of lines. |
col.ci |
A character string indicating color of confidence lines. |
col.optcut |
A character string indicating color of optimal cutoff line. |
cex.marks |
A numeric indicating magnification(s) to be used for marking cutoffs. |
lwd |
A numeric indicating line width. |
lwd.ci |
A numeric indicating line width of confidence lines. |
lwd.optcut |
A numeric indicating line width of optimal cutoff. |
lwd.study |
A numeric indicating line width of individual studies. |
shading |
A character indicating shading and hatching
confidence region in |
col.hatching |
A character string indicating color used in hatching of the confidence region. |
lwd.hatching |
A numeric indicating line width used in hatching of the confidence region. |
ellipse |
A logical indicating whether a confidence ellipse should be drawn around the optimal cutoff. |
level |
The level used to calculate confidence intervals. |
xlim |
A character or numerical vector indicating the minimum and maximum value for the horizontal axes. |
ylim |
A numerical vector indicating the minimum and maximum value for the vertical axes. |
... |
Additional graphical arguments. |
The first argument of the plot function is an object of class "diagmeta".
The second argument which
indicates which sort of plot(s)
should be shown. For which="regression"
, a scatter plot of
the quantile-transformed proportions of negative test results with
two regression lines is shown. Points belonging to the same study
are marked with the same colour. For which="cdf"
, the two
cumulative distribution functions are shown, corresponding to the
proportions of negative test results. For which="survival"
,
the survival functions are shown, corresponding to the proportions
of positive test results. For which="Youden"
, the
(potentially weighted) sum of sensitivity and specificity minus 1
is shown; in case of lambda=0.5
(the default) this is the
Youden index. For which="ROC"
, study-specific ROC curves are
shown. For which="SROC"
, the model-based summary ROC curve
is shown. For which="density"
, the model-based densities of
both groups are shown. For which="sensspec"
, the sensitivity
(decreasing with increasing cutoff) and the specificity (increasing
with increasing cutoff) are shown. Instead of character strings, a
numeric value or vector can be used to specify plots with numbers
corresponding to the following order of plots: "regression", "cdf",
"survival", "youden", "roc", "sroc", "density", and "sensspec".
Other arguments refer to further plot parameters, such as
lines
(whether points belonging to the same study should be
joined), rlines
(whether regression curves should be drawn),
ci
/ ciSens
/ ciSpec
/ ellipse
(whether
confidence regions should be shown), line.optcut
/
mark.optcut
(whether the optimal cutoff should be
indicated), and additional plot parameters (see Arguments).
If no further arguments are provided, four standard plots ("survival", "Youden", "ROC", and "SROC") are produced in a 2 x 2 format.
Gerta Rücker [email protected], Susanne Steinhauser [email protected], Srinath Kolampally [email protected], Guido Schwarzer [email protected]
Schneider A, Linde K, Reitsma JB, Steinhauser S, Rücker G (2017): A novel statistical model for analyzing data of a systematic review generates optimal cutoff values for fractional exhaled nitric oxide for asthma diagnosis. Journal of Clinical Epidemiology, 92, 69–78
Steinhauser S, Schumacher M, Rücker G (2016): Modelling multiple thresholds in meta-analysis of diagnostic test accuracy studies. BMC Medical Research Methodology, 16, 97
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) # Regression plot with confidence intervals # plot(diag1, which = "regr", lines = FALSE, ci = TRUE) # Cumulative distribution plot with optimal cutoff line and # confidence intervals # plot(diag1, which = "cdf", line.optcut = TRUE, ci = TRUE) # Survival plot with optimal cutoff line and confidence intervals # plot(diag1, which = "survival", line.optcut = TRUE, ci = TRUE) # Youden plot of optimal cutoff line and confidence intervals # plot(diag1, which = "youden", lines = TRUE, line.optcut = TRUE, ci = TRUE) # ROC plot of lines connecting points belonging to the same study # plot(diag1, which = "ROC", lines = TRUE) # SROC plot of confidence regions for sensitivity and specificity # with optimal cutoff mark # plot(diag1, which = "SROC", ciSens = TRUE, ciSpec = TRUE, mark.optcut = TRUE, shading = "hatch") # Density plot of densities for both groups with optimal cutoff # line # plot(diag1, which = "density", line.optcut = TRUE)
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) # Regression plot with confidence intervals # plot(diag1, which = "regr", lines = FALSE, ci = TRUE) # Cumulative distribution plot with optimal cutoff line and # confidence intervals # plot(diag1, which = "cdf", line.optcut = TRUE, ci = TRUE) # Survival plot with optimal cutoff line and confidence intervals # plot(diag1, which = "survival", line.optcut = TRUE, ci = TRUE) # Youden plot of optimal cutoff line and confidence intervals # plot(diag1, which = "youden", lines = TRUE, line.optcut = TRUE, ci = TRUE) # ROC plot of lines connecting points belonging to the same study # plot(diag1, which = "ROC", lines = TRUE) # SROC plot of confidence regions for sensitivity and specificity # with optimal cutoff mark # plot(diag1, which = "SROC", ciSens = TRUE, ciSpec = TRUE, mark.optcut = TRUE, shading = "hatch") # Density plot of densities for both groups with optimal cutoff # line # plot(diag1, which = "density", line.optcut = TRUE)
Print method for objects of class diagmeta
.
## S3 method for class 'diagmeta' print(x, digits = 3, digits.prop = gs("digits.prop"), ...)
## S3 method for class 'diagmeta' print(x, digits = 3, digits.prop = gs("digits.prop"), ...)
x |
An object of class |
digits |
Number of significant digits for printing of optimal cutoff. |
digits.prop |
Number of significant digits for proportions, e.g., sensitivities and specificities. |
... |
Additional arguments. |
Gerta Rücker [email protected], Susanne Steinhauser [email protected], Srinath Kolampally [email protected]
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) diag1
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) diag1
Print method for objects of class diagstats
.
## S3 method for class 'diagstats' print( x, sensspec = TRUE, predicted = TRUE, density = FALSE, digits = 3, digits.prop = gs("digits.prop"), ... )
## S3 method for class 'diagstats' print( x, sensspec = TRUE, predicted = TRUE, density = FALSE, digits = 3, digits.prop = gs("digits.prop"), ... )
x |
An object of class |
sensspec |
A logical indicating whether sensitivities and specificies should be printed. |
predicted |
A logical indicating whether predicted values should be printed. |
density |
A logical indicating whether values of the model-based density functions should be printed. |
digits |
Number of significant digits for printing of cutoffs. |
digits.prop |
Number of significant digits for proportions, e.g., sensitivities and specificities. |
... |
Additional arguments. |
Guido Schwarzer [email protected]
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) # Values for prevalence 10% at cutoffs 25 and 50 # ds1 <- diagstats(diag1, c(25, 50), 0.10) ds1 print(ds1, predicted = FALSE)
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) # Values for prevalence 10% at cutoffs 25 and 50 # ds1 <- diagstats(diag1, c(25, 50), 0.10) ds1 print(ds1, predicted = FALSE)
Print detailed results for objects of class
summary.diagmeta
.
## S3 method for class 'summary.diagmeta' print(x, digits = 3, ...)
## S3 method for class 'summary.diagmeta' print(x, digits = 3, ...)
x |
An object of class |
digits |
Number of significant digits for printing. |
... |
Additional arguments. |
Gerta Rücker [email protected], Susanne Steinhauser [email protected], Srinath Kolampally [email protected], Guido Schwarzer [email protected]
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) summary(diag1) print(summary(diag1), digits.prop = 2)
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) summary(diag1) print(summary(diag1), digits.prop = 2)
Meta-analysis of studies of the diagnostic test accuracy of fractional exhaled nitric oxide (FENO) for diagnosis of asthma.
The data were collected for a systematic review by Karrasch et al. (2017) and are published as a supplement (Appendix 1) to Schneider et al. (2017). They have been preprocessed for use in R package diagmeta.
A data frame with the following columns:
study_id | numeric study ID |
author | first author |
year | year of publication |
group | information on subgroup |
cutpoint | cutpoint (FeNO [ppb]) |
tpos | number of true positives |
fneg | number of false negatives |
fpos | number of false positives |
tneg | number of true negatives |
Karrasch S, Linde K, Rücker G, Sommer H, Karsch-Volk M, Kleijnen J, Jörres RA, Schneider A (2017): Accuracy of FENO for diagnosing asthma: a systematic review. Thorax, 72, 109e16
Schneider A, Linde K, Reitsma JB, Steinhauser S, Rücker G (2017): A novel statistical model for analyzing data of a systematic review generates optimal cutoff values for fractional exhaled nitric oxide for asthma diagnosis. Journal of Clinical Epidemiology, 92, 69–78
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) plot(diag1)
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) plot(diag1)
Summary method for objects of class diagmeta
.
## S3 method for class 'diagmeta' summary(object, ...)
## S3 method for class 'diagmeta' summary(object, ...)
object |
An object of class |
... |
Additional arguments. |
A list with classes 'summary.diagmeta' and 'diagmeta' is
returned. The list elements are identical to a
diagmeta
object.
Srinath Kolampally [email protected], Guido Schwarzer [email protected]
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) summary(diag1)
# FENO dataset # data(Schneider2017) diag1 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint, studlab = paste(author, year, group), data = Schneider2017, log.cutoff = TRUE) summary(diag1)