R语言数据探索和分析22-使用随机森林和聚类算法探索和预测健康状况

一、研究背景

在两个实验中,使用了一组综合性的生物统计数据来探索和预测健康状况(特别是疾病的发生)。实验的核心在于应用高级数据分析技术,具体包括随机森林分类和聚类分析,来洞察和预测个体的健康状况。首先,对数据进行了精细的预处理,确保了分析的准确性和有效性。接下来,通过一系列的数据可视化手段,包括生成相关系数热力图,成功地揭示了数据中的关键模式和趋势。

随后,采用随机森林模型,这是一种强大的机器学习技术,对疾病(即响应变量“illness”)的发生进行了预测。通过这种方法,不仅能够评估各种健康指标与疾病发生之间的关系,还能够预测个体的健康风险。模型的性能通过一系列的评估指标得到了验证,包括混淆矩阵和接收者操作特征曲线(ROC),这些都是评估分类模型性能的重要工具。

最后,进行了聚类分析,这进一步加深了对数据集中潜在群体特征的理解。这一步骤不仅揭示了不同健康参数之间的关联性,还可能揭示了特定健康状况的潜在风险因素。

二、实证分析

首先读取数据,因为数据很乱,要进行预处理:

最后,格式整理好的数据如下:

# 去除第一行的列名,并用分号分割数据
data <- data[-1]
data <- strsplit(data, ";")

# 将数据转换为数据框
df <- as.data.frame(do.call(rbind, data))
# 设置列名
colnames(df) <- column_names

# 将字符型数据转换为数值型(如果需要)
df[] <- lapply(df, as.numeric)

# 显示数据框的前几行
head(df)

str(df)
head(df,5)

查看其属性:

 数据预处理,创建一个指示缺失值的数据框

###数据预处理
# 创建一个指示缺失值的数据框
missing_df <- df %>% 
  mutate(row_id = row_number()) %>%  # 添加行索引
  pivot_longer(cols = -row_id, names_to = "variable", values_to = "value") %>%
  mutate(value = ifelse(is.na(value), "Missing", "Not Missing"))
# 绘制热图
ggplot(missing_df, aes(x = row_id, y = variable, fill = value)) +
  geom_tile() +
  scale_fill_manual(values = c("Missing" = "red", "Not Missing" = "gray")) +
  theme_minimal() +
  labs(x = "Row Number", y = "Variable", fill = "Status", title = "Heatmap of Missing Values")



# Checking for missing values
cat("Missing Values:\n")
print(sum(is.na(df)))

可以发现无缺失数据,接下来,可以对数据进行统计性分析:

其中包含了最小值、第一四分位数、中位数、平均数、第三四分位数和最大值。这样的摘要为深入分析提供了基础,它揭示了各项指标的分布情况,包括血压、脉搏、饮食、睡眠、身高、体重和腰围等关键健康指标。

接下来对部分数据可视化

# Histograms for numerical features
hist_plots <- df %>%
  pivot_longer(cols = -illness, names_to = "variables", values_to = "values") %>%
  ggplot(aes(x = values, fill = variables)) +
  geom_histogram(bins = 30, color = "black") +
  facet_wrap(~variables, scales = 'free_x') +
  theme_minimal() +
  scale_fill_viridis_d() # 使用 Viridis 颜色方案
print(hist_plots)

年龄(Age): 年龄的分布集中在较低的值区域,这表明样本群体可能偏向年轻人。

舒张压(Diastolic pressure): 舒张压的分布显示了一个相对集中的范围,大多数值在70到90毫米汞柱之间。

饮食(Food): 饮食的分布图显示数据似乎是分类变量,大部分数据集中在两个值上。....

图像展示的是一系列箱形图,这些图表反映了不同变量在两个疾病状态(用“as.factor(illness)”标记,红色表示1,蓝色表示2)之间的分布差异。箱形图显示了数据的中位数(箱子中的横线)、四分位数范围(箱子的大小)、异常值(图中的小圆点)以及整体分布的偏态。例如年龄在两个疾病状态下的分布相似,中位数和四分位数范围较为接近。

