Веса вероятности для матрицы расстояний в R - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь вычислить матрицу расстояний для всех номинальных переменных, используя вероятности c весов, как это было предложено Андербергом (1973: 124-5). Anderberg (1973: 124) утверждает, что «желание придать редким классам дополнительный вес часто встречается в биологической литературе, хотя систематические методы определения таких весов не предлагаются. [...] Поскольку редкие события имеют низкую вероятность, вероятность события не является подходящим весом; однако любая обратная функция вероятности потенциально интересна. '

Я попытаюсь проиллюстрировать ситуацию с помощью простого и небольшого набора данных в R.

var_1 <- c('A', 'A', 'B', 'A')
var_2 <- c('C', 'C', 'D', 'E')
var_3 <- c('G', 'G', 'G', 'F')
print(test.df <- data.frame(var_1, var_2, var_3))

Это приводит к следующему кадру данных

  var_1 var_2 var_3
1     A     C     G
2     A     C     G
3     B     D     G
4     A     E     F

Мы можем вычислить матрицу расстояний, используя коэффициент Гауэра, следующим образом.

library(cluster)
test.dist <- daisy(test.df, metric="gower")
round(test.dist,2)

Это дает следующую матрицу.

     1    2    3
2 0.00          
3 0.67 0.67     
4 0.67 0.67 1.00

Мы можем видеть, например, что наблюдения 1 и 2 идентичны по трем переменным, в результате чего расстояние равно 0. Наблюдения 1 и 3 не являются; они различаются по двум из трех переменных (var_1 и var_2), в результате чего расстояние 2/3 = 0,67.

Теперь моя проблема заключается в следующем. В кадре данных мы видим, что значение G в var_3 составляет 75% данных. Я хотел бы использовать эту информацию, чтобы скорректировать вклад в подобие по этой переменной. Другими словами, поскольку вероятность G в var_3 в три раза выше, чем вероятность F, два наблюдения (строки), содержащие F в этой переменной, следует считать более похожими, чем два наблюдения, содержащие значение G.

Просто для обеспечения некоторого контекста: некоторые переменные в моем реальном наборе данных имеют сильно искаженные распределения: одно значение составляет 80% всех наблюдений по этой переменной, а оставшиеся 20% распределены по три других значения.

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

1 Ответ

0 голосов
/ 15 января 2020

Причина, по которой предложение Андерберга не было реализовано, является, вероятно, показателем того, насколько трудно было бы это сделать. Первая проблема - решить, как установить вес. Вы основываете их на относительной частоте категорий, но она будет меняться от выборки к выборке, поэтому вы будете устанавливать разные веса для разных выборок. Во-вторых, мера Gower уже манипулирует несколькими типами данных, поэтому вы бы усложнили ее еще больше, но Gower - единственная мера расстояния, которая пытается объединить разные типы данных. Реализация имеет функцию в пакете cluster, которая может быть достаточно близка к тому, что вы хотите. Другие реализации Gower могут иметь больше возможностей (поиск по расстоянию gower r, чтобы получить другие пакеты, реализующие расстояние gower). В daisy есть два способа обработки двоичных данных: симметрия c и асимметрия c. Разница заключается в том, что 0-0 считаются в симметрии c (он же простой коэффициент соответствия), но не в асимметрии c (он же Жаккард). Использование asymmetri c приближается к тому, что вы хотите, но вы должны преобразовать факторные переменные в двоичные. Функция daisy фактически делает это для категориальных переменных, но она не позволяет указать асимметрию c для переменных, которые еще не являются двоичными.

A <- ifelse(test.df$var_1 == "A", 1, 0)
B <- ifelse(test.df$var_1 == "B", 1, 0)
C <- ifelse(test.df$var_2 == "C", 1, 0)
D <- ifelse(test.df$var_2 == "D", 1, 0)
E <- ifelse(test.df$var_2 == "E", 1, 0)
E <- ifelse(test.df$var_2 == "E", 1, 0)
F <- ifelse(test.df$var_3 == "F", 1, 0)
G <- ifelse(test.df$var_3 == "G", 1, 0)
dta <- cbind(A, B, C, D, E, F, G)

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

daisy(dta, metric="gower")    # symmetric
daisy(dta, metric="gower", type=list(asymm=1:7))

Конечно, вы всегда можете написать свою собственную версию расстояние Gower, включающее систему взвешивания. В R есть несколько обобщенных c функций расстояния, которые позволяют вам написать свою собственную функцию для вычисления расстояния между двумя строками и использовать ее для вычисления матрицы полного расстояния.

...