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时,总内簇平方和急剧下降并逐渐平缓,这表明随着簇数量的增加,新的簇不再显著降低总方差。

 

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

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

簇的分布:

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

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

 三、总结

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

代码和数据

代码和完整报告

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【十大排序算法】选择排序

选择就像是在谱曲&#xff0c;每个决定就是一个音符&#xff0c;只有将它们有序地安排在一起&#xff0c;才能奏响美妙的乐章。 文章目录 一、选择排序的思想二、选择排序的发展历程三、选择排序具象化四、选择排序算法实现五、选择排序的特性推荐阅读 一、选择排序的思想 选…

详解大厂实时数仓建设V4.0

一、实时数仓建设背景 1. 实时需求日趋迫切 目前各大公司的产品需求和内部决策对于数据实时性的要求越来越迫切&#xff0c;需要实时数仓的能力来赋能。传统离线数仓的数据时效性是 T1&#xff0c;调度频率以天为单位&#xff0c;无法支撑实时场景的数据需求。即使能将调度频…

参数传递和剪枝,从修剪二叉树谈起

669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 一、参数传递 Java中的参数传递方式只有一种&#xff0c;那就是值传递。如果我们传的是基本数据类型&#xff0c;那么函数接收到的就是该数据的副本&#xff0c;如果我们传的是对象&#xff0c;那么函数接收到的就…

【Qt知识】部分QWidget属性表格

QWidget是Qt库中所有图形用户界面组件的基类&#xff0c;它提供了大量属性以供自定义和配置控件的行为和外观。下面列出了一些主要的QWidget属性及其作用。 属性 作用 accessibleName 控件的辅助技术名称&#xff0c;用于无障碍访问。 accessibleDescription 控件的辅助技…

CSS真题合集(一)

CSS真题合集&#xff08;一&#xff09; 1. 盒子模型1.1 盒子模型的基本组成1.2 盒子模型的实际大小1.3 盒子模型的两种类型1.4 设置盒子模型1.5 弹性盒子模型 2. BFC2.1 主要用途2.2 触发BFC的方法2.2 解决外边距的塌陷问题&#xff08;垂直塌陷&#xff09; 3. 响应式布局3.1…

接口自动化框架封装思想建立(全)

httprunner框架&#xff08;上&#xff09; 一、什么是Httprunner&#xff1f; 1.httprunner是一个面向http协议的通用测试框架&#xff0c;以前比较流行的是2.X版本。 2.他的思想是只需要维护yaml/json文件就可以实现接口自动化测试&#xff0c;性能测试&#xff0c;线上监…

spring aop小记

一、aop概念 面向切面编程 参考&#xff1a;https://blog.csdn.net/lhj520cb/article/details/125820513 常用术语解释&#xff08;根据代码理解的&#xff09;&#xff1a; Aspect(切面)&#xff1a;Advice 通知(即增强)和 Pointcut 切点的结合。&#xff08;数学上可以理…

【Android面试八股文】Java异常机制中,异常Exception与错误Error区别是什么?

Java异常机制中,异常Exception与错误Error区别是什么? 这道题想考察什么? 在开发时需要时候需要自定义异常时,应该选择定义Excption还是Error? 编写的代码触发Excption或者Error分别代表什么? 考察的知识点 Java异常机制 考生应该如何回答 在Java中存在一个 Throwa…

Git - 详解 创建一个新仓库 / 推送现有文件夹 / 推送现有的 Git 仓库 到私有Gitlab

文章目录 【推送现有文件夹】详细步骤指令说明Git 全局设置设置Git全局用户名设置Git全局电子邮件地址 推送现有文件夹1. 进入现有文件夹2. 初始化Git仓库并设置初始分支为main3. 添加远程仓库4. 添加所有文件到暂存区5. 提交更改6. 推送代码到远程仓库并设置上游分支 创建一个…

ESXi内安装OpenWrt

目录 0、前言 1、环境 2、转换格式 3、创建虚拟机 4、OpenWrt设置 5、单臂流量测试 6、总结 0、前言 前几天在ESXi中先安装了PVE,然后在PVE中安装OpenWrt,没有来得及深入测试,仅仅作为安装和熟悉PVE的过程。后来转念一想为什么不在ES…

CS1061 “HtmlHelper”未包含“Partial”的定义,并且找不到可接受第一个“HtmlHelper”类型参数的可访问扩展方法“Partial”

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS1061 “HtmlHelper”未包含“Partial”的定义&#xff0c;并且找不到可接受第一个“HtmlHelper”类型参数的可访问扩展方法“Partial”(是否缺少 using 指令或程序集引用?) 14_Views_Message_E…

找嵌入式软件工作,freertos要掌握到什么程度?

对于嵌入式软件工程师来说&#xff0c;掌握RTOS&#xff08;实时操作系统&#xff09;的程度并不是决定性因素&#xff0c;而更重要的是工程思维和解决问题的能力。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式…

Angular封装高德地图组件实现输入框搜索,地图点击选地点

Angular封装高德地图组件实现输入框搜索,地图点击选地点(Angular17版本) 话不多说直接上代码 创建一个独立组件 html代码: <div style"position: relative;"><input #searchInput nz-input placeholder"请输入地址"/><div #mapContaine…

力扣 48.旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],…

CLion配置

下载环境&#xff1a;MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 解压后找一个位置存放&#xff0c;一般放在和ide同一目录&#xff0c;方便查找 个人习惯配置调整&#xff1a; 项目创建 修改ide解码形式 项目右下角一般默认是utf8 文件编码改…

VS2019 QT无法打开 源 文件 “QTcpSocket“

VS2019 QT无法打开 源 文件 "QTcpSocket" QT5.15.2_msvc2019_64 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E1696 无法打开 源 文件 "QTcpSocket" auto_pack_line_demo D:\vs_qt_project\auto_pack_line_de…

【区块链】truffle测试

配置区块链网络 启动Ganache软件 使用VScode打开项目的wordspace 配置对外访问的RPC接口为7545&#xff0c;配置项目的truffle-config.js实现与新建Workspace的连接。 创建项目 创建一个新的目录 mkdir MetaCoin cd MetaCoin下载metacoin盒子 truffle unbox metacoincontra…

如何减少Apache Spark日志的数量

修改log4j配置文件&#xff0c;没有就创建&#xff1a; 内容&#xff1a; # 设置日志记录器 log4j.rootCategoryWARN, console log4j.appender.consoleorg.apache.log4j.ConsoleAppender log4j.appender.console.targetSystem.err log4j.appender.console.layoutorg.apache.lo…

【栈】1096. 花括号展开 II

本文涉及知识点 栈 LeetCode 1096. 花括号展开 II 如果你熟悉 Shell 编程&#xff0c;那么一定了解过花括号展开&#xff0c;它可以用来生成任意字符串。 花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串&#xff0c;定义下面几条语法规则&…

Python | Leetcode Python题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; class Solution:def candy(self, ratings: List[int]) -> int:n len(ratings)ret 1inc, dec, pre 1, 0, 1for i in range(1, n):if ratings[i] > ratings[i - 1]:dec 0pre (1 if ratings[i] ratings[i - 1] else pre 1)ret p…