sva.patched=function (dat, mod, mod0 = NULL, n.sv = NULL, method = c("irw",
"two-step"), vfilter = NULL, B = 5, numSVmethod = "be")
{
if (is.null(n.sv)) {
n.sv = num.sv(dat, mod, method = numSVmethod, vfilter = vfilter)
}
if (!is.null(vfilter)) {
if (vfilter < 100 | vfilter > dim(dat)[1]) {
stop(paste("The number of genes used in the analysis must be between 100 and",
dim(dat)[1], "\n"))
}
tmpv = rowVars(dat)
ind = which(rank(-tmpv) < vfilter)
dat = dat[ind, ]
}
if (n.sv > 0) {
cat(paste("Number of significant surrogate variables is: ",
n.sv, "\n"))
method <- match.arg(method)
if (method == "two-step") {
return(twostepsva.build(dat = dat, mod = mod, n.sv = n.sv))
}
if (method == "irw") {
# return(irwsva.build(dat = dat, mod = mod, mod0 = mod0, n.sv = n.sv, B = B))
return(irwsva.build.patched(dat = dat, mod = mod, mod0 = mod0, n.sv = n.sv, B = B))
}
}
else {
print("No significant surrogate variables")
return(list(sv = 0, pprob.gam = 0, pprob.b = 0, n.sv = 0))
}
}
irwsva.build.patched<-
function (dat, mod, mod0 = NULL, n.sv, B = 5)
{
n <- ncol(dat)
m <- nrow(dat)
if (is.null(mod0)) {
mod0 <- mod[, 1]
}
Id <- diag(n)
resid <- dat %*% (Id - mod %*% solve(t(mod) %*% mod) %*%
t(mod))
uu <- eigen(t(resid) %*% resid)
vv <- uu$vectors
ndf <- n - dim(mod)[2]
pprob <- rep(1, m)
one <- rep(1, n)
Id <- diag(n)
df1 <- dim(mod)[2] + n.sv
df0 <- dim(mod0)[2] + n.sv
rm(resid)
cat(paste("Iteration (out of", B, "):"))
for (i in 1:B) {
mod.b <- cbind(mod, uu$vectors[, 1:n.sv])
mod0.b <- cbind(mod0, uu$vectors[, 1:n.sv])
ptmp <- f.pvalue(dat, mod.b, mod0.b)
pprob.b <- (1 - sva:::edge.lfdr(ptmp))
mod.gam <- cbind(mod0, uu$vectors[, 1:n.sv])
mod0.gam <- cbind(mod0)
ptmp <- f.pvalue(dat, mod.gam, mod0.gam)
pprob.gam <- (1 - sva:::edge.lfdr(ptmp))
pprob <- pprob.gam * (1 - pprob.b)
dats <- dat * pprob
dats <- dats - rowMeans(dats)
uu <- eigen(t(dats) %*% dats)
cat(paste(i, " "))
}
# sv = fast.svd(dats, tol = 0)$v[, 1:n.sv]
# Patch code
if(any(dats!=0)) sv = fast.svd(dats, tol = 0)$v[, 1:n.sv]
else sv=svd(dats)$v[, 1:n.sv]
retval <- list(sv = sv, pprob.gam = pprob.gam, pprob.b = pprob.b,
n.sv = n.sv)
return(retval)
}