【问题标题】:clustering with NA values in R在 R 中使用 NA 值进行聚类
【发布时间】:2012-05-30 01:57:13
【问题描述】:

我惊讶地发现来自library(cluster)clara 允许 NA。但是函数文档没有说明它如何处理这些值。

所以我的问题是:

  1. clara 如何处理 NA?
  2. 这可以以某种方式用于kmeans(不允许Nas)吗?

[更新]所以我确实在clara函数中找到了几行代码:

inax <- is.na(x)
valmisdat <- 1.1 * max(abs(range(x, na.rm = TRUE)))
x[inax] <- valmisdat

valmisdat 进行缺失值替换。不确定我是否理解使用这种公式的原因。有任何想法吗?按每列分别处理 NA 是否更“自然”,也许用均值/中位数代替?

【问题讨论】:

    标签: r cluster-analysis


    【解决方案1】:

    虽然没有明确说明,但我相信NA 会按照?daisy 帮助页面中描述的方式进行处理。详细信息部分有:

    在菊花算法中,x 行中的缺失值不包括在相异度中 涉及该行。

    在内部,clara() 将使用相同的代码,这就是我理解数据中的NAs 可以处理的方式——它们只是不参与计算。在这种情况下,这是一种合理的标准处理方式,例如用于定义 Gower 的广义相似系数。

    更新clara.cC 来源清楚地表明这(上面)是clara() 处理NAs 的方式(./src/clara.c 中的第 350-356 行) :

        if (has_NA && jtmd[j] < 0) { /* x[,j] has some Missing (NA) */
            /* in the following line (Fortran!), x[-2] ==> seg.fault
               {BDR to R-core, Sat, 3 Aug 2002} */
            if (x[lj] == valmd[j] || x[kj] == valmd[j]) {
            continue /* next j */;
            }
        }
    

    【讨论】:

    • 处理daisy 中缺失值的代码行与clara 函数中相同(请参阅我的问题更新)。
    • @danas.zuokas 我不确定从您认为与问题相关的来源中提取任意代码行有多大帮助。您需要同时研究 R 代码和 C 代码。 valmisdat 是 C 代码中用于指示缺失数据 (NA) 的值,而不是直接使用 NA。如果您查看 C 代码,您会发现它显然只是忽略了比较,其中一个变量对于一个或另一个或两个样本中的一个或另一个或两个正在计算差异的样本有缺失值。查看代码指针的更新答案。
    • 你能想出在kmeans中使用相同的NA处理的方法吗?
    • 可能,但并非没有编写自己的 k-means 算法。本质上,k-means 适用于组内平方和,因此与质心的距离。 clara 正在做同样的事情,所以这个想法是可行的(在计算到质心的欧几里德距离和我猜的质心本身的距离时,您只需忽略这些比较)。您是否固定使用k-means?如果 k-mediods 没问题(我不明白为什么它不会比 k-means 更健壮),请使用 cluster 包中的 pam() 函数,它处理NAs 喜欢 clara()daisy()
    • @GavinSimpson 在使用 k-means 之前使用面向矩阵的方法是否存在可扩展性问题?根据 r 中的内存分配,向量可能太大。
    【解决方案2】:

    不确定kmeans 是否可以通过忽略连续缺失值来处理缺失数据。

    kmeans中有两个步骤;

    1. 计算观测值与原始聚类平均值之间的距离。
    2. 根据新计算的距离更新新的聚类平均值。

    当我们的观察中缺少数据时: 步骤 1 可以通过适当调整距离度量来处理,如 clara/pam/daisy 包中的那样。但是只有当我们对观察的每一列都有一些值时,才能执行第 2 步。因此,插补可能是kmeans 处理缺失数据的下一个最佳选择。

    【讨论】:

      【解决方案3】:

      通过查看 Clara c 代码,我注意到在 clara 算法中,当观察值中存在缺失值时,平方和与缺失值的数量成正比“减少”,我认为这是错误的! clara.c 的第 646 行类似于“ dsum *= (nobs / pp) ”,表示它计算每对观察值 (nobs) 中非缺失值的数量,然后将其除以变量数量 (pp) 并相乘这是平方和。我认为必须以其他方式完成,即“ dsum *= (pp / nobs) ”。

      【讨论】:

      • 您可以使用edit link 来编辑您之前的答案。
      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 2012-09-28
      • 2015-07-04
      • 2021-07-30
      • 2015-09-22
      • 2014-03-07
      • 2011-09-12
      • 1970-01-01
      相关资源
      最近更新 更多