变量的聚类:但它们是混合类型的,有些是数字的,有些是分类的

机器算法验证 聚类 分类数据 连续数据 混合类型数据
2022-04-19 02:53:40

我有一个包含 15 个变量的数据集。一些变量是数字的、连续的。其他变量是布尔变量,二分法(真/假)。还有一个变量是分类的,名义上的。

str(df) 'data.frame': 30 obs. of 15 variables:
    nom : Factor w/ 3 levels "a","b","c": 1 1 1 1 1 1 1 1 1 1 ... 
    X1  : logi  FALSE TRUE FALSE TRUE TRUE FALSE ...
    X3  : logi  TRUE TRUE TRUE TRUE FALSE FALSE ... 
    X3  : logi  TRUE FALSE FALSE FALSE TRUE FALSE ... 
    X4  : logi  FALSE TRUE FALSE TRUE FALSE FALSE ... 
    X5  : logi  TRUE FALSE FALSE FALSE FALSE TRUE ... 
    X1.1: num  1.026 -0.285 -1.221 0.181 -0.139 ... 
    X2.1: num  -0.045 -0.785 -1.668 -0.38 0.919 ... 
    X3.1: num  1.13 -1.46 0.74 1.91 -1.44 ... 
    X4.1: num  0.298 0.637 -0.484 0.517 0.369 ... 
    X5.1: num  1.997 0.601 -1.251 -0.611 -1.185 ... 
    X6  : num  0.0597 -0.7046 -0.7172 0.8847 -1.0156 ... 
    X7  : num  -0.0886 1.0808 0.6308 -0.1136 -1.5329 ...
    X8  : num  0.134 0.221 1.641 -0.219 0.168 ... 
    X9  : num  0.704 -0.106 -1.259 1.684 0.911 ..
    X10 : android android OS windows7 windows8...
    [...]

例如,我想将变量(不是数据案例)x1, x2, ..., x9(可能省略标称X10)聚类到相关变量的集群或子集中(x1,x2,x6),(x3,x5), ...

cor()由于变量有混合类型,我认为不可能使用。也不可能使用高尔相似系数,因为它是数据案例之间的相似性。

你能帮我找到一个处理这个的想法吗?我更喜欢 R 中的解决方案。

4个回答

传统的 FA 和聚类算法被设计为与连续(即高斯)变量一起使用。连续变量和定性变量的混合总是会给出错误的结果。特别是根据我的经验,分类信息将主导解决方案。

更好的方法是使用有限混合模型的变体,该模型通常用于连续和分类信息的混合。潜在类混合模型(即 FMM)围绕它们建立了大量的文献。大部分文献都集中在营销科学领域,这些方法在这些领域被广泛使用,例如消费者细分……但这并不是唯一使用它们的领域。

我知道并推荐用于潜在类建模的软件既不是免费的,也不是基于 R 的,但就专有软件而言,它并不昂贵它被称为Latent Gold,由 Statistical Innovations 出售,永久许可证的价格约为 1,000 美元。如果您的项目有预算,它很容易被支出。LG提供了一套广泛的工具,包括用于混合的 FA、混合聚类、基于纵向马尔可夫链的聚类等。

否则,我所知道的唯一基于 R 的免费软件(polCA,https ://www.jstatsoft.org/article/view/v042i10 )旨在用于多路列联表。我不知道这个工具可以接受除分类信息以外的任何东西。可能还有其他人。如果你四处寻找,也许你可以找到一些替代品。

最好通过因子分析来研究相关性簇。R 中有许多不同的因子分析实现,我会推荐 CRAN 上的包 'psych' 作为起点:

http://www.personality-project.org/r/psych/

http://www.personality-project.org/r/#factoranal

您可以欺骗 cor() 接受逻辑,因为每个逻辑在 R 中都是 0 或 1:

> TRUE*7
[1] 7
> FALSE*7
[1] 0

您只需要使用 as.numeric() 更改类型,如

a <- c(TRUE, TRUE, FALSE, FALSE, FALSE)
as.numeric(a)

希望有帮助!

因此,您混合了分类布尔变量和数字连续变量。您希望根据变量的相似性对变量(不是数据案例)进行聚类。

相关系数可以假设为相似性度量。例如,我们可以计算 Pearsonr. 鉴于 booleantrue/false可以转换为1/0二进制值,r是可计算的。r(numeric,numeric)很经典r;r(binary,binary)是点点r或 Phi 系数;r(numeric,binary)是点双列r. 所有这些都是假设的皮尔逊相关性。

可以直接根据收集在一个矩阵中的这三种相关值进行分析(聚类)。如果您将布尔/二进制数据视为高度二分法,您可以这样做,其中在后台无法想象潜在的连续变量。

但随后一些评论家可能会采取立场说,根本没有理论(哲学)方法来比较分类特征之间的相似性和尺度特征之间的相似性。这种观点会建议你将你的连续变量二分法——以某种方式,忘记它们以前是规模的。所以所有的数据都是二进制的,你很好。

而如果您选择接受潜在连续变量的想法,那么在分析中直接使用上述初始相关矩阵会遇到另一个障碍。问题在于——由于一个明显的二元变量(即二分基础变量)只有 2 值,但一个连续的明显变量是多值的——直接比较三个系数的大小是有风险的。例如,请参见此处的第 2 段简而言之,包括二元变量在内的系数对在其潜在前体变量的假设二分法处采取的切点敏感。一种出路是尝试“恢复”(推断)在二分法之前“存在”的相关值。这意味着计算四色相关代替点点rs 和双序列相关代替点双序列rs。如果需要,整个矩阵可能会被“平滑”为正定义。

另一种方法(并非毫无疑问,因为任何方法都是)可能是在给定数据中的经验可访问范围内重新调整相关性。可以说,这个技巧是非理论的,它可能暗示或不暗示二分变量存在潜在的连续变量。这个想法只是消除变量边际分布的任何偏斜对系数的影响。rrescaled=r/rmax; 例如,如果观察到r.4这两个变量的最大可能值为.95(在对它们的数据进行升序排序后得到)然后重新缩放的值为.42. 最后,整个矩阵可能会被“平滑”到 psd 中。

一种替代前一种方法(消除边际效应)的方法可能是计算非参数相关性,而不是r- 例如基于等级的 Spearman rho 或 Kendall tau。这也是一种选择。从这一点开始,从逻辑上讲,我们已经完成了一个循环,从我们开始讨论的内容开始,将尺度变量二分法(而不是对它们进行排名)的进一步选择。


在计算相关性(或者您想要其他相似性度量?)之后,您将不得不决定聚类方法 - 例如分层方法之一。但这里开始另一个故事。您可能还想使用因子分析代替聚类分析:尽管因子分析不是聚类而是潜在变量技术,但在某种意义上它给出了“聚类”。

您可以对二进制特征进行一次性编码并规范化数据以启用相关计算:

library(caret)
df <- data.frame(scale(data.frame(predict(dummyVars(~., df), df))))
library(corrplot)
corrplot(cor(df))

基于此,您可以应用任何聚类方法(例如使用 K-Means,但也可以查看@Bernhard 建议的因子分析的细节):

km <- kmeans(x = t(df), centers = 3, iter.max = 1000)
print(km)
print(km$cluster)
print(km$centers)