如何绘制多组数据集的前后抗体滴度GMT及95%置信区间?
解决抗体滴度GMT及95%置信区间绘图问题
1. 数据预处理:将滴度字符串转为数值
当前d0、d28列是带格式的字符串(如1:20),无法直接用于计算,需先转换为数值:
# 加载必要工具包 library(tidyverse) # 原始数据集 data <- tibble( id = 1:6, d0 = c("1:20", "1:320", "1:40", "1:2560", "1:80", "0"), d28 = c("1:640", "1:320", "1:2560", "1:5120", "1:1250", "1:320"), group = c("A", "B", "C", "A", "B", "C") ) # 定义滴度转换函数:处理1:xx格式和0值 convert_titer <- function(x) { case_when( x == "0" ~ NA_real_, # 0值转为NA,可根据需求调整为0 str_detect(x, "^1:") ~ as.numeric(str_remove(x, "^1:")) ) } # 转换d0和d28列 data_clean <- data %>% mutate( d0 = convert_titer(d0), d28 = convert_titer(d28) )
2. 分组计算GMT及95%置信区间
不能直接在ggplot的映射中调用gm_mean,需先按分组和时间点完成统计:
# 复用你提供的几何均值计算函数 gm_mean = function(x, na.rm=TRUE, zero.propagate = FALSE){ if(any(x < 0, na.rm = TRUE)){ return(NaN) } if(zero.propagate){ if(any(x == 0, na.rm = TRUE)){ return(0) } exp(mean(log(x), na.rm = na.rm)) } else { exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x)) } } # 定义95%置信区间计算函数(基于对数转换) gm_ci <- function(x, na.rm=TRUE) { log_x <- log(x[x > 0], na.rm=na.rm) se <- sd(log_x, na.rm=na.rm) / sqrt(length(log_x)) ci_log <- mean(log_x, na.rm=na.rm) + c(-1, 1) * qnorm(0.975) * se exp(ci_log) } # 转换为长格式并分组统计 stats_data <- data_clean %>% pivot_longer(cols = c(d0, d28), names_to = "time_point", values_to = "titer") %>% group_by(group, time_point) %>% summarise( gmt = gm_mean(titer), ci_low = gm_ci(titer)[1], ci_high = gm_ci(titer)[2], .groups = "drop" )
3. 绘制GMT及置信区间图
用geom_pointrange展示均值与置信区间,同时区分给药前后时间点:
ggplot(stats_data, aes(x = group, y = gmt, color = time_point)) + geom_pointrange(aes(ymin = ci_low, ymax = ci_high), position = position_dodge(width = 0.5)) + scale_y_log10() + # 抗体滴度适合用对数坐标轴,更符合数据分布 labs( x = "分组", y = "抗体滴度几何均值(GMT)", color = "时间点", title = "各组给药前/后抗体滴度GMT及95%置信区间" ) + theme_bw() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
原代码问题分析
- 数据格式错误:
d0/d28是字符串类型,无法直接计算gm_mean,导致y轴数据无效; - 绘图逻辑错误:ggplot映射中直接调用聚合函数
gm_mean不会按分组计算,只会生成单一值,无法形成分组图表; - 坐标轴设置错误:
scale_y_continuous(limits=c(0,1))将y轴限制在0-1区间,但GMT滴度值(如20、320)远超出该范围,因此显示空图。
内容的提问来源于stack exchange,提问作者Sandra R
相关产品推荐
相关产品推荐

