Hi Vivian,

This may be naive given the method (I am unfamiliar with glasso), but
what about simple subtraction?  If it restricts to 0, you believe you
have .3, then just: obs - .3 and restrict to 0 again?  Here is a
little example (assuming .3 correlation, but using glasso with the
covariance matrix so subtraction is marginally more complex):

dat <- lapply(list((dat <- prcomp(matrix(rnorm(1000), 200))$x), dat %*%
 chol(matrix(c(1, rep(c(rep(.3, 5), 1), 4)), 5, 5))), cov)

i <- sqrt(1/diag(dat[[2]]))
v <- dat[[2]] - matrix(c(0, rep(c(rep(.3, 5), 0), 4)), 5, 5)/(i *
rep(i, each = 5))

require(glasso)
Reduce(`-`, res <- list(true = glasso(dat[[1]], .01)$w, fake =
glasso(v, .01)$w))

Again this may not make any sense at all given how the methods actually work.

Cheers,

Josh

On Tue, Oct 18, 2011 at 7:24 PM, Vivian Shih <v...@ucla.edu> wrote:
> I've only been using R on and off for 9 months and started using the glasso
> package for sparse covariance estimation. I know the concept is to shrink
> some of the elements of the covariance matrix to zero.
>
> However, say I have a dataset that I know has some underlying "baseline"
> covariance/correlation (say, a value of 0.3), how can I change or
> incorporate that into to the code? Basically instead of "let's restrict some
> of these elements are 0 and others have different nonzero values", I'd like
> it to be "let's restrict some of these elements are 0.3 and others are
> different or higher/lower than this 0.3". Does that make any sense?
>
>
>
> Here is the glasso code if it helps:
>>
>> library(glasso)
>> glasso
>
> function (s, rho, zero = NULL, thr = 1e-04, maxit = 10000, approx = FALSE,
>    penalize.diagonal = TRUE, start = c("cold", "warm"), w.init = NULL,
>    wi.init = NULL, trace = FALSE)
> {
>    n = nrow(s)
>    BIG = 1e+10
>    if (!is.matrix(rho) & length(rho) != 1 & length(rho) != nrow(s)) {
>        stop("Wrong number of elements in rho")
>    }
>    if (length(rho) == 1 & rho == 0) {
>        cat("With rho=0, there may be convergence problems if the input
> matrix s\n is not of full rank",
>            fill = TRUE)
>    }
>    if (is.vector(rho)) {
>        rho = matrix(sqrt(rho)) %*% sqrt(rho)
>    }
>    if (length(rho) == 1) {
>        rho = matrix(rho, ncol = n, nrow = n)
>    }
>    if (!is.null(zero)) {
>        if (!is.matrix(zero)) {
>            zero = matrix(zero, nrow = TRUE)
>        }
>        for (k in 1:nrow(zero)) {
>            i = zero[k, 1]
>            j = zero[k, 2]
>            rho[i, j] = BIG
>            rho[j, i] = BIG
>        }
>    }
>    start.type = match.arg(start)
>    if (start.type == "cold") {
>        is = 0
>        ww = xx = matrix(0, nrow = n, ncol = n)
>    }
>    if (start.type == "warm") {
>        is = 1
>        if (is.null(w.init) | is.null(wi.init)) {
>            stop("Warm start specified: w.init and wi.init must be non-null")
>        }
>        ww = w.init
>        xx = wi.init
>    }
>    itrace = 1 * trace
>    ipen = 1 * (penalize.diagonal)
>    ia = 1 * approx
>    mode(rho) = "double"
>    mode(s) = "double"
>    mode(ww) = "double"
>    mode(xx) = "double"
>    mode(n) = "integer"
>    mode(maxit) = "integer"
>    mode(ia) = "integer"
>    mode(itrace) = "integer"
>    mode(ipen) = "integer"
>    mode(is) = "integer"
>    mode(thr) = "double"
>    junk <- .Fortran("glasso", n, s, rho, ia, is, itrace, ipen,
>        thr, maxit = maxit, ww = ww, xx = xx, niter = integer(1),
>        del = double(1), ierr = integer(1), PACKAGE = "glasso")
>    ww = matrix(junk$ww, ncol = n)
>    xx = matrix(junk$xx, ncol = n)
>    if (junk$ierr != 0) {
>        stop("memory allocation error")
>    }
>    critfun = function(Sigmahati, s, rho, penalize.diagonal = TRUE) {
>        d = det(Sigmahati)
>        temp = Sigmahati
>        if (!penalize.diagonal) {
>            diag(temp) = 0
>        }
>        val = -log(d) + sum(diag(s %*% Sigmahati)) + sum(abs(rho *
>            temp))
>        return(val)
>    }
>    crit = critfun(xx, s, rho, penalize.diagonal)
>    return(list(w = ww, wi = xx, loglik = -(n/2) * crit, errflag = junk$ierr,
>        approx = approx, del = junk$del, niter = junk$niter))
> }
>
>
>
> If anyone can give any suggestions, I'd greatly appreciate it. Thanks!
>
>
>
>
> Vivian
>
> ______________________________________________
> R-help@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



-- 
Joshua Wiley
Ph.D. Student, Health Psychology
Programmer Analyst II, ATS Statistical Consulting Group
University of California, Los Angeles
https://joshuawiley.com/

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to