diff --git a/R/qvalue_trunc.R b/R/qvalue_trunc.R deleted file mode 100644 index e517ece..0000000 --- a/R/qvalue_trunc.R +++ /dev/null @@ -1,59 +0,0 @@ -#' @export -qvalue_truncp <- function(p, fdr.level = NULL, pfdr = FALSE, lfdr.out = TRUE, pi0 = NULL, ...) { - # Argument checks - p_in <- qvals_out <- lfdr_out <- p - rm_na <- !is.na(p) - p <- p[rm_na] - if (min(p) < 0 || max(p) > 1) { - stop("p-values not in valid range [0, 1].") - } else if (!is.null(fdr.level) && (fdr.level <= 0 || fdr.level > 1)) { - stop("'fdr.level' must be in (0, 1].") - } - p <- p / max(p) - # Calculate pi0 estimate - if (is.null(pi0)) { - pi0s <- pi0est(p, ...) - } else { - if (pi0 > 0 && pi0 <= 1) { - pi0s = list() - pi0s$pi0 = pi0 - } else { - stop("pi0 is not (0,1]") - } - } - - # Calculate q-value estimates - m <- length(p) - i <- m:1L - o <- order(p, decreasing = TRUE) - ro <- order(o) - if (pfdr) { - qvals <- pi0s$pi0 * pmin(1, cummin(p[o] * m / (i * (1 - (1 - p[o]) ^ m))))[ro] - } else { - qvals <- pi0s$pi0 * pmin(1, cummin(p[o] * m /i ))[ro] - } - qvals_out[rm_na] <- qvals - # Calculate local FDR estimates - if (lfdr.out) { - lfdr <- lfdr(p = p, pi0 = pi0s$pi0, ...) - lfdr_out[rm_na] <- lfdr - } else { - lfdr_out <- NULL - } - - # Return results - if (!is.null(fdr.level)) { - retval <- list(call = match.call(), pi0 = pi0s$pi0, qvalues = qvals_out, - pvalues = p_in, lfdr = lfdr_out, fdr.level = fdr.level, - significant = (qvals <= fdr.level), - pi0.lambda = pi0s$pi0.lambda, lambda = pi0s$lambda, - pi0.smooth = pi0s$pi0.smooth) - } else { - retval <- list(call = match.call(), pi0 = pi0s$pi0, qvalues = qvals_out, - pvalues = p_in, lfdr = lfdr_out, pi0.lambda = pi0s$pi0.lambda, - lambda = pi0s$lambda, pi0.smooth = pi0s$pi0.smooth) - } - class(retval) <- "qvalue" - return(retval) -} - diff --git a/R/qvalue_truncp.R b/R/qvalue_truncp.R new file mode 100644 index 0000000..7203a42 --- /dev/null +++ b/R/qvalue_truncp.R @@ -0,0 +1,12 @@ +#' Q-value on truncated p-values +#' +#' Calculate \code{\link{qvalue}}, but with p-values re-scaled to be in `[0, 1]` range +#' +#' @seealso \code{\link{qvalue}} +#' +#' @export +qvalue_truncp <- function(p, fdr.level = NULL, pfdr = FALSE, lfdr.out = TRUE, pi0 = NULL, ...) { + p <- p / max(p) + qvalue(p, fdr.level, pfdr, lfdr.out, pi0, ...) +} + diff --git a/man/qvalue_truncp.Rd b/man/qvalue_truncp.Rd new file mode 100644 index 0000000..7b100bb --- /dev/null +++ b/man/qvalue_truncp.Rd @@ -0,0 +1,21 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/qvalue_truncp.R +\name{qvalue_truncp} +\alias{qvalue_truncp} +\title{Q-value on truncated p-values} +\usage{ +qvalue_truncp( + p, + fdr.level = NULL, + pfdr = FALSE, + lfdr.out = TRUE, + pi0 = NULL, + ... +) +} +\description{ +Calculate \code{\link{qvalue}}, but with p-values re-scaled to be in `[0, 1]` range +} +\seealso{ +\code{\link{qvalue}} +}