I am trying to run the following function (a hierarchical bayes linear
model) and receive the error in solve.default.  The function was
originally written for an older version of SPlus.  Can anyone give me some
insights into where the problem is?

Thanks

R 2.4.1 on MAC OSX 2mb ram

Mark Grant
[EMAIL PROTECTED]

> attach(Aspirin.frame)
> hblm(Diff ~ 1, s = SE)
Error in solve.default(R, rinv) : 'a' is 0-diml

> traceback()
6: .Call("La_dgesv", a, b, tol, PACKAGE = "base")
5: solve.default(R, rinv)
4: solve(R, rinv)
3: summary.blm(fit)
2: eb.calc(rho[i], X, Y, s.e., df.se, corrs, prior, ...)
1: hblm(Diff ~ 1, s = SE)
>

> hblm
function(formula, s.e., df.se = Inf, corrs = F, prior = NULL, fast.calc = F,
        ...)
{
# hblm()
# main program to create hblm object
        call <- match.call()
        call.ab <- abbrev.hblm.call(call)
        taumin <- (sum(1/s.e.^2))^-0.5
        if(is.null(prior$error)) {
                prior$error$df <- 1
                prior$error$sd <- taumin
        }
        s.e..old <- s.e.
        if(max(s.e.) == Inf)
                s.e.[s.e. == Inf] <- taumin * 10000
        wts <<- s.e.^(-2)                  # changed 1.10.2007 DMR df.se
<- 1/mean(1/df.se)
        if(df.se == Inf) {
                if(is.null(prior$tau))
                        prior$tau <- taumin * sqrt(length(wts))
        }
        fit <- lm(formula, weights = wts, qr = T, x = T, y = T, singular =
T,
                ...)
        X <- fit$x
        Y <- fit$y
        Terms <- fit$terms
        rss <- sum(wts * fit$residuals^2)
        levs <- hat(fit$qr)
        tau.rss <- (max(0, rss - fit$df.residual)/sum((1 - levs) *
wts))^0.5
        log.r <- if(tau.rss > 0) log(tau.rss) else log(taumin)
        maxval <- max1d(l.p.d.log.r, start = log.r, step =
taumin/exp(log.r), x
                 = X, y = Y, s.e. = s.e., df.se = df.se, prior = prior,
...)
        log.r <- maxval$x
        se.lr <- (2 * maxval$h)^(-0.5)
        g.h.v <- gauss.hermite.vals(log.r, se.lr, fast.calc)
        rho <- exp(g.h.v$x)
        r <- length(rho)
        k <- nrow(X)
        p <- ncol(X)
        tau <- sig <- lpd <- array(0, dim = r)
        coefs <- array(0, dim = c(r, p, 3), dimnames = list(NULL,
dimnames(X)[[
                2]], c("Mean", "S.D.", "Prob > 0")))
        cov.c <- array(0, dim = c(r, p, p), dimnames =
append(dimnames(X)[c(2,
                2)], list(NULL), 0))
        means <- array(0, dim = c(r, k, 3), dimnames = list(NULL,
names(Y), c(
                "Post.Mn", "Post.SD", "Prob > 0")))
        if(corrs)
                cov.m <- array(0, dim = c(r, k, k), dimnames = list(NULL,
names(
                        Y), names(Y)))
        for(i in 1:r) {
                fit <- eb.calc(rho[i], X, Y, s.e., df.se, corrs, prior,
...)
                tau[i] <- fit$tau
                sig[i] <- fit$sigma
                lpd[i] <- fit$lpd
                coefs[i,  ,  ] <- fit$coefs
                cov.c[i,  ,  ] <- fit$cov.c
                means[i,  ,  ] <- fit$means
                if(corrs)
                        cov.m[i,  ,  ] <- fit$cov.means
        }
        prob <- (exp(lpd) * g.h.v$w)/sum(exp(lpd) * g.h.v$w)
        if(fit$df.post == Inf) {
                K1 <- K2 <- 1
        }
        else {
                K1 <- sqrt(fit$df.post/2) * exp(lgamma((fit$df.post -
1)/2) -
                        lgamma(fit$df.post/2))
                K2 <- fit$df.post/(fit$df.post - 2)
        }
        tausq.m <- K2 * prob %*% tau^2
        tau.m <- K1 * prob %*% tau
        tau.sd <- sqrt(tausq.m - tau.m^2)
        sigsq.m <- K2 * prob %*% sig^2
        sig.m <- K1 * prob %*% sig
        sig.sd <- sqrt(sigsq.m - sig.m^2)
        coefs.m <- prob %ip% coefs
        cov.c.m <- K2 * (prob %ip% cov.c)
        coef.d <- coefs[,  , 1] - matrix(coefs.m[, 1], nrow = r, ncol = p,

                byrow = T)
        coef.v <- array(0, dim = dim(cov.c.m), dimnames =
dimnames(cov.c.m))
        for(i in 1:r)
                coef.v <- coef.v + prob[i] * outer(coef.d[i,  ], coef.d[i,
 ])
        coefs.m[, 2] <- sqrt(diag(cov.c.m) + diag(coef.v))
        shrink <- matrix(0, nrow = k, ncol = 6, dimnames = list(names(Y),
c("Y",
                "Prior Mn", "(Y-Prior)/SE", "Post.Mn", "Post.SD", "Prob >
0")))
        fitted <- X %*% coefs.m[, 1]
        residuals <- (Y - fitted)/s.e.
        shrink[, 1:3] <- matrix(c(Y, fitted, residuals), ncol = 3)
shrink[, 4:6] <- prob %ip% means
        means.d <- means[,  , 1] - matrix(shrink[, 4], nrow = r, ncol = k,

                byrow = T)
        means.v <- prob %*% means.d^2
        shrink[, 5] <- sqrt(K2 * (prob %*% means[,  , 2]^2) + means.v)
corr.m.m <- if(!corrs) NULL else {
                covm <- matrix(0, nrow = k, ncol = k, dimnames =
list(names(Y),
                        names(Y)))
                for(i in 1:r) {
                        covd <- means.d[i,  ] %o% means.d[i,  ]
                        covm <- covm + prob[i] * (covd + K2 * cov.m[i,  ,
])
                }
                covm/(shrink[, 5] %o% shrink[, 5])
        }
        trace <- list(rho = rho, tau = tau, sigma = sig, lpd = lpd, prob =
prob,
                coef.s.p = coefs, mean.s = means)
        class(trace) <- "trace"
        class(shrink) <- "shrinkage"
        df <- list(residuals = fit$df.resid, sigma = fit$df.post, prior =
fit$
                df.prior, se = df.se)
        fit <- list(trace = trace, tau = tau.m, tau.sd = tau.sd, sigma =
sig.m,
                sigma.sd = sig.sd, coef.s.p = coefs.m, covar.coef =
cov.c.m +
                coef.v, shrinkage = shrink, post.corr = corr.m.m, tau.rss
=
                tau.rss, rho.maxpd = exp(log.r), se.lr = se.lr, call =
call,
                call.abbrev = call.ab, prior = prior, terms = Terms, rss =
rss,
                df = df, residuals = residuals, fitted = fitted, s.e. = 
s.e..old)
        class(fit) <- "hblm"
        fit
}
>

______________________________________________
[email protected] 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