Как организовать список ковариационных пар в квадрате ковариационной матрицы?

#r #covariance

#r #ковариация

Вопрос:

Я работаю в R, и у меня есть таблица, состоящая из трех столбцов:

  • V1 : имя первой переменной
  • V2 : имя второй переменной
  • cov : значение ковариации между V1 и V2 .

Эта таблица расширяется по n столбцам для n пар ковариаций.

Я хотел бы получить матрицу, которая выглядит как классическая ковариационная матрица, то есть квадратная матрица n x n с ковариационными парами в ней.

Есть идеи, как я мог бы это реализовать?

Ответ №1:

Вы могли бы построить разреженную матрицу:

 DF <- data.frame(var1 = c("a", "a", "b", "a", "b", "c"), 
                 var2 = c("b", "c", "c", "a", "b", "c"), 
                 cov = c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6))
DF$var1 <- factor(DF$var1, levels = sort(unique(c(DF$var1, DF$var2))))
DF$var2 <- factor(DF$var2, levels = levels(DF$var1))

library(Matrix)
sparseMatrix(i = as.integer(DF$var1), 
             j = as.integer(DF$var2), 
             x = DF$cov, 
             dimnames = list(levels(DF$var1), levels(DF$var2)),
             symmetric = TRUE)
#3 x 3 sparse Matrix of class "dsCMatrix"
#    a   b   c
#a 0.4 0.1 0.2
#b 0.1 0.5 0.3
#c 0.2 0.3 0.6 
  

Используйте as.matrix для создания плотной матрицы, если она вам нужна.

Ответ №2:

Что-то вроде

 ## find row/column names
n <- unique(c(dd$V1,dd$V2))
## construct matrix  
M <- matrix(NA, length(n),length(n), dimnames=list(n,n))
## fill in values
M[cbind(dd$V1,dd$V2)] <- dd$V3
  

Если у вас есть только нижний / верхний треугольник в вашем исходном наборе данных, вам понадобится что-то вроде M[lower.tri(M)] <- t(M)[upper.tri(M)] для симметризации…