From ff67426aae4e4268c9d4a73a387417c4c1b67834 Mon Sep 17 00:00:00 2001
From: Christian Roever <christian.roever@med.uni-goettingen.de>
Date: Tue, 3 Aug 2021 21:00:58 +0200
Subject: [PATCH] finalized moments implementation

---
 R/bmr.R    | 80 ++----------------------------------------------------
 man/bmr.Rd |  8 +++++-
 2 files changed, 10 insertions(+), 78 deletions(-)

diff --git a/R/bmr.R b/R/bmr.R
index 67d29fb..3d84496 100644
--- a/R/bmr.R
+++ b/R/bmr.R
@@ -722,12 +722,6 @@ bmr.default <- function(y, sigma, labels = names(y),
     stopifnot(!missing(theta), is.vector(theta), is.numeric(theta), all(is.finite(theta)),
               !missing(x), is.vector(x), is.numeric(x),
               length(x) == d, all(is.finite(x)))
-    #meanvec <- as.vector(support$mean %*% x)
-    #sdvec   <- rep(NA_real_, length(support$weight))
-    #for (i in 1:length(support$weight))
-    #  sdvec[i] <- as.vector(t(x) %*% support$covariance[i,,] %*% x)
-    #if (!mean) sdvec <- sdvec + support$tau^2
-    #sdvec <- sqrt(sdvec)
     predMom <- pred.moments(x=x, mean=mean)
     result <- rep(NA_real_, length(theta))
     logwts <- log(support$weight)
@@ -742,12 +736,6 @@ bmr.default <- function(y, sigma, labels = names(y),
     stopifnot(!missing(theta), is.vector(theta), is.numeric(theta), all(is.finite(theta)),
               !missing(x), is.vector(x), is.numeric(x),
               length(x) == d, all(is.finite(x)))
-    #meanvec <- as.vector(support$mean %*% x)
-    #sdvec   <- rep(NA_real_, length(support$weight))
-    #for (i in 1:length(support$weight))
-    #  sdvec[i] <- as.vector(t(x) %*% support$covariance[i,,] %*% x)
-    #if (!mean) sdvec <- sdvec + support$tau^2
-    #sdvec <- sqrt(sdvec)
     predMom <- pred.moments(x=x, mean=mean)
     result <- rep(NA_real_, length(theta))
     logwts <- log(support$weight)
@@ -758,10 +746,6 @@ bmr.default <- function(y, sigma, labels = names(y),
 
   qpredict <- function(p, x, mean=TRUE)
   {
-    #stopifnot(!missing(p), is.vector(p), is.numeric(p),
-    #          all(is.finite(p)), all(p >= 0), all(p <= 1), 
-    #          !missing(x), is.vector(x), is.numeric(x),
-    #          length(x) == d, all(is.finite(x)))
     stopifnot(!missing(p), is.vector(p), is.numeric(p),
               all(is.finite(p)), all(p >= 0), all(p <= 1), 
               !missing(x), is.numeric(x), all(is.finite(x)),
@@ -800,12 +784,6 @@ bmr.default <- function(y, sigma, labels = names(y),
               is.finite(n), n>=1, n==round(n), 
               !missing(x), is.vector(x), is.numeric(x),
               length(x) == d, all(is.finite(x)))
-    #meanvec <- as.vector(support$mean %*% x)
-    #sdvec   <- rep(NA_real_, length(support$weight))
-    #for (i in 1:length(support$weight))
-    #  sdvec[i] <- as.vector(t(x) %*% support$covariance[i,,] %*% x)
-    #if (!mean) sdvec <- sdvec + support$tau^2
-    #sdvec <- sqrt(sdvec)
     predMom <- pred.moments(x=x, mean=mean)
     result <- NULL
     # determine numbers of samples from each mixture component:
@@ -824,10 +802,6 @@ bmr.default <- function(y, sigma, labels = names(y),
   pred.interval <- function(level=0.95, x, mean=TRUE,
                             method=interval.type)
   {
-    #stopifnot(!missing(level), is.vector(level), is.numeric(level), length(level)==1,
-    #          all(is.finite(level)), all(level > 0), all(level < 1), 
-    #          !missing(x), is.vector(x), is.numeric(x),
-    #          length(x) == d, all(is.finite(x)))
     stopifnot(is.vector(level), is.numeric(level), length(level)==1,
               all(is.finite(level)), all(level > 0), all(level < 1), 
               !missing(x), is.numeric(x), all(is.finite(x)),
@@ -875,21 +849,6 @@ bmr.default <- function(y, sigma, labels = names(y),
       stopifnot(is.element(which, labels))
       idx <- which(which == labels)
     }
-    ## compute predictive moments:
-    #meanvec <- as.vector(support$mean %*% X[idx,])
-    #sdvec   <- rep(NA_real_, length(support$weight))
-    #for (i in 1:length(support$weight))
-    #  sdvec[i] <- as.vector(t(X[idx,]) %*% support$covariance[i,,] %*% X[idx,])
-    #sdvec <- sqrt(sdvec)
-    ## derive shrinkage moments:
-    ## "inverse variance" weights:
-    #ivw1 <- sigma[idx]^-2 / (sigma[idx]^-2 + support$tau^-2)
-    #ivw2 <- support$tau^-2 / (sigma[idx]^-2 + support$tau^-2)
-    #ivw2[support$tau==0] <- 1.0
-    ## shrinkage mean:
-    #meanvec <- ivw1*y[idx] + ivw2*meanvec
-    ## shrinkage stdev.:
-    #sdvec   <- sqrt((1 / (sigma[idx]^-2 + support$tau^-2)) + (ivw2*sdvec)^2)
     shrinkMom <- shrink.moments(which=which)
     result <- rep(NA_real_, length(theta))
     logwts <- log(support$weight)
@@ -911,21 +870,6 @@ bmr.default <- function(y, sigma, labels = names(y),
       stopifnot(is.element(which, labels))
       idx <- which(which == labels)
     }
-    ## compute predictive moments:
-    #meanvec <- as.vector(support$mean %*% X[idx,])
-    #sdvec   <- rep(NA_real_, length(support$weight))
-    #for (i in 1:length(support$weight))
-    #  sdvec[i] <- as.vector(t(X[idx,]) %*% support$covariance[i,,] %*% X[idx,])
-    #sdvec <- sqrt(sdvec)
-    ## derive shrinkage moments:
-    ## "inverse variance" weights:
-    #ivw1 <- sigma[idx]^-2 / (sigma[idx]^-2 + support$tau^-2)
-    #ivw2 <- support$tau^-2 / (sigma[idx]^-2 + support$tau^-2)
-    #ivw2[support$tau==0] <- 1.0
-    ## shrinkage mean:
-    #meanvec <- ivw1*y[idx] + ivw2*meanvec
-    ## shrinkage stdev.:
-    #sdvec   <- sqrt((1 / (sigma[idx]^-2 + support$tau^-2)) + (ivw2*sdvec)^2)
     shrinkMom <- shrink.moments(which=which)
     result <- rep(NA_real_, length(theta))
     logwts <- log(support$weight)
@@ -976,21 +920,6 @@ bmr.default <- function(y, sigma, labels = names(y),
       stopifnot(is.element(which, labels))
       idx <- which(which == labels)
     }
-    ## compute predictive moments:
-    #meanvec <- as.vector(support$mean %*% X[idx,])
-    #sdvec   <- rep(NA_real_, length(support$weight))
-    #for (i in 1:length(support$weight))
-    #  sdvec[i] <- as.vector(t(X[idx,]) %*% support$covariance[i,,] %*% X[idx,])
-    #sdvec <- sqrt(sdvec)
-    ## derive shrinkage moments:
-    ## "inverse variance" weights:
-    #ivw1 <- sigma[idx]^-2 / (sigma[idx]^-2 + support$tau^-2)
-    #ivw2 <- support$tau^-2 / (sigma[idx]^-2 + support$tau^-2)
-    #ivw2[support$tau==0] <- 1.0
-    ## shrinkage mean:
-    #meanvec <- ivw1*y[idx] + ivw2*meanvec
-    ## shrinkage stdev.:
-    #sdvec   <- sqrt((1 / (sigma[idx]^-2 + support$tau^-2)) + (ivw2*sdvec)^2)
     shrinkMom <- shrink.moments(which=which)
     result <- NULL
     # determine numbers of samples from each mixture component:
@@ -1105,11 +1034,6 @@ bmr.default <- function(y, sigma, labels = names(y),
   # posterior moments (mean and covariance) of regression parameters (beta)
   # conditional on a given heterogeneity (tau) value.
   {
-    ##sigmaTau    <- diag(sigma^2 + tau^2, nrow=k, ncol=k)
-    #sigmaTauInv <- diag(1 / (sigma^2 + tau^2), nrow=k, ncol=k)
-    #VbetaInv    <- t(X) %*% sigmaTauInv %*% X
-    #Vbeta       <- solve(VbetaInv)
-    #betaHat     <- as.vector(Vbeta %*% t(X) %*% sigmaTauInv %*% y)
     stopifnot(length(tau)==1, is.finite(tau), tau>=0)
     if (!is.null(Sigmap)) { # set up block diagonal matrix:
       sigmaTauInv <- cbind(rbind(diag(1 / (sigma^2 + tau^2), nrow=k, ncol=k),
@@ -1551,7 +1475,9 @@ bmr.default <- function(y, sigma, labels = names(y),
                  "qshrink"             = qshrink,
                  "rshrink"             = rshrink,
                  "shrink.interval"     = shrink.interval,
-                 "cond.moment"         = conditionalmoments,
+                 "post.moments"        = conditionalmoments,
+                 "pred.moments"        = pred.moments,
+                 "shrink.moments"      = shrink.moments,
                  "summary"             = sumstats,
                  "interval.type"       = interval.type,
                  "ML"                  = ml.estimate,
diff --git a/man/bmr.Rd b/man/bmr.Rd
index 2aaf4af..342bd38 100644
--- a/man/bmr.Rd
+++ b/man/bmr.Rd
@@ -277,9 +277,15 @@
   (\eqn{i=1,\ldots,k}{i=1,...,k}). May be identified using the
   \sQuote{\code{which}} argument via its index (\eqn{i}) or a character
   string giving the corresponding study label.}
-  \item{cond.moment}{a \code{function(tau)}
+  \item{post.moments}{a \code{function(tau)}
     returning conditional posterior moments (mean and covariance) of
     \eqn{\beta} as a function of \eqn{\tau}.}
+  \item{pred.moments}{a \code{function(tau, x, mean=TRUE)}
+    returning conditional posterior predictive moments (means and
+    standard deviations) as a function of \eqn{\tau}.}
+  \item{shrink.moments}{a \code{function(tau, which)}
+    returning conditional moments (means and standard deviations of
+    shrinkage distributions) as a function of \eqn{\tau}.}
   \item{summary}{a \code{matrix} listing some summary statistics, namely
     marginal posterior mode, median, mean, standard deviation
     and a (shortest) 95\% credible intervals,
-- 
GitLab