Skip to contents

Given a graph and a (partial) variogram matrix Gamma, returns a full variogram matrix that agrees with Gamma in entries corresponding to edges of graph and whose corresponding precision matrix, obtained by Gamma2Theta(), has zeros in entries corresponding to non-edges of graph. For results on the existence and uniqueness of this completion, see Hentschel et al. (2022) .

Usage

complete_Gamma(Gamma, graph = NULL, ...)

Arguments

Gamma

Numeric \(d \times d\) variogram matrix.

graph

NULL or igraph::graph object. If NULL, the graph is implied by non-edge entries in Gamma being NA. Must be connected, undirected.

...

Further arguments passed to complete_Gamma_general_split() if graph is not decomposable

Value

Completed \(d \times d\) variogram matrix.

Details

If graph is decomposable, Gamma only needs to be specified on the edges of the graph, other entries are ignored. If graph is not decomposable, the graphical completion algorithm requires a fully specified (but non-graphical) variogram matrix Gamma to begin with.

If not initial completion is provided, the function edmcr::npf() can be used to compute one. The package edmcr might need to be installed manually from GitHub!

References

Hentschel M, Engelke S, Segers J (2022). “Statistical Inference for Hüsler-Reiss Graphical Models Through Matrix Completions.” doi:10.48550/ARXIV.2210.14292 , https://arxiv.org/abs/2210.14292.

Examples

## Block graph:
Gamma <- rbind(
  c(0, .5, NA, NA),
  c(.5, 0, 1, 1.5),
  c(NA, 1, 0, .8),
  c(NA, 1.5, .8, 0)
)

complete_Gamma(Gamma)
#>      [,1] [,2] [,3] [,4]
#> [1,]  0.0  0.5  1.5  2.0
#> [2,]  0.5  0.0  1.0  1.5
#> [3,]  1.5  1.0  0.0  0.8
#> [4,]  2.0  1.5  0.8  0.0

## Alternative representation of the same completion problem:
my_graph <- igraph::graph_from_adjacency_matrix(rbind(
  c(0, 1, 0, 0),
  c(1, 0, 1, 1),
  c(0, 1, 0, 1),
  c(0, 1, 1, 0)
), mode = "undirected")
Gamma_vec <- c(.5, 1, 1.5, .8)
complete_Gamma(Gamma_vec, my_graph)
#>      [,1] [,2] [,3] [,4]
#> [1,]  0.0  0.5  1.5  2.0
#> [2,]  0.5  0.0  1.0  1.5
#> [3,]  1.5  1.0  0.0  0.8
#> [4,]  2.0  1.5  0.8  0.0

## Decomposable graph:
G <- rbind(
c(0, 5, 7, 6, NA),
c(5, 0, 14, 15, NA),
c(7, 14, 0, 5, 5),
c(6, 15, 5, 0, 6),
c(NA, NA, 5, 6, 0)
)

complete_Gamma(G)
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]  0.0  5.0    7    6  9.6
#> [2,]  5.0  0.0   14   15 17.4
#> [3,]  7.0 14.0    0    5  5.0
#> [4,]  6.0 15.0    5    0  6.0
#> [5,]  9.6 17.4    5    6  0.0

## Non-decomposable graph:
G <- rbind(
c(0, 5, 7, 6, 6),
c(5, 0, 14, 15, 13),
c(7, 14, 0, 5, 5),
c(6, 15, 5, 0, 6),
c(6, 13, 5, 6, 0)
)
g <- igraph::make_ring(5)

complete_Gamma(G, g)
#>          [,1]      [,2]      [,3]     [,4]     [,5]
#> [1,]  0.00000  5.000000 12.723425 10.37104 6.000000
#> [2,]  5.00000  0.000000 14.000000 12.72342 9.676194
#> [3,] 12.72342 14.000000  0.000000  5.00000 9.676194
#> [4,] 10.37104 12.723425  5.000000  0.00000 6.000000
#> [5,]  6.00000  9.676194  9.676194  6.00000 0.000000