聚类的不确定性
Uncertainty in Clustering
我正在对包含 30 项研究的数据集应用层次聚类。我的数据集的一个例子是:
X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14
1 2 2 7 7 0 0 0 0 0 0 0 0 0 0 0
2 0 5 37 27 5 1 2 2 2 2 1 1 1 0 0
:
:
30 0 0 3 1 2 5 7 0 0 0 0 0 0 0 0
我使用以下代码应用了 kolmogorov-sminrov 测试的 bootstrap 采样版本来计算距离矩阵 d
并应用了 'complete-link' 算法。
p <- outer(1:30, 1:30, Vectorize(function(i,j)
{ks.boot(as.numeric(rep(seq(0,14,1),as.vector(test[i,]))),
as.numeric(rep(seq(0,14,1),as.vector(test[j,]))),nboots=10000)
$ks.boot.pvalue}))
d <- as.dist(as.matrix(1-p))
hc1 <- hclust(d,method = "complete")
plot(hc1)
这对每项研究之间的 10,000 (KS) p 值进行了采样。所以对于 s1 & s2, s1 & s3 .... s1 & s30, s2 & s3 .... s 29 & s30 并将概率存储到 30 x 30 矩阵中。
如果我通过简单地重新运行代码并将 p 值存储在另一个变量中并绘制树状图来重复此过程,那么我将获得一个稍微不同的树状图,其中一些研究改变了位置。我附上了几个例子
有些差异在视觉上非常微妙,但高度略有变化,大簇的位置也发生了变化。我对两种类型的不确定性感兴趣:树状图试图显示的 bootstrap 采样引起的不确定性。
第二个是样本量的不确定性,即研究中的样本量如何影响聚类顺序。我想以某种方式形象化这一点,我唯一的猜测是删除一项研究并将新的树状图与原始树状图进行比较,然后手动找出差异,这会花费很多时间。
我还检查了 pvclust
层次聚类包,但我认为它不适用于我使用 KS bootstrapping。
您可以通过多种方式进行此分析。您正在根据 bootstrapped 数据计算单个距离矩阵。相反,您应该生成具有 bootstrap 分支支持的 bootstrapped tree。这将使您了解聚类的鲁棒性。
这是一个使用 Iris 数据集和这个 R 包的例子:https://github.com/sgibb/bootstrap
library(bootstrap)
library(dplyr)
set.seed(1)
data(iris)
rownames(iris) <- paste0(iris$Species, ".", 1:nrow(iris))
iris <- iris %>% sample_n(25) %>% dplyr::select(-Species) %>% data.matrix
createHclustObject <- function(x)hclust(dist(x), "ave")
b <- bootstrap(iris, fun=createHclustObject, n=1000L)
hc <- createHclustObject(iris)
plot(hc)
bootlabels.hclust(hc, b, col="blue")
另请参阅:
http://www.pnas.org/content/93/23/13429
(原创?)PNAS 论文描述了 bootstrap 对系统发育树的分支支持
我正在对包含 30 项研究的数据集应用层次聚类。我的数据集的一个例子是:
X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14
1 2 2 7 7 0 0 0 0 0 0 0 0 0 0 0
2 0 5 37 27 5 1 2 2 2 2 1 1 1 0 0
:
:
30 0 0 3 1 2 5 7 0 0 0 0 0 0 0 0
我使用以下代码应用了 kolmogorov-sminrov 测试的 bootstrap 采样版本来计算距离矩阵 d
并应用了 'complete-link' 算法。
p <- outer(1:30, 1:30, Vectorize(function(i,j)
{ks.boot(as.numeric(rep(seq(0,14,1),as.vector(test[i,]))),
as.numeric(rep(seq(0,14,1),as.vector(test[j,]))),nboots=10000)
$ks.boot.pvalue}))
d <- as.dist(as.matrix(1-p))
hc1 <- hclust(d,method = "complete")
plot(hc1)
这对每项研究之间的 10,000 (KS) p 值进行了采样。所以对于 s1 & s2, s1 & s3 .... s1 & s30, s2 & s3 .... s 29 & s30 并将概率存储到 30 x 30 矩阵中。
如果我通过简单地重新运行代码并将 p 值存储在另一个变量中并绘制树状图来重复此过程,那么我将获得一个稍微不同的树状图,其中一些研究改变了位置。我附上了几个例子
有些差异在视觉上非常微妙,但高度略有变化,大簇的位置也发生了变化。我对两种类型的不确定性感兴趣:树状图试图显示的 bootstrap 采样引起的不确定性。
第二个是样本量的不确定性,即研究中的样本量如何影响聚类顺序。我想以某种方式形象化这一点,我唯一的猜测是删除一项研究并将新的树状图与原始树状图进行比较,然后手动找出差异,这会花费很多时间。
我还检查了 pvclust
层次聚类包,但我认为它不适用于我使用 KS bootstrapping。
您可以通过多种方式进行此分析。您正在根据 bootstrapped 数据计算单个距离矩阵。相反,您应该生成具有 bootstrap 分支支持的 bootstrapped tree。这将使您了解聚类的鲁棒性。
这是一个使用 Iris 数据集和这个 R 包的例子:https://github.com/sgibb/bootstrap
library(bootstrap)
library(dplyr)
set.seed(1)
data(iris)
rownames(iris) <- paste0(iris$Species, ".", 1:nrow(iris))
iris <- iris %>% sample_n(25) %>% dplyr::select(-Species) %>% data.matrix
createHclustObject <- function(x)hclust(dist(x), "ave")
b <- bootstrap(iris, fun=createHclustObject, n=1000L)
hc <- createHclustObject(iris)
plot(hc)
bootlabels.hclust(hc, b, col="blue")
另请参阅:
http://www.pnas.org/content/93/23/13429 (原创?)PNAS 论文描述了 bootstrap 对系统发育树的分支支持