You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绘制多组数据集的前后抗体滴度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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:10:58