R数据分析:如何用层次聚类分析做“症状群”,实例操练

2023-10-13 08:20

本文主要是介绍R数据分析:如何用层次聚类分析做“症状群”,实例操练,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

好多同学硕士论文开题咨询我想做症状群,有用因子分析的,也有用潜类别分析的,这些方法之前都给大家写过,今天再给大家写一个用无监督的机器学习方法-------层次聚类做症状群的方法。同学们如果对这个方法有兴趣的话,开题什么的都可以往这方面考虑,希望看了本文之后能够对层次聚类有一定了解,能思考下自己能不能往这个方向上展开。

做出来的结果呈现就是下图:这个是一篇已经发表的文章中截图出来的,作者是将一个疾病的症状聚类了3类,探讨了每一类的特征,并提出了治疗照护的建议。

文章感兴趣的同学自己去瞅瞅哈:Sethares, Kristen & Chin, Elizabeth. (2021). Age and gender differences in physical heart failure symptom clusters. Heart & Lung. 50. 832-837.
10.1016/j.hrtlng.2021.07.001.

今天就带大家看看像这种层次聚类的症状群如何做。

层次聚类的原理

Hierarchical clustering,层次聚类出来的结果就像一个树一样,一层一层地生长,这个树也是完全的数据驱动的,对于陌生领域的探索性研究,像症状群之类的就特别合适。

对于这个一个树,英文叫dendrogram,它怎么形成的呢,很自然地,我们可以让其通过从顶部往下散开这样的方式形成(方式1,英文叫Divisive),也可以让其从根部往上聚合这样的方式形成(方式2,英文叫Agglomerative)。

Divisive : A divisive method begins with all patterns in a single cluster and performs splitting until a stopping criterion is met.

Agglomerative : An agglomerative approach begins with each observation in a distinct (singleton) cluster, and successively merges clusters together until a stopping criterion is satisfied.

这儿我只给大家写方式2,因为这个比较常用,上面截图的文章也是用的方式2的聚类方法实现的。

方式2的基本思路就是:

  1. 先计算每一个类之间的距离
  2. 将最近距离的类合并
  3. 重复1,2直到所有类合并为1个类

上面的步骤走完,一个树就长出来了,直观的图示就是如下:

上图就是假设我们只有两个变量,9个个案(类),从左上角到右下角走完流程9个个案就成了一个类了。

步骤中有提到距离,这里面就涉及到一个距离的计算问题,计算的方法有很多种,本文也不展开,感兴趣的同学可以单独咨询我,常见的距离算法如下:

    • Centroid linkage
  •  Single linkage
  •  Complete linkage
  •  Average linkage
  •  Ward’s method

像截图的文章使用的方法就是Ward’s method。

层次聚类的做法

做从下到上层次聚类用到的函数是hclust(),hclust需要接受的参数是一个距离矩阵,大家直接在R中输入如下代码就可以体验出图的快乐了:

hc = hclust(dist(mtcars))
plot(hc)

在上面的代码中dist函数就是用来计算个案距离的函数的,在这一步的时候一定要将所有数值型变量标准化,不然聚类肯定是不对的,具体地大家可以在dist函数的参数中设定距离的计算方法,比如截图论文中就使用的Ward’s method,我们就可以设定为"ward.D"或者"ward.D2"。

但是我们发现此时聚类的对象依然是个案,其实我们想聚类是症状,也就是我们数据库中的变量,还是用实际例子给大家说明吧。

比如我手上现在有如下形式的数据库,也就是大家会收集到的每个症状:

我想看看病人中这些个症状有哪些”症状群“,首先我们需要将数据框转置,然后再进行聚类,我就可以写出代码如下:

data2 <- t(data2)
mycluster = hclust(dist(data2))
plot(mycluster )

运行代码后就可以出图啦:

其实到这儿大家就可以直观地看出来,应该是有2个症状群的,症状群1包括症状3和4,症状群2包括其余所有的症状,我们依然是将我们的图像论文中那样标注出来:

就是说症状3和4为一个群,而其余的症状为一个群。

你还可以通过给不同症状群打上不同颜色的方式,进一步突出不同症状群,代码如下:

hc_dend_obj <- as.dendrogram(mycluster) 
hc_col_dend <- color_branches(hc_dend_obj, h = 6)
plot(hc_col_dend,hang=-1)

还有一个很重要的问题,就是生成个案的症状群标签,只有有了症状群标签,我们才能像论文中那样去比较不同症状群个案的一般人口学特征,症状群标签可以通过如下代码得到:

hc = hclust(dist(scale(data2)))
cut_avg <- cutree(hc, k = 2)
data_cl <- mutate(data1, cluster = cut_avg)

运行上面的代码后我们再查看原来是数据库,就可以看到新生成的最后一列就是每一个个案是症状群类别。然后我们就可以比较不同症状群的个案在各种变量上的差异了,像这样一篇论文也就完成了。

最后要提醒大家的是,论文作者是用SPSS软件做的,大家也可以用SPSS尝试下哦,就在哪个分析-分类-系统聚类选项里面,我试了试也是完全可以做出来的。

小结

今天给大家写了如何用层次聚类进行症状群的探讨,感谢大家耐心看完,自己的文章都写的很细,代码都在原文中,希望大家都可以自己做一做,请转发本文到朋友圈后私信回复“数据链接”获取所有数据和本人收集的学习资料。如果对您有用请先收藏,再点赞分享。

也欢迎大家的意见和建议,大家想了解什么统计方法都可以在文章下留言,说不定我看见了就会给你写教程哦,另欢迎私信。

这篇关于R数据分析:如何用层次聚类分析做“症状群”,实例操练的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/201928

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP