edge.qvalue: Qvalue function from EDGE software

Description Usage Arguments Author(s) Examples

Description

Implement Qvalue methodology on list of P values.

Usage

1
edge.qvalue(p, lambda = seq(0, 0.9, 0.05), pi0.method = "smoother", fdr.level = NULL, robust = FALSE, smooth.df = 3, smooth.log.pi0 = FALSE, ...)

Arguments

p

Vector of P values

lambda

The value of the tuning parameter to estimate pi_0. Must be in [0,1). Optional.

pi0.method

Either "smoother" or "bootstrap"; the method for automatically choosing tuning parameter in the estimation of pi_0, the proportion of true null hypotheses

fdr.level

A level at which to control the FDR. Must be in (0,1]. Optional; if this is selected, a vector of TRUE and FALSE is returned that specifies whether each q-value is less than fdr.level or not.

robust

An indicator of whether it is desired to make the estimate more robust for small p-values and a direct finite sample estimate of pFDR. Optional.

smooth.df

Number of degrees-of-freedom to use when estimating pi_0 with a smoother. Optional.

smooth.log.pi0

If TRUE and 'pi0.method' = "smoother", pi_0 will be estimated by applying a smoother to a scatterplot of log pi_0 estimates against the tuning parameter lambda. Optional.

...

Other potential arguments.

Author(s)

John D. Storey <jstorey@princeton.edu>

Examples

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
##---- Should be DIRECTLY executable !! ----
##-- ==>  Define data, use random,
##--	or do  help(data=index)  for the standard data sets.

## The function is currently defined as
function (p, lambda = seq(0, 0.9, 0.05), pi0.method = "smoother", 
    fdr.level = NULL, robust = FALSE, smooth.df = 3, smooth.log.pi0 = FALSE, 
    ...) 
{
    err.func <- "edge.qvalue"
    if (min(p) < 0 || max(p) > 1) {
        err.msg(err.func, "P-values not in valid range.")
        return(invisible(1))
    }
    if (length(lambda) > 1 && length(lambda) < 4) {
        err.msg(err.func, "If length of lambda greater than 1, you need at least 4 values.")
        return(invisible(1))
    }
    if (length(lambda) > 1 && (min(lambda) < 0 || max(lambda) >= 
        1)) {
        err.msg(err.func, "Lambda must be in [0,1).")
        return(invisible(1))
    }
    m <- length(p)
    if (length(lambda) == 1) {
        if (lambda < 0 || lambda >= 1) {
            err.msg(err.func, "Lambda must be in [0,1).")
            return(invisible(1))
        }
        pi0 <- mean(p >= lambda)/(1 - lambda)
        pi0 <- min(pi0, 1)
    }
    else {
        pi0 <- rep(0, length(lambda))
        for (i in 1:length(lambda)) {
            pi0[i] <- mean(p >= lambda[i])/(1 - lambda[i])
        }
        if (pi0.method == "smoother") {
            if (smooth.log.pi0) {
                pi0 <- log(pi0)
                spi0 <- smooth.spline(lambda, pi0, df = smooth.df)
                pi0 <- predict(spi0, x = max(lambda))$y
            }
            if (smooth.log.pi0) {
                pi0 <- exp(pi0)
            }
            pi0 <- min(pi0, 1)
        }
        else if (pi0.method == "bootstrap") {
            minpi0 <- min(pi0)
            mse <- rep(0, length(lambda))
            pi0.boot <- rep(0, length(lambda))
            for (i in 1:100) {
                p.boot <- sample(p, size = m, replace = TRUE)
                for (i in 1:length(lambda)) {
                  pi0.boot[i] <- mean(p.boot > lambda[i])/(1 - 
                    lambda[i])
                }
                mse <- mse + (pi0.boot - minpi0)^2
            }
            pi0 <- min(pi0[mse == min(mse)])
            pi0 <- min(pi0, 1)
        }
        else {
            err.msg(err.func, "'pi0.method' must be one of 'smoother' or 'bootstrap'")
            return(invisible(1))
        }
    }
    if (pi0 <= 0) {
        err.msg(err.func, "The estimated pi0 <= 0. Check that you have valid\np-values or use another lambda method.")
        return(invisible(1))
    }
    if (!is.null(fdr.level) && (fdr.level <= 0 || fdr.level > 
        1)) {
        err.msg(err.func, "'fdr.level' must be within (0,1].")
        return(invisible(1))
    }
    u <- order(p)
    qvalue.rank <- function(x) {
        idx <- sort.list(x)
        fc <- factor(x)
        nl <- length(levels(fc))
        bin <- as.integer(fc)
        tbl <- tabulate(bin)
        cs <- cumsum(tbl)
        tbl <- rep(cs, tbl)
        tbl[idx] <- tbl
        return(tbl)
    }
    v <- qvalue.rank(p)
    qvalue <- pi0 * m * p/v
    if (robust) {
        qvalue <- pi0 * m * p/(v * (1 - (1 - p)^m))
    }
    qvalue[u[m]] <- min(qvalue[u[m]], 1)
    for (i in (m - 1):1) {
        qvalue[u[i]] <- min(qvalue[u[i]], qvalue[u[i + 1]], 1)
    }
    if (!is.null(fdr.level)) {
        retval <- list(call = match.call(), pi0 = pi0, qvalues = qvalue, 
            pvalues = p, fdr.level = fdr.level, significant = (qvalue <= 
                fdr.level), lambda = lambda)
    }
    else {
        retval <- list(call = match.call(), pi0 = pi0, qvalues = qvalue, 
            pvalues = p, lambda = lambda)
    }
    class(retval) <- "qvalue"
    return(retval)
  }

Sage-Bionetworks/snm documentation built on May 9, 2019, 12:14 p.m.