метод категориальной сортировки в R

С помощью R очень просто реализуется метод категориальной сортировки, буквально в одну строку. Например, пусть трое испытуемых классифицируют шесть стимулов на группы:
x <- read.table(text="
  e1 e2 e3
A 1 1 1
B 1 1 2
C 1 2 1
D 2 2 2
E 2 3 1
F 2 3 2
", header = TRUE)

m <- Reduce("+", lapply(x, function(e) ifelse(dist(e, "manhattan"), 1, 0)))
attr(m, 'Labels') <- row.names(x)
plot(hclust(m))


  1 2 3 4 5
2 1       
3 1 2     
4 3 2 2   
5 2 3 2 2 
6 3 2 3 1 1


 

Да, поскольку это мое собственное оригинальное решение, ссылка на автора обязательна

Comments

Anonymous said…
А можно попросить вас чуть подробнее? Пару слов/ссылка на метод КС, показать результат (основной), принцип вашего алгоритма в двух словах. Большое спасибо.
категориальная сортировка — популярный метод сбора данных о сходстве стимулов при проведении многомерного шкалирования или кластеризации (см. http://www.socialresearchmethods.net/research/epp1/epp1.htm или http://dx.doi.org/10.3200/SOCP.149.1.105-115). Суть метода такая: испытуемые распределяют стимулы по нескольким группам (количество групп может быть задано или не ограничиваться). Степень сходства двух стимулов определяется количеством групп, в которые они совместно попали. Алгоритм использует метрику городских кварталов на классификации одного испытуемого: если стимулы относятся к одной категории, то расстояние между ними равно 0. Используя этот факт, можно построить бинарную матрицу сходства, перекодировав матрицу расстояний. Затем индивидуальные матрицы сходства суммируются для получения групповой матрицы
Anonymous said…
Спасибо вам. Да, это знакомо.

Не совсем понятно, причем тут манхэттенское расстояние у вас в коде, ведь оно требует количественных переменных (или двоичных), но не номинальных.

В SPSS matrix:

data list list /
e1 e2 e3 e4 e5 (5f1).
begin data
1 1 1 3 2
1 1 2 1 2
1 2 1 2 1
2 2 2 1 2
2 3 1 1 2
2 3 2 3 1
end data.

matrix.
get data /vari= e1 to e5.
comp m= make(nrow(data),nrow(data),0).
comp ones= make(1,nrow(data),1).
loop i= 1 to ncol(data).
-comp mi= data(:,i)*ones.
-comp mi= mi ne t(mi).
-print i.
-print mi /space 0.
-comp m= m+mi.
end loop.
print m /title 'Суммарная матрица частотная несовстреч (дистанционная)'.
end matrix.

Или можно вести речь в терминах матриц совстреч (вместо comp mi= mi ne t(mi) поставить comp mi= mi=t(mi)), то тогда матрица сходств m (суммарная частотная матрица совстреч) будет дополнением вышеприведенной в коде матрицы m дистанционной до константы 5 (число столбцов e, т.е. респондентов).

И, ожидаю (не проверял), эта матрица совстреч m, делоенная на 5, должна бы дать коэффициент сходства Дайса (Dice), который получим на двоичных данных, которые суть dummies, в какие можно перекодировать наши 5 номинальных столбцов.
Кир, спасибо, красиво. Я использовал метрику городских кварталов, чтобы не самому заморачиваться вычислением расстояний — она для данных одного эксперта дает ноль при совпадении кода категории и ненулевое значение во всех остальных случаях. Ваше решение, как всегда, более экономное
Anonymous said…
Вот, для интереса, небольшое размышление о мерах близости, применимых к номинальным данным (через перекодировку в фиктивные переменные): https://stats.stackexchange.com/q/55798/3277

Popular posts from this blog

Вопросы множественного выбора в R

кириллица и R