这张图是一个散点图,展示了收缩压(Systolic Pressure)与舒张压(Diastolic Pressure)之间的关系。从图中可以看出大部分数据点集中在收缩压100到120毫米汞柱和舒张压70到90毫米汞柱的区域,这通常被视为正常血压范围....

# 首先转换数据为长格式
long_df <- df %>%
  pivot_longer(cols = -illness, names_to = "variables", values_to = "values")

# 使用 ggplot2 绘制密度图
ggplot(long_df, aes(x = values, fill = variables)) +
  geom_density(alpha = 0.7) +
  theme_minimal() +
  scale_fill_viridis_d()

重叠的密度图,它展示了数据集中各个变量的分布密度。每个颜色代表一个变量,其在水平轴上的分布显示了该变量在数据集中的相对密度。例如舒张压(Diastolic Pressure): 分布较为集中,显示为一个较高、较窄的峰,这表明大部分数据落在一个相对狭窄的范围内。

library(corrplot)
cor_mat <- cor(df %>% select(-illness))
corrplot(cor_mat, method = "color")

相关系数热力图,它显示了数据集中不同变量之间的相关性。在这个热力图中,颜色的强度代表相关系数的大小,从-1到1变化。蓝色表示正相关,红色表示负相关,颜色越深表示相关性越强。

从热力图可以观察到以下几点:

存在一些变量间的显著正相关,如身高和体重、腰围和体重,这是符合预期的,因为身体尺寸较大的个体通常体重更重。

有些变量之间的相关性较弱,如食物和睡眠、脉搏和性别,这些变量之间看起来没有明显的直接联系。

index <- sample(1:nrow(df), nrow(df)*0.7)
train_data <- df[index,]
test_data <- df[-index,]

接下来随机森林模型的建立与预测

混淆矩阵为:

library(ggplot2)
# 计算混淆矩阵
# 计算混淆矩阵
confusion <- confusionMatrix(as.factor(predictions), as.factor(test_data$illness))
confusion_matrix <- confusion$table

# 将混淆矩阵转换为长格式的数据框
confusion_long <- as.data.frame(as.table(confusion_matrix))

# 确保列名是正确的
names(confusion_long) <- c("Prediction", "Actual", "Frequency")

# 可视化混淆矩阵
ggplot(confusion_long, aes(x = Prediction, y = Actual, fill = Frequency)) +
  geom_tile() +
  scale_fill_gradient(low = "white", high = "steelblue") +
  theme_minimal() +
  labs(title = "Confusion Matrix", x = "Predicted Label", y = "True Label")

随后绘制一下绘制精确度-召回率曲线

每个图表都显示了模型在特定指标上的得分,与归一化排名(可能基于预测概率)的关系。接下来查看重要性特征排序:

从图中可以看出:

食物(Food): 这个变量的重要性评分最高,表明它在模型预测疾病状态中起着关键作用。

年龄(Age): 排在第二位,也是模型中一个重要的预测变量。

接下来进行聚类分析:

针对该数据,聚类可以:

健康分析:通过聚类分析,可以将相似的健康状况的个体归为一类,例如根据血压、脉搏、体重等因素。这有助于识别特定健康风险群体或研究特定健康状况的共同特征....

# 使用肘方法确定簇的数量
wss <- map_dbl(1:10, ~kmeans(df_scaled, .x)$tot.withinss)
plot(1:10, wss, type = "b", pch = 19, frame = FALSE, xlab = "Number of clusters K", ylab = "Total within-clusters sum of squares")

# 应用k均值聚类
set.seed(123) # 为了可重复性
k <- 3 # 假设选择的簇数为3
km_result <- kmeans(df_scaled, centers = k)

运用手肘发法选择K值,它用于帮助确定在聚类分析中应选择多少个簇(即K值)。肘部方法的核心思想是增加簇的数量会导致每个簇内的总方差(或称为总内簇平方和)减少,但减少的速率会在某一点急剧下降,这一点就是“肘部”。

