Skip to contents

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:

  1. The sensitivity of exposure classification among those with the outcome (when type = "exposure"), or

  2. The 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.

  1. constant: constant value,

  2. uniform: min, max,

  3. triangular: lower limit, upper limit, mode,

  4. trapezoidal: min, lower mode, upper mode, max,

  5. logit-logistic: location, scale, lower bound shift, upper bound shift,

  6. logit-normal: location, scale, lower bound shift, upper bound shift.

  7. beta: alpha, beta.

seexp.parms

List defining:

  1. The sensitivity of exposure classification among those without the outcome (when type = "exposure"), or

  2. The 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