constrained {GGMncv} | R Documentation |
Precision Matrix with Known Graph
Description
Compute the maximum likelihood estimate of the precision matrix, given a known graphical structure (i.e., an adjacency matrix). This approach was originally described in "The Elements of Statistical Learning" (see pg. 631, Hastie et al. 2009).
Usage
constrained(Sigma, adj)
mle_known_graph(Sigma, adj)
Arguments
Sigma |
Covariance matrix |
adj |
Adjacency matrix that encodes the constraints, where a zero indicates that element should be zero. |
Value
A list containing the following:
Theta: Inverse of the covariance matrix (precision matrix)
Sigma: Covariance matrix.
wadj: Weighted adjacency matrix, corresponding to the partial correlation network.
Note
The algorithm is written in c++
, and should scale to high dimensions
nicely.
Note there are a variety of algorithms for this purpose. Simulation studies indicated that this approach is both accurate and computationally efficient (HFT therein, Emmert-Streib et al. 2019)
References
Emmert-Streib F, Tripathi S, Dehmer M (2019).
“Constrained covariance matrices with a biologically realistic structure: Comparison of methods for generating high-dimensional Gaussian graphical models.”
Frontiers in Applied Mathematics and Statistics, 5, 17.
Hastie T, Tibshirani R, Friedman J (2009).
The elements of statistical learning: data mining, inference, and prediction.
Springer Science \& Business Media.
Examples
# data
y <- ptsd
# fit model
fit <- ggmncv(cor(y), n = nrow(y),
penalty = "lasso",
progress = FALSE)
# set negatives to zero (sign restriction)
adj_new <- ifelse( fit$P <= 0, 0, 1)
check_zeros <- TRUE
# track trys
iter <- 0
# iterate until all positive
while(check_zeros){
iter <- iter + 1
fit_new <- constrained(cor(y), adj = adj_new)
check_zeros <- any(fit_new$wadj < 0)
adj_new <- ifelse( fit_new$wadj <= 0, 0, 1)
}
# alias
# data
y <- ptsd
# nonreg (lambda = 0)
fit <- ggmncv(cor(y), n = nrow(y),
lambda = 0,
progress = FALSE)
# set values less than |0.1| to zero
adj_new <- ifelse( abs(fit$P) <= 0.1, 0, 1)
# mle given the graph
mle_known_graph(cor(y), adj_new)