-
Notifications
You must be signed in to change notification settings - Fork 28
/
covariance.R
46 lines (41 loc) · 1.02 KB
/
covariance.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#' Compute covariance matrix and vectorize.
#'
#' \code{covariance} computes the covariance matrix and vectorize it.
#'
#' @param population tbl with grouping (metadata) and observation variables.
#' @param variables character vector specifying observation variables.
#'
#' @return data frame of 1 row comprising vectorized covariance matrix.
#'
#' @examples
#'
#' population <- tibble::tibble(
#' x = rnorm(30),
#' y = rnorm(30),
#' z = rnorm(30)
#' )
#'
#' variables <- c("x", "y")
#'
#' covariance(population, variables)
#' @importFrom magrittr %>%
#' @importFrom magrittr %<>%
#' @export
covariance <- function(population, variables) {
covariance <-
population %>%
dplyr::select(all_of(variables)) %>%
stats::cov()
variable_pairs <-
outer(
variables,
variables,
function(var1, var2) paste(var1, "__", var2, sep = "")
)
mask <- lower.tri(covariance, diag = T)
covariance <- covariance[mask]
names(covariance) <- variable_pairs[mask]
covariance %>%
t() %>%
as.data.frame()
}