"svdfcPE" <-
function(data, U, start=1, end=100, verbose=TRUE, global=TRUE, design, ...)
{
  # Init
    nperm <- end-start+1

  # Calculate original svdfc statistic
    t <- abs(svdfc(data=data, U=U, design=design, ...))

  # Generate random svdfc statistics
    combinats <- combn(nrow(design), sum(design[,2]))
    combinats <- apply(combinats, 2, function(x) c(x, c(1:nrow(design))[-x]))
    t.rand <- matrix(nrow=nrow(data), ncol=nperm)
    for(i in start:end) {
      data.rand <- data[,combinats[,i]]
      t.rand[,(i-start+1)] <- abs(svdfc(data=data.rand, U=U, design=design, ...))
      if(verbose && !(i %% 10)) cat(paste(i, " ", sep=""))
    }
    if(verbose) cat("\n")

  # Compute p-values
    t.pvalues <- rep(NA,nrow(data))
    for(j in 1:nrow(data)) {
      if(global) t.pvalues[j] <- min(1, sum(t.rand >= t[j])/nperm)
      else t.pvalues[j] <- sum(t.rand[j,] >= t[j])/nperm
      if(verbose && !(j %% 100)) cat(paste(j, " ", sep=""))
    }
    if(verbose) cat("\n")

    return(t.pvalues)
}