2016-12-27 5 views
0

У меня есть большая разреженная матрица. теперь я хочу сделать таблицу непредвиденных ситуаций для всех комбинаций пары столбцов. Например: Скажем, моя редкая матрица MatТаблица непредвиденных обстоятельств из разреженной матрицы

D1 D2 D3 D4 D5 .. Dn 
1 0 1 0 0 .. 0 
0 1 1 1 1 .. 1 
.. .. .. .. .. .. .. 
1 0 1 0 1 .. 1 

Теперь нужно сделать таблицы сопряженности для всех комбинации Di и Dj для примера таблицы сопряженности для (D1, D2), (D1, D3), (D1, D4) .. (D1, D), (D2, D3), (D2, D4) .. (D2, D) .. (Dn-1, D)

структура каждого Случайности Таблица

r1 r2 
r3 r4 



#where r1 is total number of 1's in Di column 
#   r2 is total number of 1's in Di AND Dj column 
#   r3 is total number of 1's in Di AND Dj column 
#   r4 is total number of 1's in Dj column 

Algo:

for each i in (1:n-1) { 
    for each j in (i+1 : n) { 
     Calculate r1,r2,r3,r4 
     create contingency table for Ri and Rj 
     apply fisher test on that 
    } 
} 

Я хочу немного быстрой реализации, как это занимает больше 2-3 дней

ответ

0

Вот одна идея, чтобы получить все 2 х 2 матриц,

fun1 <- function(x,y){ 
matrix(data = c(sum(m1[,x]), sum(m1[,c(x,y)]), sum(m1[,c(x,y)]), sum(m1[,y])), 
                   nrow = 2, ncol = 2) 
} 
#where m1 is your original matrix 

ind1 <- combn(1:ncol(m1),2)[1,] 
ind2 <- combn(1:ncol(m1),2)[2,] 
final.list <- Map(fun1, ind1, ind2) 

head(final.list, 2) 
#[[1]] 
#  [,1] [,2] 
#[1,] 3 6 
#[2,] 6 3 

#[[2]] 
#  [,1] [,2] 
#[1,] 3 6 
#[2,] 6 3 

ДАННЫХ

dput(m1) 
structure(c(0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1), .Dim = c(6L, 
6L), .Dimnames = list(NULL, c("D1", "D2", "D3", "D4", "D5", "D6" 
))) 

Или так же,

fun2 <- function(x,y){ 
    matrix(data = c(c.sums[x], sum(c.sums[c(x,y)]), sum(c.sums[c(x,y)]), c.sums[y]), 
                    nrow = 2, ncol = 2) 
} 

ind1 <- combn(1:ncol(m1),2)[1,] 
ind2 <- combn(1:ncol(m1),2)[2,] 
c.sums <- colSums(m1) 

final.list2 <- Map(fun2, ind1, ind2) 
+0

Спасибо. Но все же это занимает много времени. Размер матрицы составляет 8000 * 7000. Это означает общее количество таблиц непредвиденных ситуаций (7000,2). Первоначально создание таблицы происходит очень быстро, но через некоторое время она становится очень медленной, а затем, наконец, застревает. –

+0

7000 столбцов ??? и вы думаете, что это означает общее количество c (7000, 2) ...? Это составит около 24,5 миллионов столов! – Sotos

+0

Да. Вот почему это занимает время. –

Смежные вопросы