rsc <- function(cv, threshold = "minimum", weights = NULL){ if(!is.null(weights)){ if(is.matrix(weights)){ weights <- as.numeric(weights[lower.tri(weights)]) } if(is.vector(weights)){ if(length(weights) != length(cv$rmadvec)){ stop('weights must be a vector matching rmadvec') } }else{ stop('weights must be a vector matching rmadvec or p x p matrix') } } ## inputs ## cv = u ## a class cv_rsc or any other correlation matrix ## threshold = "minimum" ## "minimum", "minimum1se" or numeric in (0,1) if(is(cv, "rsc_cv")){ ## check threshold if(is.numeric(threshold)){ if(length(threshold)>1){ stop("if a specific value for 'threshold' is chosen, this must be a single numeric value in (0,1)") }else if(threshold <=0 | threshold >=1){ stop("if a specific value for 'threshold' is chosen, this must be a single numeric value in (0,1)") } }else{ if({threshold != "minimum"} & {threshold != "minimum1se"}){ stop("'threshold' must be one of the following: 'minimum', 'minimum1se', a numeric value in (0,1).") } if(threshold == "minimum"){ threshold <- cv$minimum }else if(threshold == "minimum1se"){ threshold <- cv$minimum1se } } # make a copy rmadvec <- cv$rmadvec ## threshold the rmadvec if(is.null(weights)){ rmadvec[ abs(rmadvec) < threshold ] <- 0 }else{ T <- abs(rmadvec) * weights rmadvec[ T < threshold ] <- 0 } nc <- length(rmadvec) p <- {1 + sqrt( 1 + 8 * nc ) } / 2 R <- Matrix(1, nrow = p, ncol = p, sparse = TRUE) R[lower.tri(R , diag = FALSE)] <- rmadvec R <- forceSymmetric(R , uplo="L") ## attach dimnames if needed if(!is.null(cv$varnames)){ dimnames(R)[[1]] <- dimnames(R)[[2]] <- cv$varnames } }else{ stop("'cv' must be a an object of class 'rsc_cv' obtained from 'rsc::rsc_cv'") } return(R) }