2015-10-19 3 views
0

У меня есть файл данных, в котором есть N = 428 предметов, каждый из которых отвечает на те же 8 вопросов. Это выглядит следующим образом:MATLAB: Эффективный способ вычисления матрицы ковариации по этим данным

question subject score  
    1  1  42   
    2  1  12 
    3  1  13 
    4  1  43 
    5  1  22 
    6  1  43 
    7  1  54 
    8  1  66 
    1  2  41 
    2  2  11 
    ...  ...  ... 

Я хочу, чтобы вычислить и сохранить ковариационную матрицу, отражающую результаты каждого предмета.

Таким образом, ячейка (1,1) имеет отклонение объекта 1. то ячейки (1,2) и (2,1) будут иметь одинаковое значение, то есть ковариацию между субъектом 1 и субъектом 2. Хотя в приведенной выше таблице вы не можете видеть все данные субъекта 2, похоже, что они будет иметь некоторую положительную ковариацию с темой 1.

н выбрать к уникальных ковариации должны быть вычислены, которые я работаю, чтобы быть 91378 тотальным.

Как я могу эффективно достичь этого?

EDIT: Использование кода из @GameOfThrows я смог получить рабочую версию Собирается с помощью цикла:

crowd_cov = NaN(428,428); 

for i = 1:length(allpairs) 
    Z = cov(score(indexSub1(i,1):indexSub1(i,2)),score(indexSub2(i,1):indexSub2(i,2))); 
    first = allpairs(i,1); 
    second = allpairs(i,2); 
    crowd_cov(first,first) = Z(1,1); 
    crowd_cov(second,second) = Z(2,2); 
    crowd_cov(first,second) = Z(1,2); 
    crowd_cov(second,first) = Z(2,1); 
end 

Я доволен этим, хотя я по-прежнему приветствовать объяснение того, как я мог закодировали это более эффективно.

+0

Найдите и сохраните среднее значение для каждого столбца, а затем возьмите квадрат разницы между каждой записью и средним значением соответствующего столбца.Также имейте в виду, что в вашей ковариационной матрице ковариация (i, j) = ковариация (j, i) – macroland

+0

Вы предлагаете взять среднее значение всех 8 × 428 = 3424 баллов, что составляет 32,64. Затем я беру для строки один 42-32,64 и квадрат, и делаю то же самое для всех строк. Как я могу исходить из этой точки? – user1205197

+1

Я немного смущен, почему бы не использовать функцию ковариантности Matlab (cov (A, B)) для ковариации для каждого предмета? – GameOfThrows

ответ

1

, так что вы хотите совпадение, которое говорит мне, что у вас есть две случайные величины, скажем, оценка предмета 1 и оценка предмета 2, давайте надеяться, что столбец Вопросы не будут играть большую роль в этом, но если количество Вопросов одинаково для каждого предмета, то это значительно увеличит эффективность вашей программы (поскольку это позволяет быстро индексировать).

allpairs = combnk(1:max(subject),2) %// all possible combinations of subjects starting from subject 1 to subject N and the 2 means you want pairs. 

Теперь обратите внимание, что это не имеет повторений, поэтому к югу от 1 против суб 2 происходит только один раз, к югу от 2 против подпункта 1 не существует.

Теперь вы хотите сделать matlab cov каждой паре (вам нужно правильно проиндексировать счет). Это где, если у вас есть такое же количество вопросов, это сэкономит вам много времени, скажем, 8 вопросов по каждому предмету:

indexSub1 = [(allpairs(:,1)*8 -7),(allpairs(:,1)*8)] 
indexSub2 = [(allpairs(:,2)*8 -7),(allpairs(:,2)*8)] 

теперь у вас есть все правильные индексы, вы можете использовать коронавирус; как функции, применить его к каждые 8 ​​элементов

cov(score(indexSub1),score(indexSub2)). 

Если количество вопросов не то же самое, то вы, возможно, придется использовать поиск по индексу правильно, это может привести к замедлению вашу программу немного вниз.

В конце вы можете преобразовать свою матрицу в ячейку и использовать cellfun для применения cov, или вы можете использовать цикл для более простых представлений (я предлагаю цикл? Нет).

EDIT:

Чтобы уточнить, что я предлагаю, что у вас есть indexSub1 и indexSub2, вы можете конвертировать их в 91378 * 2 клетки, где каждая ячейка состоит из 8 баллов. Это позволит вам использовать cellfun Matlab (где функция применяется к каждой ячейке). Это значительно увеличит вашу скорость.

+0

Количество вопросов одинаково для каждого объекта - это 8. Когда я запускаю этот код, я получаю сообщение об ошибке «Undefined function» score для входных аргументов типа «double». » Является ли оценка чем-то еще? – user1205197

+0

Теперь я понимаю, что оценка должна быть вектором баллов. Когда я это делаю, код работает, хотя он производит только одну ковариационную матрицу 2x2. Сможете ли вы объяснить немного больше, что вы подразумеваете под «применить его к каждому 8 элементам»? – user1205197

+0

@ user1205901 Функция Matlab cov возвращает матрицу covar 2x2, если размер обеих случайных величин одинаковый, в вашем случае, если у всех из них 8 вопросов, тогда вы получите матрицу ковариации 2x2 для каждой пары. – GameOfThrows