Probabilistic sensitivity analysis to correct for exposure misclassification or
outcome misclassification and random error.
Non-differential misclassification is assumed when only the two bias parameters
seca.parms
and spca.parms
are provided. Adding the 2 parameters
seexp.parms
and spexp.parms
(i.e. providing the 4 bias parameters)
evaluates a differential misclassification.
Usage
probsens(
case,
exposed,
type = c("exposure", "outcome"),
reps = 1000,
seca.parms = list(dist = c("constant", "uniform", "triangular", "trapezoidal",
"logit-logistic", "logit-normal", "beta"), parms = NULL),
seexp.parms = NULL,
spca.parms = list(dist = c("constant", "uniform", "triangular", "trapezoidal",
"logit-logistic", "logit-normal", "beta"), parms = NULL),
spexp.parms = NULL,
corr.se = NULL,
corr.sp = NULL,
discard = TRUE,
alpha = 0.05
)
Arguments
- case
Outcome variable. If a variable, this variable is tabulated against.
- exposed
Exposure variable.
- type
Choice of correction for exposure or outcome misclassification.
- reps
Number of replications to run.
- seca.parms
List defining:
The sensitivity of exposure classification among those with the outcome (when
type = "exposure"
), orThe sensitivity of outcome classification among those with the exposure (when
type = "outcome"
).
The first argument provides the probability distribution function (constant, uniform, triangular, trapezoidal, logit-logistic, logit-normal, or beta) and the second its parameters as a vector. Logit-logistic and logit-normal distributions can be shifted by providing lower and upper bounds. Avoid providing these values if a non-shifted distribution is desired.
constant: constant value,
uniform: min, max,
triangular: lower limit, upper limit, mode,
trapezoidal: min, lower mode, upper mode, max,
logit-logistic: location, scale, lower bound shift, upper bound shift,
logit-normal: location, scale, lower bound shift, upper bound shift.
beta: alpha, beta.
- seexp.parms
List defining:
The sensitivity of exposure classification among those without the outcome (when
type = "exposure"
), orThe sensitivity of outcome classification among those without the exposure (when
type = "outcome"
).
- spca.parms
List as above for
seca.parms
but for specificity.- spexp.parms
List as above for
seexp.parms
but for specificity.- corr.se
Correlation between case and non-case sensitivities.
- corr.sp
Correlation between case and non-case specificities.
- discard
A logical scalar. In case of negative adjusted count, should the draws be discarded? If set to FALSE, negative counts are set to zero.
- alpha
Significance level.
Value
A list with elements:
- obs.data
The analyzed 2 x 2 table from the observed data.
- obs.measures
A table of observed relative risk and odds ratio with confidence intervals.
- adj.measures
A table of corrected relative risks and odds ratios.
- sim.df
Data frame of random parameters and computed values.
- reps
Number of replications.
References
Lash, T.L., Fox, M.P, Fink, A.K., 2009 Applying Quantitative Bias Analysis to Epidemiologic Data, pp.117--150, Springer.
Examples
# The data for this example come from:
# Greenland S., Salvan A., Wegman D.H., Hallock M.F., Smith T.J.
# A case-control study of cancer mortality at a transformer-assembly facility.
# Int Arch Occup Environ Health 1994; 66(1):49-54.
set.seed(123)
# Exposure misclassification, non-differential
probsens(matrix(c(45, 94, 257, 945),
dimnames = list(c("BC+", "BC-"), c("Smoke+", "Smoke-")), nrow = 2, byrow = TRUE),
type = "exposure",
reps = 20000,
seca.parms = list("trapezoidal", c(.75, .85, .95, 1)),
spca.parms = list("trapezoidal", c(.75, .85, .95, 1)))
#> Chosen prior Se/Sp distributions lead to 784 negative adjusted counts which were discarded.
#> --Observed data--
#> Outcome: BC+
#> Comparing: Smoke+ vs. Smoke-
#>
#> Smoke+ Smoke-
#> BC+ 45 94
#> BC- 257 945
#>
#> 2.5% 97.5%
#> Observed Relative Risk: 1.646999 1.182429 2.294094
#> Observed Odds Ratio: 1.760286 1.202457 2.576898
#> ---
#> Median 2.5th percentile
#> Relative Risk -- systematic error: 2.189053 1.738635
#> Odds Ratio -- systematic error: 2.472228 1.872992
#> Relative Risk -- systematic and random error: 2.256939 1.422139
#> Odds Ratio -- systematic and random error: 2.566966 1.492794
#> 97.5th percentile
#> Relative Risk -- systematic error: 6.655220
#> Odds Ratio -- systematic error: 14.674038
#> Relative Risk -- systematic and random error: 6.735689
#> Odds Ratio -- systematic and random error: 14.740262
# Exposure misclassification, differential
probsens(matrix(c(45, 94, 257, 945),
dimnames = list(c("BC+", "BC-"), c("Smoke+", "Smoke-")), nrow = 2, byrow = TRUE),
type = "exposure",
reps = 20000,
seca.parms = list("trapezoidal", c(.75, .85, .95, 1)),
seexp.parms = list("trapezoidal", c(.7, .8, .9, .95)),
spca.parms = list("trapezoidal", c(.75, .85, .95, 1)),
spexp.parms = list("trapezoidal", c(.7, .8, .9, .95)),
corr.se = .8,
corr.sp = .8)
#> Chosen prior Se/Sp distributions lead to 4290 negative adjusted counts which were discarded.
#> --Observed data--
#> Outcome: BC+
#> Comparing: Smoke+ vs. Smoke-
#>
#> Smoke+ Smoke-
#> BC+ 45 94
#> BC- 257 945
#>
#> 2.5% 97.5%
#> Observed Relative Risk: 1.646999 1.182429 2.294094
#> Observed Odds Ratio: 1.760286 1.202457 2.576898
#> ---
#> Median 2.5th percentile
#> Relative Risk -- systematic error: 2.915912 1.683775
#> Odds Ratio -- systematic error: 3.531380 1.809583
#> Relative Risk -- systematic and random error: 2.995075 1.516361
#> Odds Ratio -- systematic and random error: 3.650628 1.607822
#> 97.5th percentile
#> Relative Risk -- systematic error: 10.165878
#> Odds Ratio -- systematic error: 49.256329
#> Relative Risk -- systematic and random error: 10.523872
#> Odds Ratio -- systematic and random error: 51.193712
probsens(matrix(c(45, 94, 257, 945),
dimnames = list(c("BC+", "BC-"), c("Smoke+", "Smoke-")), nrow = 2, byrow = TRUE),
type = "exposure",
reps = 20000,
seca.parms = list("beta", c(908, 16)),
seexp.parms = list("beta", c(156, 56)),
spca.parms = list("beta", c(153, 6)),
spexp.parms = list("beta", c(205, 18)),
corr.se = .8,
corr.sp = .8)
#> --Observed data--
#> Outcome: BC+
#> Comparing: Smoke+ vs. Smoke-
#>
#> Smoke+ Smoke-
#> BC+ 45 94
#> BC- 257 945
#>
#> 2.5% 97.5%
#> Observed Relative Risk: 1.646999 1.182429 2.294094
#> Observed Odds Ratio: 1.760286 1.202457 2.576898
#> ---
#> Median 2.5th percentile
#> Relative Risk -- systematic error: 1.608690 1.474532
#> Odds Ratio -- systematic error: 1.714321 1.550609
#> Relative Risk -- systematic and random error: 1.627964 1.150670
#> Odds Ratio -- systematic and random error: 1.738616 1.165817
#> 97.5th percentile
#> Relative Risk -- systematic error: 1.940020
#> Odds Ratio -- systematic error: 2.136385
#> Relative Risk -- systematic and random error: 2.343554
#> Odds Ratio -- systematic and random error: 2.647539
probsens(matrix(c(338, 490, 17984, 32024),
dimnames = list(c("BC+", "BC-"), c("Smoke+", "Smoke-")), nrow = 2, byrow = TRUE),
type = "exposure",
reps = 1000,
seca.parms = list("trapezoidal", c(.8, .9, .9, 1)),
spca.parms = list("trapezoidal", c(.8, .9, .9, 1)))
#> --Observed data--
#> Outcome: BC+
#> Comparing: Smoke+ vs. Smoke-
#>
#> Smoke+ Smoke-
#> BC+ 338 490
#> BC- 17984 32024
#>
#> 2.5% 97.5%
#> Observed Relative Risk: 1.224104 1.066961 1.404390
#> Observed Odds Ratio: 1.228315 1.068081 1.412589
#> ---
#> Median 2.5th percentile
#> Relative Risk -- systematic error: 1.298245 1.246925
#> Odds Ratio -- systematic error: 1.304096 1.251625
#> Relative Risk -- systematic and random error: 1.295969 1.122475
#> Odds Ratio -- systematic and random error: 1.301775 1.124729
#> 97.5th percentile
#> Relative Risk -- systematic error: 1.382128
#> Odds Ratio -- systematic error: 1.390072
#> Relative Risk -- systematic and random error: 1.508913
#> Odds Ratio -- systematic and random error: 1.519908
# Disease misclassification
probsens(matrix(c(173, 602, 134, 663),
dimnames = list(c("BC+", "BC-"), c("Smoke+", "Smoke-")), nrow = 2, byrow = TRUE),
type = "outcome",
reps = 20000,
seca.parms = list("uniform", c(.8, 1)),
spca.parms = list("uniform", c(.8, 1)))
#> --Observed data--
#> Outcome: BC+
#> Comparing: Smoke+ vs. Smoke-
#>
#> Smoke+ Smoke-
#> BC+ 173 602
#> BC- 134 663
#>
#> 2.5% 97.5%
#> Observed Relative Risk: 1.184136 1.056368 1.327359
#> Observed Odds Ratio: 1.421865 1.106140 1.827708
#> ---
#> Median 2.5th percentile
#> Relative Risk -- systematic error: 1.232598 1.186130
#> Odds Ratio -- systematic error: 1.566440 1.446098
#> Relative Risk -- systematic and random error: 1.237320 1.090023
#> Odds Ratio -- systematic and random error: 1.570343 1.203445
#> 97.5th percentile
#> Relative Risk -- systematic error: 1.311775
#> Odds Ratio -- systematic error: 1.735362
#> Relative Risk -- systematic and random error: 1.410672
#> Odds Ratio -- systematic and random error: 2.060658
probsens(matrix(c(338, 490, 17984, 32024),
dimnames = list(c("BC+", "BC-"), c("Smoke+", "Smoke-")), nrow = 2, byrow = TRUE),
type = "outcome",
reps = 20000,
seca.parms = list("uniform", c(.2, .6)),
seexp.parms = list("uniform", c(.1, .5)),
spca.parms = list("uniform", c(.99, 1)),
spexp.parms = list("uniform", c(.99, 1)),
corr.se = .8,
corr.sp = .8)
#> --Observed data--
#> Outcome: BC+
#> Comparing: Smoke+ vs. Smoke-
#>
#> Smoke+ Smoke-
#> BC+ 338 490
#> BC- 17984 32024
#>
#> 2.5% 97.5%
#> Observed Relative Risk: 1.224104 1.066961 1.404390
#> Observed Odds Ratio: 1.228315 1.068081 1.412589
#> ---
#> Median 2.5th percentile
#> Relative Risk -- systematic error: 0.9859093 0.4831291
#> Odds Ratio -- systematic error: 0.9853800 0.4626676
#> Relative Risk -- systematic and random error: 0.9838802 0.4758175
#> Odds Ratio -- systematic and random error: 0.9832842 0.4575911
#> 97.5th percentile
#> Relative Risk -- systematic error: 1.8899501
#> Odds Ratio -- systematic error: 1.9287984
#> Relative Risk -- systematic and random error: 1.9211116
#> Odds Ratio -- systematic and random error: 1.9592833
probsens(matrix(c(173, 602, 134, 663),
dimnames = list(c("BC+", "BC-"), c("Smoke+", "Smoke-")), nrow = 2, byrow = TRUE),
type = "outcome",
reps = 20000,
seca.parms = list("beta", c(100, 5)),
seexp.parms = list("beta", c(110, 10)),
spca.parms = list("beta", c(120, 15)),
spexp.parms = list("beta", c(130, 30)),
corr.se = .8,
corr.sp = .8)
#> --Observed data--
#> Outcome: BC+
#> Comparing: Smoke+ vs. Smoke-
#>
#> Smoke+ Smoke-
#> BC+ 173 602
#> BC- 134 663
#>
#> 2.5% 97.5%
#> Observed Relative Risk: 1.184136 1.056368 1.327359
#> Observed Odds Ratio: 1.421865 1.106140 1.827708
#> ---
#> Median 2.5th percentile
#> Relative Risk -- systematic error: 1.373792 1.313693
#> Odds Ratio -- systematic error: 1.810032 1.679607
#> Relative Risk -- systematic and random error: 1.382525 1.217798
#> Odds Ratio -- systematic and random error: 1.826700 1.398461
#> 97.5th percentile
#> Relative Risk -- systematic error: 1.513627
#> Odds Ratio -- systematic error: 2.080689
#> Relative Risk -- systematic and random error: 1.591369
#> Odds Ratio -- systematic and random error: 2.411097