本文将详细介绍如何使用R语言对分类资料进行统计分析,包括数据导入与准备、描述性统计、组间比较以及异质性判断等内容。通过本教程,您将掌握使用R进行分类数据分析的基本方法和技巧。
目录
环境准备
数据导入与准备
描述性统计分析
频数与百分比
交叉表
组间比较
卡方检验
Fisher精确检验
列联表分析
异质性判断
Cochran-Mantel-Haenszel检验
数据可视化
实例演示
总结
环境准备
首先,确保您的计算机上已安装R和RStudio(推荐使用RStudio作为R的集成开发环境)。如果尚未安装,可以从以下链接下载:
R下载地址
RStudio下载地址
安装完成后,启动RStudio并安装所需的R包。
# 安装必要的包
install.packages(c("tidyverse", "gmodels", "vcd", "DescTools"))
加载所需的包:
library(tidyverse) # 数据处理与可视化
library(gmodels) # 交叉表分析
library(vcd) # 统计图表
library(DescTools) # 描述性统计与检验
数据导入与准备
假设我们有一份关于不同治疗方法(治疗A和治疗B)对疾病治愈情况(治愈和未治愈)的数据。数据存储在一个CSV文件中,格式如下:
治疗方法 | 治愈情况 |
---|---|
A | 治愈 |
B | 未治愈 |
A | 治愈 |
... | ... |
将数据导入R:
# 设置工作目录(根据实际情况修改路径)
setwd("C:/path/to/your/data")
# 读取CSV文件
data <- read.csv("treatment_data.csv", stringsAsFactors = TRUE)
# 查看数据结构
str(data)
确保分类变量被正确识别为因子(factor)类型:
# 转换为因子类型
data$治疗方法 <- as.factor(data$治疗方法)
data$治愈情况 <- as.factor(data$治愈情况)
# 检查因子水平
levels(data$治疗方法)
levels(data$治愈情况)
描述性统计分析
频数与百分比
首先,对单个分类变量进行频数和百分比的计算。
# 治疗方法的频数与百分比
table(data$治疗方法)
prop.table(table(data$治疗方法)) * 100
# 治愈情况的频数与百分比
table(data$治愈情况)
prop.table(table(data$治愈情况)) * 100
使用summary
函数获取更全面的描述:
summary(data)
交叉表
分析两个分类变量之间的关系,可以使用交叉表(contingency table)。
# 创建交叉表
cross_tab <- table(data$治疗方法, data$治愈情况)
print(cross_tab)
使用gmodels
包的CrossTable
函数,可以获得更详细的交叉表信息。
CrossTable(data$治疗方法, data$治愈情况, chisq = TRUE, format = "SPSS")
组间比较
在分类数据中,常见的组间比较方法包括卡方检验和Fisher精确检验。
卡方检验
卡方检验用于检验两个分类变量是否独立。
# 卡方检验
chisq_test <- chisq.test(cross_tab)
print(chisq_test)
检验结果包括卡方统计量、自由度和p值。如果p值小于显著性水平(如0.05),则拒绝原假设,认为两个变量之间存在显著关联。
Fisher精确检验
当样本量较小或某些单元格的期望频数小于5时,使用Fisher精确检验。
# Fisher精确检验
fisher_test <- fisher.test(cross_tab)
print(fisher_test)
列联表分析
分析列联表的结构和关联程度,可以使用vcd
包中的函数。
# 列联表图
assoc(cross_tab, shade = TRUE, legend = TRUE)
# 堆积条形图
mosaic(cross_tab, shade = TRUE, legend = TRUE)
异质性判断
异质性判断用于检验不同层次的变量是否具有一致的效应。常用的方法包括Cochran-Mantel-Haenszel检验。
假设我们有一个额外的分层变量,例如年龄组(年轻和老年),并希望检验治疗方法与治愈情况之间的关联是否在不同年龄组中一致。
Cochran-Mantel-Haenszel检验
# 示例数据,假设增加一个年龄组变量
# 数据格式示例
# | 治疗方法 | 治愈情况 | 年龄组 |
# |----------|----------|--------|
# | A | 治愈 | 年轻 |
# | B | 未治愈 | 老年 |
# | ... | ... | ... |
# 假设数据中已有年龄组变量
# 转换为因子
data$年龄组 <- as.factor(data$年龄组)
# 创建分层的列联表
library(stats) # 确保加载stats包
# 使用mantelhaen.test进行CMH检验
cmh_test <- mantelhaen.test(table(data$年龄组, data$治疗方法, data$治愈情况))
print(cmh_test)
如果p值小于显著性水平,则认为在不同年龄组中治疗方法与治愈情况的关联具有统计学显著性的一致性或差异。
数据可视化
可视化可以帮助更直观地理解分类数据之间的关系。
条形图
# 治疗方法与治愈情况的条形图
ggplot(data, aes(x = 治疗方法, fill = 治愈情况)) +
geom_bar(position = "dodge") +
labs(title = "治疗方法与治愈情况的关系", x = "治疗方法", y = "频数") +
theme_minimal()
堆积条形图
# 堆积条形图
ggplot(data, aes(x = 治疗方法, fill = 治愈情况)) +
geom_bar(position = "stack") +
labs(title = "治疗方法与治愈情况的堆积图", x = "治疗方法", y = "频数") +
theme_minimal()
马赛克图
使用vcd
包绘制马赛克图:
# 马赛克图
mosaic(~ 治疗方法 + 治愈情况, data = data, shade = TRUE, legend = TRUE)
实例演示
下面通过一个具体的例子,综合应用上述方法。
示例数据
假设我们有一份数据,记录了100名患者接受两种不同治疗方法(A和B)的治愈情况,以及他们的年龄组(年轻和老年)。
# 生成示例数据
set.seed(123) # 设置种子以便结果可复现
n <- 100
data <- data.frame(
治疗方法 = sample(c("A", "B"), n, replace = TRUE),
年龄组 = sample(c("年轻", "老年"), n, replace = TRUE)
)
# 假设治愈率受治疗方法和年龄组影响
data$治愈情况 <- with(data, ifelse(
治疗方法 == "A" & 年龄组 == "年轻", "治愈",
ifelse(治疗方法 == "A" & 年龄组 == "老年", "未治愈",
ifelse(治疗方法 == "B" & 年龄组 == "年轻", "未治愈", "治愈"))
))
data$治愈情况 <- as.factor(data$治愈情况)
# 查看前几行数据
head(data)
描述性统计
# 频数表
table(data$治疗方法)
prop.table(table(data$治疗方法)) * 100
table(data$治愈情况)
prop.table(table(data$治愈情况)) * 100
# 交叉表
cross_tab <- table(data$治疗方法, data$治愈情况)
print(cross_tab)
# 使用CrossTable
CrossTable(data$治疗方法, data$治愉情况, chisq = TRUE, format = "SPSS")
组间比较
# 卡方检验
chisq_test <- chisq.test(cross_tab)
print(chisq_test)
# Fisher精确检验
fisher_test <- fisher.test(cross_tab)
print(fisher_test)
异质性判断
# Cochran-Mantel-Haenszel检验
cmh_test <- mantelhaen.test(table(data$年龄组, data$治疗方法, data$治愈情况))
print(cmh_test)
数据可视化
# 条形图
ggplot(data, aes(x = 治疗方法, fill = 治愈情况)) +
geom_bar(position = "dodge") +
labs(title = "治疗方法与治愈情况的关系", x = "治疗方法", y = "频数") +
theme_minimal()
# 马赛克图
mosaic(~ 治疗方法 + 治愈情况, data = data, shade = TRUE, legend = TRUE)
总结
本教程介绍了使用R语言进行分类资料统计分析的基本流程,包括数据导入与准备、描述性统计、组间比较以及异质性判断。通过具体的R代码示例,您可以轻松地应用这些方法分析自己的分类数据。此外,数据可视化部分帮助您更直观地理解数据之间的关系。希望本教程对您的数据分析工作有所帮助!