列联图(交叉分析)的R代码实现

一、简介

交叉分析  Cross-Analysis

适用场景:研究两个或多个分类变量之间的关系。通常使用二维列联表,行列各表示一个分类变量

意义:了解变量之间的相互依赖关系,计算关联度量(如卡方值)检验变量之间的独立性

二、R实现

        练习数据集采用NHANES包的NHANES数据集,这是一个规模较大的示例数据框,主题是个人的健康与营养方面的信息。

library(tidyverse) # Wickham的数据整理的整套工具
library(NHANES); data(NHANES)
dplyr::glimpse(NHANES) #用dplyr查看数据框内行数、列数、变量细节

        数据集有10000条数据,76个变量。部分结果展示:

列联图(交叉分析)的R代码实现_第1张图片

        其中,各个参与者的生存结局日期不同,部分参与者有多个观测值,因此进行数据筛选。

d_nhsub <- NHANES |>
  dplyr::filter(SurveyYr == "2011_12") |>   #筛选其中SurveyYr为2011_12的观测
  group_by(ID) |>    #分组汇总
  slice_tail(n=1) |>   #选择(保留)多个观测中的最后一个
  ungroup()         #去除已分组数据的分组,避免影响下次运算
dim(d_nhsub)

        最终得到了3211条数据。

        本次练习,我们主要考察两个分类变量性别(Gender)和教育程度(Education)之间的关系。

        交叉分析可以用以下代码实现,不同代码有不同结果,可以按需选取

#计算交叉频数分布
d_gened <- d_nhsub |> 
  count(Gender, Education) |>
  group_by(Gender) |> 
  mutate(in_gend_pct = n / sum(n)) |>   #性别内部的学历比例
  ungroup()  
knitr::kable(d_gened)  #输出一个比较好看的数据框

                结果如下:

列联图(交叉分析)的R代码实现_第2张图片

# 输出分类后数据框,但不计算比例
with(d_nhsub, table(
  Education, Gender
))

                结果如下:

列联图(交叉分析)的R代码实现_第3张图片

#直接列联表
with(d_nhsub, gmodels::CrossTable(
  Education, Gender
))

                结果如下:

列联图(交叉分析)的R代码实现_第4张图片

三、使用ggplot作图

        得出的结果我们可以用ggplot做出更美观的可视化结果。

#堆叠条形图
ggplot(d_gened, aes(
  x = Gender, fill = Education, y = n)) +
  geom_col(position = "stack") #垂直

列联图(交叉分析)的R代码实现_第5张图片

#并列条形图,使用百分比比较
ggplot(d_gened, aes(
  x = Gender, fill = Education, y = in_gend_pct)) +
  geom_col(position = "dodge") #并列

列联图(交叉分析)的R代码实现_第6张图片

         或许大家也注意到了两图中灰色的NA值,即数据缺失值,本次我们不进行数据补全,可以使用以下代码去除缺失值。

#不显示缺失值
ggplot(drop_na(d_gened), aes(
  x = Gender, fill = Education, y = in_gend_pct)) +
  geom_col(position = "dodge") +
  labs(y="")   #去除空值NA并删去相应的标签

列联图(交叉分析)的R代码实现_第7张图片

        如有需要,我们也可以把图横过来。

#分两组比较
ggplot(drop_na(d_gened), aes(
  x = Education, y = in_gend_pct)) +
  facet_wrap(~ Gender, ncol=1) +   #按性别分组,成一列
  geom_col() +
  coord_flip() +  #横纵坐标位置转换
  labs(y="")

列联图(交叉分析)的R代码实现_第8张图片

你可能感兴趣的:(r语言,开发语言)