p.adjust is not misciting for BY. The reference is to Theorem 1.3 (proof in Section 5 on p.1182) in the paper:
Benjamini, Y., and Yekutieli, D. (2001). The control of the false discovery rate in multiple testing under dependency. Annals of Statistics 29, 1165–1188.
As this paper discusses several different adjustments, the reference on the help page (at the time of writing) for p.adjust() is somewhat obscure. The method is guaranteed to control FDR, at the stated rate, under the most general dependence structure. There are informative comments in Christopher Genovese's slides at:
www.stat.cmu.edu/~genovese/talks/hannover1-04.pdf
Note the comment on slide 37, referring to the method of Theorem 1.3 in the BY 2001 paper [method='BY' with p.adjust()] that:
"Unfortunately, this is typically very conservative, sometimes even more so than Bonferroni."
Numerical example: method='BY'
vs method='BH'
The following compares method='BY' with method='BH', using R's p.adjust() function, for the p-values from column 2 of Table 2 in the Benjamini and Hochberg (2000) paper:
> p <- c(0.85628,0.60282,0.44008,0.41998,0.3864,0.3689,0.31162,0.23522,0.20964,
0.19388,0.15872,0.14374,0.10026,0.08226,0.07912,0.0659,0.05802,0.05572,
0.0549,0.04678,0.0465,0.04104,0.02036,0.00964,0.00904,0.00748,0.00404,
0.00282,0.002,0.0018,2e-05,2e-05,2e-05,0)
> pmat <- rbind(p,p.adjust(p, method='BH'),p.adjust(p, method='BY'))
> rownames(pmat)<-c("pval","adj='BH","adj='BY'")
> round(pmat,4)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
pval 0.8563 0.6028 0.4401 0.4200 0.3864 0.3689 0.3116 0.2352 0.2096
adj='BH 0.8563 0.6211 0.4676 0.4606 0.4379 0.4325 0.3784 0.2962 0.2741
adj='BY' 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
[,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18]
pval 0.1939 0.1587 0.1437 0.1003 0.0823 0.0791 0.0659 0.0580 0.0557
adj='BH 0.2637 0.2249 0.2125 0.1549 0.1332 0.1332 0.1179 0.1096 0.1096
adj='BY' 1.0000 0.9260 0.8751 0.6381 0.5485 0.5485 0.4856 0.4513 0.4513
[,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27]
pval 0.0549 0.0468 0.0465 0.0410 0.0204 0.0096 0.0090 0.0075 0.0040
adj='BH 0.1096 0.1060 0.1060 0.1060 0.0577 0.0298 0.0298 0.0283 0.0172
adj='BY' 0.4513 0.4367 0.4367 0.4367 0.2376 0.1227 0.1227 0.1164 0.0707
[,28] [,29] [,30] [,31] [,32] [,33] [,34]
pval 0.0028 0.0020 0.0018 0e+00 0e+00 0e+00 0
adj='BH 0.0137 0.0113 0.0113 2e-04 2e-04 2e-04 0
adj='BY' 0.0564 0.0467 0.0467 7e-04 7e-04 7e-04 0
Note: The multiplier that relates the BY values to the BH values is $\sum_{i=1}^m (1/i)$, where $m$ is the number of p-values. Multipliers are, for example values m = 30, 34, 226, 1674, 12365:
> mult <- sapply(c(11, 30, 34, 226, 1674, 12365), function(i)sum(1/(1:i)))
setNames(mult, paste(c('m =',rep('',5)), c(11, 30, 34, 226, 1674, 12365)))
m = 11 30 34 226 1674 12365
3.020 3.995 4.118 6.000 8.000 10.000
Check that for the example above, where $m$=34, the multiplier is 4.118