Любой обходной путь для кластеризации смешанных типов данных и рендеринга трехмерного графика рассеяния в R? - PullRequest
5 голосов
/ 12 июля 2019

Я пытаюсь увидеть распределение точек данных в маркированных группах на трехмерном графике, потому что я хочу видеть распределение точек данных и хочу увидеть, насколько похожа каждая группа точек данных в трехмерном пространстве.Для этого я использовал пакет scatterplot3d из CRAN, чтобы получить 3D для точечного графика, но не получил правильный график для моих данных.

воспроизводимые данные

Вотвоспроизводимые данные, которые я использовал.

    > dput(head(phenDat,30))
structure(list(SampleID = c("Tarca_001_P1A01", "Tarca_013_P1B01", 
"Tarca_025_P1C01", "Tarca_037_P1D01", "Tarca_049_P1E01", "Tarca_061_P1F01", 
"Tarca_051_P1E03", "Tarca_063_P1F03", "Tarca_075_P1G03", "Tarca_087_P1H03", 
"Tarca_004_P1A04", "Tarca_064_P1F04", "Tarca_076_P1G04", "Tarca_088_P1H04", 
"Tarca_005_P1A05", "Tarca_017_P1B05", "Tarca_054_P1E06", "Tarca_066_P1F06", 
"Tarca_078_P1G06", "Tarca_090_P1H06", "Tarca_007_P1A07", "Tarca_019_P1B07", 
"Tarca_031_P1C07", "Tarca_079_P1G07", "Tarca_091_P1H07", "Tarca_008_P1A08", 
"Tarca_020_P1B08", "Tarca_022_P1B10", "Tarca_034_P1C10", "Tarca_046_P1D10"
), GA = c(11, 15.3, 21.7, 26.7, 31.3, 32.1, 19.7, 23.6, 27.6, 
30.6, 32.6, 12.6, 18.6, 25.6, 30.6, 36.4, 24.9, 28.9, 36.6, 19.9, 
26.1, 30.1, 36.7, 13.6, 17.6, 22.6, 24.7, 13.3, 19.7, 24.7), 
    Batch = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 
    6L, 6L, 6L), Set = c("PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", 
    "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", 
    "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", 
    "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", 
    "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", "PRB_HTA", 
    "PRB_HTA", "PRB_HTA"), Train = c(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), Platform = c("HTA20", 
    "HTA20", "HTA20", "HTA20", "HTA20", "HTA20", "HTA20", "HTA20", 
    "HTA20", "HTA20", "HTA20", "HTA20", "HTA20", "HTA20", "HTA20", 
    "HTA20", "HTA20", "HTA20", "HTA20", "HTA20", "GSE113966", "GSE113966", 
    "GSE113966", "GSE113966", "GSE113966", "GSE113966", "GSE113966", "GSE113966", "GSE113966", 
    "GSE113966")), row.names = c(NA, 30L), class = "data.frame")

моя попытка :

hclustfunc <- function(x) hclust(x, method="complete")
distfunc <- function(x) as.dist((1-cor(t(x)))/2)
d <- distfunc(persons_df)
fit <- hclustfunc(d)

моя обновленная попытка :

library(rgl)
library(car)
scatter3d(x = PC1, y = PC2, z = PC3, surface = FALSE, groups = as.factor(clusters),  surface.col = cluster.colors, col = cluster.colors, xlab="PC1",ylab="PC2",zlab="PC3")

По сути, я хочу видеть точки данных (иначе, строки), которые принадлежат разным партиям (или группам), которые хотят покрасить их с помощью некоторого атрибута 'group'.Я просто хочу увидеть, как точки данных похожи друг на друга, если мы сгруппировали их по разным возрастным категориям, разным партиям и разным платформам

Я думаю использовать kmeans, PCA, другие методы могут дать мне разные компонентыэто можно визуализировать на 3D-графике, но мне не очень понятно, как это сделать в R?

желаемый график :

Я хочу получить 3D-графикчто-то вроде этого:

enter image description here

Может кто-нибудь указать мне, как я могу это сделать?Любой способ получить мои данные и визуализировать их в 3D-графике в R?Какие-нибудь мысли?Спасибо

обновление: возможны самые простые вещи :

Во-первых, я не хочу получать слишком сложное решение, я просто хочу сгруппировать точки данных (ака, каждый ряд), который принадлежит к разным партиям, платформам и возрастным категориям (я использовал findInterval(persons_df$ages, c(10,20,30,40,50))).Есть ли способ сделать это в R?

1 Ответ

4 голосов
/ 14 июля 2019

Edit - добавлен подход k-mode для смешанной кластеризации данных.

Вы также можете рассмотреть plotly для 3D-черчения. Вот пример с вашими данными, где я определил группы для каждой существующей комбинации Batch, Platform и 10-летний возрастной сегмент. В сюжете им назначаются разные цвета, и вы можете дважды щелкнуть легенды группы, чтобы переключить внешний вид. Вам нужно изменить данные намного большего размера, например, вы можете удалить платформу из группировки, поскольку она уже сопоставлена ​​с z.

library(plotly); library(dplyr); library(RColorBrewer)
age_group = 10
phenDat %>% 
  mutate(group = paste(Batch, Platform, "age", 
                       floor(GA/age_group)*age_group, "-", 
                       floor(GA/age_group)*age_group + age_group - 1)) %>%
plot_ly(x = ~GA, y = ~Set, z = ~Platform, color = ~group) %>%
  add_markers(marker = list(size = 2,
                            color = colorRampPalette(brewer.pal(11,"Spectral"))(10))) %>%
  layout(scene = list(xaxis = list(title = "GA"),
                      yaxis = list(title = "Set"),
                      zaxis = list(title = "Platform")))

enter image description here

Что касается кластеризации с учетом смешанных данных, вот подход с использованием функции kmodes пакета klaR, который, по-видимому, дает правдоподобные результаты:

phenDat %>%
  bind_cols(cluster = klaR::kmodes(phenDat, 6)[["cluster"]] %>% as.character) %>%
  plot_ly(x = ~GA, y = ~Set, z = ~Platform, color = ~cluster) %>%
  add_markers(marker = list(size = 5)) %>%
  layout(scene = list(xaxis = list(title = "GA"),
                      yaxis = list(title = "Set"),
                      zaxis = list(title = "Platform")))

enter image description here

...