Как кластеризовать фрейм данных с двумя переменными и частотой появления - PullRequest
0 голосов
/ 24 мая 2018

Скажем, у меня есть фрейм данных с образцом:

structure(list(V1 = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 
    6L, 6L, 6L, 7L, 7L, 7L, 9L, 9L, 9L, 13L, 13L, 13L, 15L, 15L, 
    18L, 22L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 
    26L, 27L, 27L, 28L, 32L, 32L, 32L, 32L, 32L, 36L, 36L, 36L, 36L, 
    36L, 36L, 36L, 37L, 37L, 37L, 37L, 37L, 37L, 38L, 38L, 38L, 38L, 
    38L, 39L, 39L, 39L, 39L, 40L, 40L, 40L, 41L, 41L, 42L, 45L, 45L, 
    45L, 45L, 47L, 47L, 47L, 48L, 50L, 50L, 51L, 53L, 53L, 54L), 
        V2 = c(2L, 7L, 20L, 3L, 5L, 6L, 7L, 13L, 15L, 18L, 19L, 20L, 
        4L, 5L, 6L, 7L, 9L, 12L, 6L, 9L, 12L, 13L, 15L, 18L, 7L, 
        9L, 13L, 15L, 18L, 9L, 20L, 44L, 12L, 27L, 44L, 15L, 18L, 
        58L, 16L, 18L, 19L, 23L, 27L, 28L, 29L, 32L, 45L, 47L, 50L, 
        51L, 52L, 53L, 54L, 55L, 28L, 29L, 29L, 45L, 47L, 53L, 54L, 
        55L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 38L, 39L, 40L, 41L, 
        42L, 43L, 39L, 40L, 41L, 42L, 43L, 40L, 41L, 42L, 43L, 41L, 
        42L, 43L, 42L, 43L, 43L, 47L, 53L, 54L, 55L, 53L, 54L, 55L, 
        49L, 51L, 52L, 52L, 54L, 55L, 55L), N = c(1L, 1L, 1L, 1L, 
        1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 
        1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 
        1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
        1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
        1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
        1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
        1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 
    -104L), class = c("data.table", "data.frame"))

Как мне структурировать это, чтобы иметь возможность кластеризовать их, используя cor (), dist () и hclust ()?

Для вашей информации V1 и V2 - номера материалов.N = частота того, как часто они появляются вместе в одном и том же порядке.Я также могу изменить N на число от 0 до 1, чтобы представить корреляцию, если это облегчает задачу.

Насколько мне известно, я должен сначала изменить его на матрицу, которая выглядит следующим образом, гдеV1 может быть строкой, а V2 - столбцом, а N - значениями.Но я не знаю

  1 2 3 4 ...
1 0 1 1 4
2 1 0 2 2
3 1 4 0 1
4 1 0 3 0
...

1 Ответ

0 голосов
/ 24 мая 2018

"Насколько мне известно, я должен сначала изменить ее на матрицу, которая выглядит следующим образом, где V1 может быть строками, а V2 - столбцом, а N - значениями."

Вам нужна матрица расстояний для кластеризации анализов, и ваше определение не является матрицей расстояний.

Я думаю, что вы хотите, чтобы материалы, которые появляются вместе, были ближе, а те, которые не появляются вместе, дальше, поэтому япредложите, чтобы расстояние между материалами составляло 1 / N, когда они появляются вместе, и 2, когда они не появляются.Тогда у вас будет что-то вроде этого:

> ## df is your data.frame
> dd <- dcast(rbind(df, df[, .(V1 = V2, V2 = V1, N)]), V1~V2, value.var = "N")[, -1]
> dd <- 1/dd
> dd[is.na(dd)] <- 2
> diag(dd) <- 0
> dd <- as.dist(dd)
> dd
     1   2   3   4   5   6   7   9  ...
2  1.0                                                                                                                                    
3  2.0 1.0                                                                                                                                
4  2.0 2.0 0.5                                                                                                                            
5  2.0 1.0 1.0 2.0                                                                                                                        
6  2.0 1.0 1.0 2.0 0.5                                                                                                                    
7  1.0 0.5 1.0 2.0 2.0 1.0                                                                                                                
9  2.0 2.0 0.5 2.0 1.0 1.0 0.5                                                                                                            
...
> hc <- hclust(dd)
> plot(hc)

enter image description here

Пример с матрицей подобия

> ss <- dcast(rbind(df, df[, .(V1 = V2, V2 = V1, N)]), V1~V2, value.var = "N")[, -1]
> ss <- ss/max(ss, na.rm = TRUE)
> ss[is.na(ss)] <- 0
> diag(ss) <- 1
> ss
      1   2   3 4   5   6   7   9  ...
 1: 1.0 0.5 0.0 0 0.0 0.0 0.5 0.0 
 2: 0.5 1.0 0.5 0 0.5 0.5 1.0 0.0 
 3: 0.0 0.5 1.0 1 0.5 0.5 0.5 1.0 
 4: 0.0 0.0 1.0 1 0.0 0.0 0.0 0.0 
 5: 0.0 0.5 0.5 0 1.0 1.0 0.0 0.5 
 6: 0.0 0.5 0.5 0 1.0 1.0 0.5 0.5 
 7: 0.5 1.0 0.5 0 0.0 0.5 1.0 1.0 
 8: 0.0 0.0 1.0 0 0.5 0.5 1.0 1.0 
 9: 0.0 0.0 0.5 0 0.5 0.0 0.0 0.5 
10: 0.0 0.5 0.0 0 0.5 0.5 0.0 0.0  
...
> dd <- as.dist(1 - ss)
> dd
     1   2   3   4   5   6   7   9  ...
2  0.5                              
3  1.0 0.5                          
4  1.0 1.0 0.0                     
5  1.0 0.5 0.5 1.0                                                                                                                        
6  1.0 0.5 0.5 1.0 0.0           
7  0.5 0.0 0.5 1.0 1.0 0.5         
9  1.0 1.0 0.0 1.0 0.5 0.5 0.0  
...
> hc2 <- hclust(dd)
> plot(hc2)

enter image description here

PAM примеры:

> # hclust - 5
> cl <- cutree(hc2, 5)
> summary(as.factor(cl))
  1   2   3   4   5 
562   1   1   2   1 
> 
> # pam - 5 with dd
> pam1 <- pam(dd, 5)
> summary(as.factor(pam1$clustering))
  1   2   3   4   5 
402 105  22  21  17 
> 
> # pam - 5 with sqrt(ss)
> dd2 <- as.dist(1 - sqrt(ss))
> pam2 <- pam(dd2, 5)
> summary(as.factor(pam2$clustering))
  1   2   3   4   5 
362  95  23  61  26 
...