二进制数据的 MDS 图:违反直觉的聚类
MDS plots of binary data: counterintuitive clustering
假设我有以下二进制数据框,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 图。我在 dist
.
中使用 binary
(即 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)
现在,请注意矩阵中的第 2 行和第 4 行完全相同。在图中,它们正好落在彼此之上。伟大的!说得通。接下来,查看第 6 行和第 7 行。它们没有共同的 1
值,但非常接近。唔。更糟糕的是,第 3 行和第 11 行有两个共同的 1
,但绘制得更远。奇怪。
我意识到 Jaccard 方法将那些公共元素与两个集合中的元素总数进行比较(即相交并集),但是第 6 行和第 7 行有三个不公共的元素,none共同点,而 3 和 11 有两个共同点和两个不共同点。直觉上,我觉得 3 和 11 应该比 6 和 7 靠得更近。这是因为距离度量选择不当还是我的 coding/logic 有缺陷?是否有另一种绘图方法可以更直观地显示这些结果?
由于您有 9 个变量,因此您在 9 维 space 中绘制了 11 个观测值。当您将其压缩为二维 space 时,细节会丢失。如果您 运行 cmdscale()
和 eig=TRUE
您将获得有关最终解决方案的更多信息。 GOF
值是拟合优度,1.0 是满分。你有 .52,所以你在 2 维的 9 维中显示了大约 52% 的空间信息。那很好但不是很好。如果增加到 3 维,您将得到 GOF
0.68 的值。 cmdscale()
函数计算度量多维缩放(也称为主坐标分析)。
由于您已经加载了 vegan 包,您可以选择使用 monoMDS()
或 metaMDS()
尝试非度量多维 (NMDS) 缩放。 NMDS 的问题是解决方案可以找到局部最小值,因此最好尝试几个 运行s 并选择最好的一个。这就是 metaMDS()
所做的。默认情况下,它会尝试 20 个随机启动配置。如果其中 2 个基本相同,则它们是收敛的。您的数据没有找到 2 个相同的解决方案,所以我只是绘制了 20 个中最好的一个。使用 trymax=100
,我终于得到了收敛的解决方案,但该解决方案与使用默认 20 次尝试的解决方案没有明显不同:
df.dst <- dist(df, method="binary")
df.meta <- metaMDS(df.dst)
plot(df.meta, "sites")
text(df.meta, "sites", pos=3)
我认为该图中的距离更好一些。当然 11 和 3 比 6 和 7 更接近。
假设我有以下二进制数据框,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 图。我在 dist
.
binary
(即 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)
现在,请注意矩阵中的第 2 行和第 4 行完全相同。在图中,它们正好落在彼此之上。伟大的!说得通。接下来,查看第 6 行和第 7 行。它们没有共同的 1
值,但非常接近。唔。更糟糕的是,第 3 行和第 11 行有两个共同的 1
,但绘制得更远。奇怪。
我意识到 Jaccard 方法将那些公共元素与两个集合中的元素总数进行比较(即相交并集),但是第 6 行和第 7 行有三个不公共的元素,none共同点,而 3 和 11 有两个共同点和两个不共同点。直觉上,我觉得 3 和 11 应该比 6 和 7 靠得更近。这是因为距离度量选择不当还是我的 coding/logic 有缺陷?是否有另一种绘图方法可以更直观地显示这些结果?
由于您有 9 个变量,因此您在 9 维 space 中绘制了 11 个观测值。当您将其压缩为二维 space 时,细节会丢失。如果您 运行 cmdscale()
和 eig=TRUE
您将获得有关最终解决方案的更多信息。 GOF
值是拟合优度,1.0 是满分。你有 .52,所以你在 2 维的 9 维中显示了大约 52% 的空间信息。那很好但不是很好。如果增加到 3 维,您将得到 GOF
0.68 的值。 cmdscale()
函数计算度量多维缩放(也称为主坐标分析)。
由于您已经加载了 vegan 包,您可以选择使用 monoMDS()
或 metaMDS()
尝试非度量多维 (NMDS) 缩放。 NMDS 的问题是解决方案可以找到局部最小值,因此最好尝试几个 运行s 并选择最好的一个。这就是 metaMDS()
所做的。默认情况下,它会尝试 20 个随机启动配置。如果其中 2 个基本相同,则它们是收敛的。您的数据没有找到 2 个相同的解决方案,所以我只是绘制了 20 个中最好的一个。使用 trymax=100
,我终于得到了收敛的解决方案,但该解决方案与使用默认 20 次尝试的解决方案没有明显不同:
df.dst <- dist(df, method="binary")
df.meta <- metaMDS(df.dst)
plot(df.meta, "sites")
text(df.meta, "sites", pos=3)
我认为该图中的距离更好一些。当然 11 和 3 比 6 和 7 更接近。