二进制数据的MDS图:违反直觉的聚类

时间:2018-02-14 13:53:44

标签: r similarity mds

假设我有以下二进制数据框df

structure(list(a = c(0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0), b = c(0, 
0, 0, 0, 0, 0, 1, 0, 1, 0, 1), c = c(0, 0, 0, 0, 1, 0, 0, 1, 
0, 1, 0), d = c(1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0), e = c(0, 0, 
1, 0, 0, 0, 0, 0, 0, 0, 1), f = c(0, 0, 1, 0, 0, 0, 0, 0, 0, 
0, 1), g = c(0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0), h = c(1, 0, 0, 
0, 0, 0, 0, 1, 1, 0, 0), i = c(0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 
0)), class = "data.frame", row.names = c(NA, -11L), .Names = c("a", 
"b", "c", "d", "e", "f", "g", "h", "i"))

> df
   a b c d e f g h i
1  0 0 0 1 0 0 0 1 0
2  0 0 0 0 0 0 1 0 0
3  0 0 0 0 1 1 1 0 0
4  0 0 0 0 0 0 1 0 0
5  1 0 1 0 0 0 0 0 0
6  0 0 0 0 0 0 0 0 1
7  0 1 0 1 0 0 0 0 0
8  1 0 1 0 0 0 0 1 0
9  0 1 0 0 0 0 0 1 1
10 0 0 1 1 0 0 0 0 1
11 0 1 0 0 1 1 0 0 0

我想检查行之间的相似性,因此,使用MDS图。我使用binary中的dist(即Jaccard)方法执行经典的MDS缩放。

# Load libraries
library(dplyr)
library(ggplot2)
library(magrittr)

# Perform MDS scaling using binary method
mds_df <- df %>% 
  dist(method = "binary") %>% 
  cmdscale 

接下来,我标记我的列,将它们绑定到我的原始数据框,并添加行号以在我的图中用作标签。

# Name columns
colnames(mds_df) <- c("mds_x", "mds_y")

# Bind to original data frame
df %<>% 
  cbind(mds_df) %>% 
  mutate(tags = row_number())

最后,我使用ggplot2绘制结果。

g <- ggplot(df) + geom_point(aes(x = mds_x, y = mds_y), size = 5)
g <- g + geom_text(aes(x = mds_x, y = mds_y, label = tags), position = position_jitter(width = 0.05, height = 0.05))
g <- g + xlab("Coordinate 1") + ylab("Coordinate 2")
print(g)

enter image description here

现在,请注意矩阵中的第2行和第4行完全相同。在图中,它们正好相互叠加。大!说得通。接下来,看看第6行和第6行。 7.他们没有共同的1值,但却相当接近。嗯。更糟糕的是,第3行和第3行11有两个1个共同点,但相距更远。怪异。

我意识到Jaccard方法将这些共同元素与两组中的元素总数(即,在并集上相交)进行比较,但是第6行和第6行。 7有三个不共同的元素,没有共同点,而3&amp; 11有两个共同的元素,两个不共同。直觉上,我觉得3&amp; 11应该比6&amp; 7.这是由于距离度量选择不当还是编码/逻辑缺陷造成的?是否有另一种绘图方法能够以更直观的方式显示这些结果?

1 个答案:

答案 0 :(得分:1)

由于您有9个变量,因此您在9维空间中绘制了11个观测值。当你压缩到二维空间细节丢失。如果您使用cmdscale()运行eig=TRUE,您将获得有关最终解决方案的更多信息。 GOF值是适合度,1.0是一个完美的分数。你有.52所以你在2维的9维中显示了大约52%的空间信息。这很好,但不是很好。如果您增加到3维,则会得到GOF值为.68。 cmdscale()函数计算度量多维缩放(又称主坐标分析)。

由于您已加载纯素包,因此您可以选择使用monoMDS()metaMDS()尝试非度量多维(NMDS)缩放。 NMDS的问题在于解决方案可以找到局部最小值,因此最好尝试多次运行并选择最佳运行。这就是metaMDS()的作用。默认情况下,它会尝试20个随机启动配置如果它们中的两个基本相同,则它们是收敛的。您的数据找不到两个相同的解决方案,所以我只是绘制了20个中最好的一个。使用trymax=100,我终于得到了收敛的解决方案,但该解决方案与使用默认20次尝试的解决方案没有明显不同: / p>

df.dst <- dist(df, method="binary")
df.meta <- metaMDS(df.dst)
plot(df.meta, "sites")
text(df.meta, "sites", pos=3)

enter image description here

我认为距离在这个情节中有更好的表现。当然,11和3比6和7更接近。