BreslowDayTest.Rd
Calculates the Breslow-Day test of homogeneity for a \(2 \times 2 \times k\) table, in order to investigate if all \(k\) strata have the same OR. If OR is not given, the Mantel-Haenszel estimate is used.
BreslowDayTest(x, OR = NA, correct = FALSE)
a \(2 \times 2 \times k\) table.
the odds ratio to be tested against. If left undefined (default) the Mantel-Haenszel estimate will be used.
If TRUE, the Breslow-Day test with Tarone's adjustment is computed, which subtracts an adjustment factor to make the resulting statistic asymptotically chi-square.
For the Breslow-Day test to be valid, the sample size should be relatively large in each stratum, and at least 80% of the expected cell counts should be greater than 5. Note that this is a stricter sample size requirement than the requirement for the Cochran-Mantel-Haenszel test for tables, in that each stratum sample size (not just the overall sample size) must be relatively large. Even when the Breslow-Day test is valid, it might not be very powerful against certain alternatives, as discussed in Breslow and Day (1980).
Alternatively, it might be better to cast the entire inference problem
into the setting of a logistic regression model. Here, the underlying
question of the Breslow-Day test can be answered by investigating whether an
interaction term with the strata variable is necessary (e.g. using a
likelihood ratio test using the anova
function).
Breslow, N. E., N. E. Day (1980) The Analysis of Case-Control Studies Statistical Methods in Cancer Research: Vol. 1. Lyon, France, IARC Scientific Publications.
Tarone, R.E. (1985) On heterogeneity tests based on efficient scores, Biometrika, 72, pp. 91-95.
Jones, M. P., O'Gorman, T. W., Lemka, J. H., and Woolson, R. F. (1989) A Monte Carlo Investigation of Homogeneity Tests of the Odds Ratio Under Various Sample Size Configurations Biometrics, 45, 171-181
Breslow, N. E. (1996) Statistics in Epidemiology: The Case-Control Study Journal of the American Statistical Association, 91, 14-26.
migraine <- xtabs(freq ~ .,
cbind(expand.grid(treatment=c("active", "placebo"),
response =c("better", "same"),
gender =c("female", "male")),
freq=c(16, 5, 11, 20, 12, 7, 16, 19))
)
# get rid of gender
tab <- xtabs(Freq ~ treatment + response, migraine)
Desc(tab)
#> ──────────────────────────────────────────────────────────────────────────────
#> tab (xtabs, table)
#>
#> Summary:
#> n: 106, rows: 2, columns: 2
#>
#> Pearson's Chi-squared test (cont. adj):
#> X-squared = 7.3178, df = 1, p-value = 0.006827
#> Fisher's exact test p-value = 0.00491
#> McNemar's chi-squared = 5.0256, df = 1, p-value = 0.02497
#>
#> estimate lwr.ci upr.ci'
#>
#> odds ratio 3.3704 1.4616 7.7721
#> rel. risk (col1) 2.1636 1.2375 3.7829
#> rel. risk (col2) 0.6420 0.4712 0.8746
#> prop. diff 0.2738 0.0898 0.4397
#>
#>
#> Contingency Coeff. 0.272
#> Cramer's V 0.282
#> Kendall Tau-b 0.282
#>
#>
#> response better same Sum
#> treatment
#>
#> active freq 28 27 55
#> perc 26.4% 25.5% 51.9%
#> p.row 50.9% 49.1% .
#> p.col 70.0% 40.9% .
#>
#> placebo freq 12 39 51
#> perc 11.3% 36.8% 48.1%
#> p.row 23.5% 76.5% .
#> p.col 30.0% 59.1% .
#>
#> Sum freq 40 66 106
#> perc 37.7% 62.3% 100.0%
#> p.row . . .
#> p.col . . .
#>
#>
#> ────────────────────
#> ' 95% conf. level
#>
# only the women
female <- migraine[,, 1]
Desc(female)
#> ──────────────────────────────────────────────────────────────────────────────
#> female (table)
#>
#> Summary:
#> n: 52, rows: 2, columns: 2
#>
#> Pearson's Chi-squared test (cont. adj):
#> X-squared = 6.7595, df = 1, p-value = 0.009325
#> Fisher's exact test p-value = 0.005189
#> McNemar's chi-squared = 1.5625, df = 1, p-value = 0.2113
#>
#> estimate lwr.ci upr.ci'
#>
#> odds ratio 5.818 1.676 20.203
#> rel. risk (col1) 2.963 1.274 6.891
#> rel. risk (col2) 0.509 0.310 0.836
#> prop. diff 0.393 0.127 0.606
#>
#>
#> Contingency Coeff. 0.371
#> Cramer's V 0.400
#> Kendall Tau-b 0.400
#>
#>
#> response better same Sum
#> treatment
#>
#> active freq 16 11 27
#> perc 30.8% 21.2% 51.9%
#> p.row 59.3% 40.7% .
#> p.col 76.2% 35.5% .
#>
#> placebo freq 5 20 25
#> perc 9.6% 38.5% 48.1%
#> p.row 20.0% 80.0% .
#> p.col 23.8% 64.5% .
#>
#> Sum freq 21 31 52
#> perc 40.4% 59.6% 100.0%
#> p.row . . .
#> p.col . . .
#>
#>
#> ────────────────────
#> ' 95% conf. level
#>
# .. and the men
male <- migraine[,, 2]
Desc(male)
#> ──────────────────────────────────────────────────────────────────────────────
#> male (table)
#>
#> Summary:
#> n: 54, rows: 2, columns: 2
#>
#> Pearson's Chi-squared test (cont. adj):
#> X-squared = 0.88353, df = 1, p-value = 0.3472
#> Fisher's exact test p-value = 0.2635
#> McNemar's chi-squared = 2.7826, df = 1, p-value = 0.09529
#>
#> estimate lwr.ci upr.ci'
#>
#> odds ratio 2.0357 0.6478 6.3975
#> rel. risk (col1) 1.5918 0.7413 3.4180
#> rel. risk (col2) 0.7820 0.5259 1.1626
#> prop. diff 0.1593 -0.0984 0.3962
#>
#>
#> Contingency Coeff. 0.164
#> Cramer's V 0.167
#> Kendall Tau-b 0.167
#>
#>
#> response better same Sum
#> treatment
#>
#> active freq 12 16 28
#> perc 22.2% 29.6% 51.9%
#> p.row 42.9% 57.1% .
#> p.col 63.2% 45.7% .
#>
#> placebo freq 7 19 26
#> perc 13.0% 35.2% 48.1%
#> p.row 26.9% 73.1% .
#> p.col 36.8% 54.3% .
#>
#> Sum freq 19 35 54
#> perc 35.2% 64.8% 100.0%
#> p.row . . .
#> p.col . . .
#>
#>
#> ────────────────────
#> ' 95% conf. level
#>
BreslowDayTest(migraine)
#>
#> Breslow-Day test on Homogeneity of Odds Ratios
#>
#> data: migraine
#> X-squared = 1.4929, df = 1, p-value = 0.2218
#>
BreslowDayTest(migraine, correct = TRUE)
#>
#> Breslow-Day Test on Homogeneity of Odds Ratios (with Tarone correction)
#>
#> data: migraine
#> X-squared = 1.4905, df = 1, p-value = 0.2221
#>
salary <- array(
c(38, 12, 102, 141, 12, 9, 136, 383),
dim=c(2, 2, 2),
dimnames=list(exposure=c("exposed", "not"),
disease =c("case", "control"),
salary =c("<1000", ">=1000"))
)
# common odds ratio = 4.028269
BreslowDayTest(salary, OR = 4.02)
#>
#> Breslow-Day test on Homogeneity of Odds Ratios
#>
#> data: salary
#> X-squared = 0.080143, df = 1, p-value = 0.7771
#>