Проверка соответствия двух разных переменных - PullRequest
0 голосов
/ 02 марта 2020

У меня есть набор данных, который мне нужен для проверки двух переменных «Call» и «cluster».

Мне нужно проверить, что все вызовы с одинаковым значением имеют одинаковый номер кластера.

Проблема в том, что метод кластеризации K-средних, который я использовал, назначает разные номера кластеров при каждом его запуске.

Поэтому мне нужна проверка, которая, например, смотрит на вызов аллеля 1 и проверяет, что числа все под кластерным вызовом. (числа могут быть указаны как 2 за один прогон и изменить на 3, если я перезапущу код)

См. структуру данных ниже

structure(list(RFU1 = c(-0.295502405, 0.964070798, 3381.332182, 
3532.769062, 3431.836843, 3242.966511, 2104.791167, 2220.008503, 
3548.252161, 3506.51418, 2290.273178, 2281.587684, -5.64819475, 
-11.73109864, 3784.914039, 3619.00781, 3618.211608, 3248.106466, 
3394.650325, 3339.870196, 2449.202902, 2426.835174, 3432.153478, 
2761.392304, -9.267907504, -7.365704356, 3743.092314, 3787.241702, 
2172.027787, 2096.845649, 2135.649551, 2149.145547, 2293.757257, 
2348.099108, 2321.019045, 2022.168867, -17.93532331, -12.59832941, 
3805.416768, 3498.998138, 2304.597239, 2509.63987, 2181.11547, 
2261.011876, 3432.453036, 3662.758933, 2371.11049, 3068.827061, 
2612.107589, 2687.824075, 3179.315918, 3688.525218, 3465.327523, 
3405.154043, 2535.514915, 2452.200079, 374.435299, 423.6015308, 
3742.515563, 3578.777925, 2634.955017, 2527.514043, 3817.579252, 
3550.999412, -10.72035816, 3294.486334, 3352.40368, 3463.150507, 
3472.576514, 3741.898759, 3571.369947, 3720.645869, 3739.569593, 
3855.583168, 418.6837047, 49.47548241, 2171.034284, 2155.314713, 
3432.363384, 3582.508917, 3425.415274, 3487.203299, 3505.23909, 
3413.342096, 113.5100691, 128.6414053, 2454.588175, 2323.061591, 
3188.705702, 3376.950546, 3291.072437, 3181.001961, 3195.013863, 
3776.919197, 2284.22659, 2277.338631), RFU2 = c(-8.346468029, 
235.4058561, 637.9218251, 650.3759507, 617.4161748, 604.0792911, 
4270.310727, 4199.615749, 689.863543, 712.6144338, 4274.287194, 
4541.168491, -1.626221758, -2.437395631, 802.0941252, 730.5998997, 
686.9037384, 625.8245403, 644.3586836, 642.8833044, 4937.691887, 
5159.479928, 725.4449756, 573.3910899, -4.006398006, 213.2859144, 
739.7910786, 731.0150586, 4408.81923, 4767.533969, 4302.641493, 
4325.913445, 4597.47663, 4666.904418, 4800.357526, 4142.535329, 
-17.23239968, 178.5311942, 778.305843, 743.1438168, 4214.507094, 
4553.703511, 4629.339014, 4459.697405, 661.7299014, 727.1054982, 
4553.170272, 5482.231486, 4520.517999, 4737.802036, 643.3599887, 
726.4314715, 696.5968338, 697.6099599, 411.8118071, 409.4943424, 
5687.32635, 5757.51512, 766.4240193, 779.2403225, 4745.055632, 
4582.267792, 749.5679421, 675.8747055, -7.254521898, 628.3467565, 
631.116767, 672.7064514, 687.2642132, 718.1192917, 731.785499, 
668.3686048, 784.8055727, 791.3155894, 4471.047168, 4501.597841, 
4504.670332, 4442.621066, 682.0632225, 706.6204595, 680.5242182, 
683.9558692, 684.2909706, 618.6535251, 5727.684954, 6098.485474, 
5099.952926, 4779.742057, 571.4303822, 614.9258218, 602.9830491, 
651.2847695, 591.8833499, 742.2387568, 4443.376841, 4716.792177
), cluster = c(2L, 2L, 4L, 4L, 4L, 4L, 1L, 1L, 4L, 4L, 1L, 1L, 
2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 4L, 4L, 2L, 2L, 4L, 4L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 4L, 4L, 1L, 1L, 1L, 1L, 
4L, 4L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 4L, 4L, 
1L, 1L, 4L, 4L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 
1L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 1L, 1L, 4L, 4L, 4L, 4L, 
4L, 4L, 1L, 1L)), row.names = c(NA, -96L), class = "data.frame")

