Estoy confundido si uno debe excluir a falta de observaciones a la hora de ajustar los valores de p para pruebas múltiples. Parece ser que no existe consenso entre la función de R en si hacerlo o no. stats::p.adjust(x)
se comporta de forma diferente si se especifica el valor predeterminado n = length(x)
de forma explícita (NAs son contados) vs si no se especifica el valor predeterminado de forma explícita (NAs no se cuentan). multtest::rawp2adjp(x)
cuenta NAs. ¿Cuál es el comportamiento correcto?
EDIT: Clarifcation acerca de lo que se entiende por NA
en esta información fue solicitada en los comentarios. Los valores de p se calcula por residual después de una mezcla de efectos de ajuste del modelo para identificar valores atípicos en los datos. El procedimiento experimental es complejo, y que se lleva a cabo por muchos experimentators en paralelo, por lo que los errores son posibles. Significado identifica puntos de datos, que son inesperadamente lejos de la equipada con valor, dado el error residual se centra y se distribuye normalmente -> probablemente atípicos [ref]. Algunas observaciones tuvo que ser removido antes del ajuste, por ejemplo, porque hay muy poco observaciones para un grupo determinado que causa problemas con el ajuste del modelo o ya estaban desaparecidos antes del análisis debido experimental fracaso.
MWE
## Generate some p values and compare the three possibilities of
## adjusting for multiple testing
n <- 10000
x <- pmin(rexp(n,rate =1/0.01), 1) # Generate some p values
x[sample(c(F,T), n/10, TRUE)] <- NA # delete some observations
# Three different methods of p value calculation
x1 <- p.adjust(x, method = 'holm')
x2 <- p.adjust(x, method = 'holm', n = length(x))
x3 <- multtest::mt.rawp2adjp(x, proc = 'Holm')
x3 <- x3$adjp[order(x3$index),"Holm"]
# Compare p.adjust and mt.rawp2adjp
par(mfrow=c(1,2))
plot(x1, x3); title('p.adj(x) \n vs. mt.rawp2adjp')
plot(x2, x3); title('p.adj(x, len = length(x)) \n vs. mt.rawp2adjp')
Apéndice: ¿por Qué stats::p.adjust
se comportan de la manera que lo hace?
Principio de p.adjust
código fuente, R 3.4.3:
En la cabeza, n
se define como length(p)
, sin embargo, R no se evalúa argumentos hasta que se necesitan
function (p, method = p.adjust.methods, n = length(p))
{
method <- match.arg(method)
if (method == "fdr")
method <- "BH"
nm <- names(p)
p <- as.numeric(p)
p0 <- setNames(p, nm)
if (all(nna <- !is.na(p)))
nna <- TRUE
Aquí, p es despojado de todos NA
s, sin n
de ser necesario hasta este punto
p <- p[nna]
lp <- length(p)
Ahora, n
se utiliza por primera vez, lo que significa length(p)
se evalúa sólo ahora. Por lo tanto, si se deja a la configuración predeterminada, length(p[!is.na(p)])
se calcula.
stopifnot(n >= lp)
[ remaining source code omitted ]
}