在图中,横轴表示簇的数量(K),纵轴表示总内簇平方和。图中显示当簇的数量从2增加到10时,总内簇平方和急剧下降并逐渐平缓,这表明随着簇数量的增加,新的簇不再显著降低总方差。

 

在此图中,可以观察到以下特点:

三个簇: 数据点被分成了三个簇,每个簇用不同的颜色标记。

簇的分布:

第一个簇(红色区域)似乎较为分散。

第二个簇(绿色区域)和第三个簇(蓝色区域)相对集中。

 三、总结

总而言之,通过随机森林和聚类分析,不仅能够预测疾病的发生,并且还能够识别数据中的自然群体。这些洞察有助于形成对数据集的全面理解,并为进一步的研究和决策提供了数据驱动的基础。尽管如此,模型评估和验证的重要性不容忽视,特别是在准备将这些模型应用于新数据或实际情境中时。

代码和数据

代码和完整报告

创作不易,希望大家多点赞关注评论!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/693633.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专业学习|南开大学《随机过程》学习笔记(一)

&#xff08;1&#xff09;有哪些经典的关于基本随机过程的书籍推荐&#xff1f; 对于想要系统学习基本随机过程的学生来说&#xff0c;可以参考Sheldon M.Rose编著的经典著作《随机过程》。该书涉及的内容也比较宽泛。但并不局限于单个细节论证。 此外&#xff0c;萨缪尔科林(…

SpringAOP 常见应用场景

文章目录 SpringAOP1 概念2 常见应用场景3 AOP的几种通知类型分别有什么常见的应用场景4 AOP实现 性能监控4.1 首先&#xff0c;定义一个切面类&#xff0c;用于实现性能监控逻辑&#xff1a;4.2 定义自定义注解4.3 注解修饰监控的方法 5 AOP实现 API调用统计5.1 定义切面类&am…

连续状态方程的离散化例子

连续状态方程的离散化 在控制系统中,连续状态方程的离散化是一个重要的步骤,用于将连续时间系统转换为离散时间系统,以便在数字控制器中实现。这通常涉及将连续时间的微分方程转换为离散时间的差分方程。常用的离散化方法 前向欧拉法(Forward Euler)简单易实现,但精度较…

在Anaconda中安装keras-contrib库

文章目录 1. 有git2. 无git2.1 步骤12.2 步骤22.3 步骤3 1. 有git 如果环境里有git&#xff0c;直接运行以下命令&#xff1a; pip install githttps://www.github.com/farizrahman4u/keras-contrib.git2. 无git 2.1 步骤1 打开网址&#xff1a;https://github.com/keras-tea…

刷代码随想录有感(97):动态规划——斐波那契数列

题干&#xff1a; 代码&#xff1a; class Solution { public:int fib(int n) {if(n < 1)return n;vector<int> dp(n 1);dp[0] 0;dp[1] 1;for(int i 2; i < n; i){dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }; 动态规划五部曲&#xff1a; 1.dp数组的定…

【数据结构】二叉树专题

前言 本篇博客我们来看一些二叉树的经典题型&#xff0c;也是对上篇博客的补充 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 1.单值二叉树 …

鲜为人知的英伟达创始人:早早退出,身价不如黄仁勋零头

内容提要 普里姆因为婚姻纠纷等个人生活的干扰无法专注在工作上&#xff0c;在成立公司的10年后&#xff0c;也就是2003年宣布退休离开英伟达&#xff0c;并在2006年出售剩余的所有英伟达股份&#xff0c;过上不与外界联系、离群索居的生活&#xff0c;在家中鼓捣着如何“拯救…

数据结构【堆排序】

前言 在上一篇文章主要讲解了二叉树的基本概念和堆的概念以及接口的实现&#xff08;点此处跳转&#xff09; 我们简回顾下堆的基本概念&#xff1a; 1.堆分为大堆和小堆 大堆&#xff1a;父亲结点比左右孩子都大&#xff0c;根结点是最大的小堆&#xff1a;父亲结点比左右孩…