Первый запуск кластеризации k-средних

Первый запуск

Второй запуск кластеризации k-средних

Второй запуск

1 Ответ

1 голос
/ 03 марта 2020

Поскольку речь идет о ярлыках, вы всегда можете переименовать свои группы после этого. Я использовал 4 кластера на основе критерия суммы квадратов:

suppressPackageStartupMessages( library(dplyr) )
dfr <- as_tibble(dfr)

groups <- lapply(1:10, function(ct) kmeans(x = dfr[,c("RFU1", "RFU2")], centers = ct)$tot.withinss) # as.matrix(
# plot(unlist(groups))

Метод 1 : исправить случайное начальное число

# --- Experiment 1
set.seed(123)
groups <- kmeans(x = dfr[,c("RFU1", "RFU2")], centers = 4)
dfr$cluster <- groups$cluster
dfr
#> # A tibble: 96 x 4
#>    id        RFU1    RFU2 cluster
#>    <chr>    <dbl>   <dbl>   <int>
#>  1 1       -0.296   -8.35       4
#>  2 2        0.964  235.         4
#>  3 3     3381.     638.         2
#>  4 4     3533.     650.         2
#>  5 5     3432.     617.         2
#>  6 6     3243.     604.         3
#>  7 7     2105.    4270.         1
#>  8 8     2220.    4200.         1
#>  9 9     3548.     690.         2
#> 10 10    3507.     713.         2
#> # ... with 86 more rows

# --- Experiment 2
set.seed(123)
groups <- kmeans(x = dfr[,c("RFU1", "RFU2")], centers = 4, )
dfr$cluster2 <- groups$cluster
dfr
#> # A tibble: 96 x 5
#>    id        RFU1    RFU2 cluster cluster2
#>    <chr>    <dbl>   <dbl>   <int>    <int>
#>  1 1       -0.296   -8.35       4        4
#>  2 2        0.964  235.         4        4
#>  3 3     3381.     638.         2        2
#>  4 4     3533.     650.         2        2
#>  5 5     3432.     617.         2        2
#>  6 6     3243.     604.         3        3
#>  7 7     2105.    4270.         1        1
#>  8 8     2220.    4200.         1        1
#>  9 9     3548.     690.         2        2
#> 10 10    3507.     713.         2        2
#> # ... with 86 more rows

Метод 2 : ярлыки не имеют значения, группы ничего не делают

Метод 3 : ярлыки имеют значение

3.1 мои данные является ординатой, метка для кластерных центров

lab <- order(order(groups$centers[,1])) # c(2, 4, 3, 1)
# head( cbind(dfr$cluster2, lab[dfr$cluster2] ) )

dfr <- dfr %>% 
    mutate(label1 = lab[dfr$cluster2] )

3,2 мои данные имеют важных лиц, помечаются ссылками

# Suppose individuals 1, 4, 6 and 7 could name the classes

dfr <- dfr %>% tibble::rownames_to_column(var = "id") %>% 
    mutate(id = paste0("id_", id) )

refs <- tibble(id = dfr$id[c(1, 4, 6, 7)],
           cluster = dfr$cluster2[c(1, 4, 6, 7)]
           )

dfr %>% 
    mutate(label2 = refs$id[ c(2, 4, 3, 1)[cluster2] ]
        # label2 = letters[1:4][cluster2]
           )
#> # A tibble: 96 x 7
#>    id        RFU1    RFU2 cluster cluster2 label1 label2
#>    <chr>    <dbl>   <dbl>   <int>    <int>  <int> <chr> 
#>  1 1       -0.296   -8.35       4        4      1 1     
#>  2 2        0.964  235.         4        4      1 1     
#>  3 3     3381.     638.         2        2      4 7     
#>  4 4     3533.     650.         2        2      4 7     
#>  5 5     3432.     617.         2        2      4 7     
#>  6 6     3243.     604.         3        3      3 6     
#>  7 7     2105.    4270.         1        1      2 4     
#>  8 8     2220.    4200.         1        1      2 4     
#>  9 9     3548.     690.         2        2      4 7     
#> 10 10    3507.     713.         2        2      4 7     
#> # ... with 86 more rows
...