[R] test Breslow-Day for svytable??

David Winsemius dwinsemius at comcast.net
Fri Aug 31 18:27:33 CEST 2012


On Aug 31, 2012, at 7:20 AM, Diana Marcela Martinez Ruiz wrote:

> Hi all,
> 
> I want to know how to perform the test Breslow-Day test for homogeneity of 
> odds ratios (OR) stratified for svytable. This test is obtained with the following code:
> 
> epi.2by2 (dat = daty, method = "case.control" conf.level = 0.95,

missing comma here ...........................^

>    units = 100, homogeneity = "breslow.day", verbose = TRUE)
> 
> where "daty" is the object type table  svytable consider it, but when I run the code
> does not throw the homogeneity test.

You are asked in the Posting guide to copy all errors and warnings when asking about unexpected behavior. When I run epi.2y2 on the output of a syvtable object I get no errors, but I do get warnings which I think are due to non-integer entries in the weighted table. I also get from a svytable() usingits first example on the help page an object that is NOT a set of 2 x 2 tables in an array of the structure as expected by epi.2by2(). The fact that epi.2by2() will report numbers with labels for a 2 x 3 table means that its error checking is weak.

This is the output of str(dat) from one of the example on epi.2by2's help page:

> str(dat)
 table [1:2, 1:2, 1:3] 41 13 6 53 66 37 25 83 23 37 ...
 - attr(*, "dimnames")=List of 3
  ..$ Exposure: chr [1:2] "+" "-"
  ..$ Disease : chr [1:2] "+" "-"
  ..$ Strata  : chr [1:3] "20-29 yrs" "30-39 yrs" "40+ yrs"

Notice that is is a 2 x 2 x n array. (Caveat:: from here on out I am simply reading the help pages and using str() to look at the objects created to get an idea regarding success or failure. I am not an experienced user of either package.)  I doubt that  what you got from svytable is a 2 x 2 table. As another example you can build a 2 x 2 x n table from the built-in dataset: UCBAdmissions 

DF <- as.data.frame(UCBAdmissions)
## Now 'DF' is a data frame with a grid of the factors and the counts
## in variable 'Freq'.
dat2 <- xtabs(Freq ~ Gender + Admit+Dept, DF)
epiR::epi.2by2(dat = dat2, method = "case.control", conf.level = 0.95, 
     units = 100, homogeneity = "breslow.day", verbose = TRUE)$OR.homog
#-------------
  test.statistic df    p.value
1       18.82551  5 0.00207139

Using svydesign and svytable I _think_ this is how one would go about constructing a 2 x 2 table:

tbl2<-svydesign(  ~ Gender + Admit+Dept, weights=~Freq, data=DF)
  summary(dclus1)
(tbl2by2 <- svytable(~ Gender + Admit+Dept, tbl2))
 epiR::epi.2by2(dat = tbl, method = "case.control", conf.level = 0.95, 
     units = 100, homogeneity = "breslow.day", verbose = TRUE)$OR.homog
#-----------------------
  test.statistic df    p.value
1       18.82551  5 0.00207139

(At least I got internal consistency. I see you copied Thomas Lumley, which is a good idea. I'll be happy to get corrected on any point. I'm adding the maintainer of epiR to the recipients.)

-- 
David Winsemius, MD
Alameda, CA, USA




More information about the R-help mailing list