Redis系列-4 Redis集群介绍

Redis集群 Redis提供了持久化能力&#xff0c;保证了重启不会丢失数据&#xff1b;但Redis重启至完全恢复期间&#xff0c;缓存不可用。另外&#xff0c;对于高并发场景下&#xff0c;单点Redis服务器的性能不能满足吞吐量要求&#xff0c;需要进行横向扩展。此时&#xff0c;…

Java基础_Stream流

Java基础_Stream流 Stream流的简单使用Stream流的获取Stream流的中间方法Stream流的终结方法综合练习数字过滤字符串过滤并收集自定义对象过滤并收集 来源Gitee地址 Stream流的简单使用 public class StreamDemo01 {public static void main(String[] args) {/*** 创建集合添加…

【C++ | 拷贝赋值运算符函数】一文了解C++的 拷贝赋值运算符函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-09 1…

API接口测试工具:jmeter的安装、汉化、Jmeter桌面快捷图标和基本使用

文章目录 测试工具&#xff1a;JmeterJmeter安装和配置Jmeter汉化设置中文语言&#xff1a;永久方式设置中文语言&#xff1a;临时方式 设置Jmeter桌面快捷图标jmeter基本用法Jmeter无法保存测试问题解决 测试工具&#xff1a;Jmeter Jmeter依赖于JDK&#xff0c;所以必须确保…

kafka集成flink api编写教程

1.引入依赖&#xff08;pox.xml&#xff09; <dependencies><dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.13.6</version></dependency><dependency><gro…

C# WPF入门学习主线篇(十六)—— Grid布局容器

C# WPF入门学习主线篇&#xff08;十六&#xff09;—— Grid布局容器 欢迎来到C# WPF入门学习系列的第十六篇。在前几篇文章中&#xff0c;我们已经探讨了 Canvas、StackPanel、WrapPanel 和 DockPanel 布局容器及其使用方法。本篇博客将介绍另一种功能强大且灵活的布局容器—…

MT76X8 RF定频使用方法

一、从下面网址下载QA软件包&#xff0c;然后在WIN系统下安装QA环境。https://download.csdn.net/download/zhouwu_linux/89408573?spm1001.2014.3001.5503 在WINDOWS 7系统下先安装WinPcap_4_1_3.exe。 二、硬件连接。 模块上电&#xff0c;PC机 的IP配置成为10.10.18.100&a…

GraphQL(6):认证与中间件

下面用简单来讲述GraphQL的认证示例 1 实现代码 在代码中添加过滤器&#xff1a; 完整代码如下&#xff1a; const express require(express); const {buildSchema} require(graphql); const grapqlHTTP require(express-graphql).graphqlHTTP; // 定义schema&#xff0c;…

Wireshark TS | 应用传输丢包问题

问题背景 仍然是来自于朋友分享的一个案例&#xff0c;实际案例不难&#xff0c;原因也就是互联网线路丢包产生的重传问题。但从一开始只看到数据包截图的判断结果&#xff0c;和最后拿到实际数据包的分析结果&#xff0c;却不是一个结论&#xff0c;方向有点跑偏&#xff0c;…

微服务第一轮

课程文档 目录 一、业务流程 1、登录 Controller中的接口&#xff1a; Service中的实现impl&#xff1a; Service中的实现impl所继承的接口IService&#xff08;各种方法&#xff09;&#xff1a; VO&#xff1a; DTO&#xff1a; 2、搜索商品 ​Controller中的接口&a…

牛客热题:最长公共子串

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;最长公共子串题目链接方法一&am…

【Redis学习笔记05】Jedis客户端(中)

Jedis客户端 1. 命令 1.1 String类型 1.1.1 常见命令 SET命令 语法&#xff1a;SET key value [EX seconds | PX milliseconds] [NX|XX] 说明&#xff1a;将string类型的value值设置到指定key中&#xff0c;如果之前该key存在&#xff0c;则会覆盖原先的值&#xff0c;原先…