рассчитать частоту или процентную матрицу в R - PullRequest
2 голосов
/ 04 марта 2020

, если у меня есть следующее:

mm <- matrix(0, 4, 3)
mm<-apply(mm, c(1, 2), function(x) sample(c(0, 1), 1))

> mm
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    0
[3,]    0    0    0
[4,]    1    0    1

Как вывести матрицу, которая выражает частоту или процентное соотношение различных столбцов, где оба значения = 1. Например - есть две строки из 4, где столбец 1 и столбец 2 равны 1 (= 0,5) и 1 строке из 4, где столбец 2 и столбец 3 = 1 (= 0,25), поэтому в этом случае мне потребуется:

     [,1]      [,2]      [,3]
[1,]    1      0.5       0.5
[2,]    0.5    1         0.25
[3,]    0.5    0.25      1

I Мне не интересно сравнивать одни и те же столбцы, поэтому по умолчанию диагональ остается равной 1.

Я подумал, что могу получить где-то с cor(mm), где вместо этого может быть способ вывести совместимые частоты или ко-проценты коэффициентов корреляции, но это, похоже, не так. Но размеры конечного вывода должны быть в виде матрицы столбцов N на N, так как cor () выводит:

> cor(mm)
          [,1]      [,2]      [,3]
[1,] 1.0000000 0.5773503 0.5773503
[2,] 0.5773503 1.0000000 0.0000000
[3,] 0.5773503 0.0000000 1.0000000

, но, очевидно, это коэффициенты корреляции, я просто хочу использовать вместо них частоты или доли.

Ответы [ 2 ]

5 голосов
/ 04 марта 2020

В базовом решении R используется crossprod, т. Е.

r <- `diag<-`(crossprod(mm)/nrow(mm),1)

, так что

> r
     [,1] [,2] [,3]
[1,]  1.0 0.50 0.50
[2,]  0.5 1.00 0.25
[3,]  0.5 0.25 1.00

DATA

mm <- structure(c(1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1), .Dim = 4:3)
0 голосов
/ 04 марта 2020
set.seed(123)

mm <- matrix(0, 4, 3)
mm<-apply(mm, c(1, 2), function(x) sample(c(0, 1), 1))

combinations <- expand.grid(1:ncol(mm), 1:ncol(mm))

matrix(unlist(Map(function(x, y) {
  if (x == y) {
    res <- 1
  } else {
    res <- sum(mm[, x] * mm[, y]) / nrow(mm)
  }
  res
}, combinations[, 1], combinations[, 2])), 3)

# [,1] [,2] [,3]
# [1,] 1.00 0.25  0.0
# [2,] 0.25 1.00  0.5
# [3,] 0.00 0.50  1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...