3

所以我花了很多时间试图找到如何做到这一点的答案。到目前为止我找到的唯一答案是:如何在不删除 R 中存在 NA 的行的情况下执行聚类

不幸的是,这对我不起作用。

所以这是我的数据的一个例子(这个例子中的d):

Q9Y6X2           NA -6.350055943 -5.78314068
Q9Y6X3           NA           NA -5.78314068
Q9Y6X6  0.831273549  4.875151493  0.78671493
Q9Y6Y8  4.831273549  0.457298979  5.59406985
Q9Y6Z4  4.831273549  4.875151493          NA

这是我尝试过的:

> dist <- daisy(d,metric = "gower")
> hc <- hclust(dist)
Error in hclust(dist) : NA/NaN/Inf in foreign function call (arg 11)

据我了解,daisy 应该能够处理 NA 值,但是在尝试对结果进行聚类时仍然收到错误消息。

谢谢。

4

4 回答 4

2

混合模型允许对具有缺失值的数据集进行聚类,假设值完全随机缺失 (MCAR)。此外,信息标准(如 BIC 或 ICL)允许选择集群的数量。您可以使用 R 包 VarSelLCM 对这些数据进行聚类(有一个 Shiny 应用程序可以解释结果)。此软件包的教程可在此处获得

于 2018-03-22T13:14:28.750 回答
1

如果查看 dist 矩阵,您会看到存在 NA,因为样本 Q9Y6X3 和 Q9Y6Z4 没有重叠。这会导致您的 dist 矩阵中出现 NA,这是 hclust 不喜欢的。您可能会强制 NA 为 0 或其他值,但我不确定这是否会留下统计偏差。

于 2014-11-12T19:53:30.037 回答
0

在以下帖子的第二个答案中: 如何在不删除 R 中存在 NA 的行的情况下执行聚类,报告了“daisy”函数中的此类错误。以前,该功能由以下人员编码:

if (any(ina <- is.na(type3))) 
stop(gettextf("invalid type %s for column numbers %s", 
    type2[ina], pColl(which(is.na))))

没有打印出预期的错误消息,因为错误地使用了 which(is.na) 而不是 which(ina)。

“cluster”包中包含的这个函数的作者承认了这个问题,并在 2015 年 6 月修复了代码。http://svn.r-project.org/R-packages/trunk/cluster/R/daisy.q

于 2016-01-26T19:02:44.423 回答
0

您应该从一些描述性统计数据开始,例如分析每个变量的 NA 频率,并拆分直方图以判断特定变量是否缺失(如果有很多变量缺失,这几乎是不可能的)。

如果您的缺失很少(例如,<1%),您可以通过可用值的平均值或中值进行简单插补,或随机插补(例如在可用值中随机抽取)。如果您发现有更多缺失的变量,但直方图现在显示差异,那么您的数据完全随机缺失,因此随机插补也可以。

在大多数情况下,缺失取决于数据集中的其他变量,甚至是未观察到的信息。在这种情况下,多重插补通常是最好的。关于这方面的一本非常好的书是:https ://stefvanbuuren.name/fimd/ 它来自老鼠包的作者。还有其他很棒的插补包,例如,missRanger使用快速随机森林实现来插补(例如,估计)缺失值。

在任何情况下,您都应该测试各种方法(并迭代非确定性方法)以了解它们对聚类结果的影响。FeatureImpCluster(我创作的)为每个变量提供了一个全局特征重要性度量。如果一个变量与插补结果无关,那么您可能不必担心您使用的插补技术。

最后,专门针对 k-means 聚类中的缺失值,我编写了ClustImpute包,它不需要您事先估算 NA。

于 2021-06-19T16:06:25.657 回答