分类变量水平分栏时的柱状图绘制及组间p值计算问询
问题1:绘制含百分比的柱状图
首先修正数据集的拼写错误(原代码中grou3应为group3),再将宽格式数据转换为长格式,计算每个Age水平下各组的占比,最后用ggplot2绘制带百分比标签的柱状图:
# 修正并创建数据集 Age <- c(1, 2, 3, 4) group1 <- c(22, 23, 24, 44) group2 <- c(34, 35, 36, 66) group3 <- c(44, 55, 66, 67) A <- data.frame(Age, group1, group2, group3) # 加载tidyverse工具包(包含dplyr和ggplot2) library(tidyverse) # 转换为长格式并计算每个Age下的组占比 A_long <- A %>% pivot_longer(cols = starts_with("group"), names_to = "Group", values_to = "Count") %>% group_by(Age) %>% mutate(Percentage = Count / sum(Count) * 100) %>% ungroup() # 绘制柱状图 ggplot(A_long, aes(x = factor(Age), y = Percentage, fill = Group)) + geom_col(position = "dodge") + # 分组并排柱状图 geom_text( aes(label = sprintf("%.1f%%", Percentage)), position = position_dodge(width = 0.9), vjust = -0.5 # 标签在柱子上方 ) + labs(x = "Age水平", y = "百分比", title = "各Age水平下各组占比") + theme_minimal()
说明:代码先将宽格式数据转为ggplot易处理的长格式,计算每个Age水平下各组数值占该Age总和的百分比,最终生成带百分比标签的分组柱状图,标签保留1位小数。
问题2:组间比较的p值计算
根据你给出的示例,分两种常见场景处理:
场景1:比较三个组的组内Age占比分布差异
即把每个组的数值转换为该组内的Age占比(比如group1中22/(22+23+24+44)*100),再比较三个组的占比分布是否有显著差异:
# 计算每个组内各Age的占比 A_group_pct <- A %>% mutate( across( starts_with("group"), ~ .x / sum(.x) * 100, .names = "{col}_pct" # 新列名加_pct后缀 ) ) %>% select(Age, ends_with("_pct")) # 转换为长格式用于统计检验 A_group_pct_long <- A_group_pct %>% pivot_longer( cols = ends_with("_pct"), names_to = "Group", values_to = "Percentage" ) %>% mutate(Group = str_remove(Group, "_pct")) # 去掉_pct后缀 # 单因素方差分析(比较三组占比的整体差异) anova_result <- aov(Percentage ~ Group, data = A_group_pct_long) summary(anova_result) # 若方差分析显著,用TukeyHSD做两两比较 TukeyHSD(anova_result)
说明:方差分析结果中,Pr(>F)即为组间整体差异的p值;若该p值小于0.05,说明三组占比分布存在显著差异,此时用TukeyHSD可得到两两组之间的比较p值。
场景2:针对每个Age水平,比较三个组的数值差异
即对每个Age(比如Age=1时的22、34、44),单独计算三个组之间的差异p值:
# 转换为长格式 A_long <- A %>% pivot_longer(cols = starts_with("group"), names_to = "Group", values_to = "Count") # 按Age分组,计算每个Age下的组间比较p值 age_p_values <- A_long %>% group_by(Age) %>% summarize( p_value = summary(aov(Count ~ Group, data = cur_data()))[[1]][["Pr(>F)"]][1], .groups = "drop" ) # 查看结果 age_p_values
说明:这段代码会输出每个Age对应的组间方差分析p值,可直接看到每个Age水平下三组数值是否存在显著差异。
内容的提问来源于stack exchange,提问作者ElR
相关产品推荐
相关产品推荐

