#' spatially constrained bayesian regression function.
#'
#' Take a standard lm result and use bayesian regression to impose spatial
#' regularity.
#'
#'
#' @param mylm standard lm result of the form mylm<-lm(ymat~.)
#' @param ymat outcome matrix - usually from imaging data
#' @param mask mask with non-zero entries n-columns of ymat
#' @param smth smoothness parameter
#' @param priorWeight weight on the prior
#' @param nhood size of neighborhood
#' @param regweights weights on rows - size of ymat
#' @param smoothcoeffmat prior coefficient matrix
#' @return bayesian regression solution is output as a list of images
#' @author Avants BB
#' @examples
#'
#' # make some simple data
#' \dontrun{
#' if (!exists("fn") ) fn<-getANTsRData("pcasl")
#' asl<-antsImageRead(fn)
#' tr<-antsGetSpacing(asl)[4]
#' aslmean<-getAverageOfTimeSeries( asl )
#' aslmask<-getMask(aslmean,lowThresh=mean(aslmean),cleanup=TRUE)
#' pcaslpre <- aslPerfusion( asl, dorobust=0, useDenoiser=NULL, skip=1,
#' useBayesian=0, moreaccurate=0, verbose=T, mask=aslmask )
#' # user might compare to useDenoiser=FALSE
#' pcasl.parameters <- list( sequence="pcasl", m0=pcaslpre$m0 )
#' aslmat<-timeseries2matrix(asl,aslmask)
#' tc<-as.factor(rep(c("C","T"),nrow(aslmat)/2))
#' dv<-computeDVARS(aslmat)
#' perfmodel<-lm( aslmat ~ tc + stats::poly(dv,4) ) # standard model
#' ssp<-spatialbayesianlm( perfmodel, aslmat, aslmask,
#' priorWeight=1.e2 ,smth=1.6, nhood=rep(2,3) )
#' plot( ssp[[1]], slices="2x16x2", axis=3 )
#' }
#'
#' @export spatialbayesianlm
spatialbayesianlm <- function(mylm, ymat, mask, smth = 1, priorWeight = 1, nhood = NA,
regweights = NA, smoothcoeffmat = NA) {
if (sum(mask == 1) != ncol(ymat)) {
print("spatialbayesianlm: mask does not match ymat dimensions")
return(NA)
}
if (all(is.na(nhood)))
nhood <- rep(1, mask@dimension)
if (all(is.na(regweights))) {
regweights <- ymat
regweights[] <- 1
}
if (is.null(dim(regweights))) {
regweights <- ymat
regweights[] <- 1
}
if (!all(dim(regweights) == dim(ymat))) {
regweights <- ymat
regweights[] <- 1
}
if (all(is.na(smoothcoeffmat)))
smoothcoeffmat <- mylm$coefficients
nmatimgs <- list()
for (i in 1:nrow(smoothcoeffmat)) {
temp <- antsImageClone(mask)
temp[mask == 1] <- smoothcoeffmat[i, ]
temp<-smoothImage(temp, smth)
nmatimgs[[i]] <- getNeighborhoodInMask(temp, mask, nhood, boundary.condition = "mean")
smoothcoeffmat[i, ] <- temp[mask == 1]
}
covmat <- cov(t(smoothcoeffmat))
invcov <- solve(covmat + diag(ncol(covmat)) * 1e-06)
betaideal <- rep(0, ncol(ymat))
blmX <- model.matrix(mylm)
betamatrix <- ymat[1:(ncol(blmX) - 1), ] * 0
posteriorI <- rep(0, ncol(ymat))
for (v in 1:ncol(ymat)) {
parammat <- nmatimgs[[1]][, v]
for (k in 2:length(nmatimgs)) parammat <- cbind(parammat, nmatimgs[[k]][,
v])
pcov <- cov(parammat)
locinvcov <- tryCatch(solve(pcov), error = function(e) return(invcov))
if (typeof(locinvcov) == "character")
locinvcov <- invcov
prior <- (smoothcoeffmat[, v])
blm <- bayesianlm(blmX, ymat[, v], prior, locinvcov * priorWeight, regweights = regweights[,
v])
betamatrix[, v] <- blm$beta
posteriorI[v] <- blm$posteriorProbability
}
mylist <- matrixToImages(betamatrix, mask)
mylist <- lappend(mylist, makeImage(mask, posteriorI))
return(mylist)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.