如何在R语言中探究疾病状态的变化趋势?
嘿,针对你这个包含患者疾病状态和细菌丰度的数据集,要探究疾病状态的变化趋势,咱们可以从数据整理、模式探索、统计检验到可视化一步步来,用R的tidyverse生态就能搞定,具体步骤如下:
第一步:数据导入与预处理
首先得把数据加载到R里,先整理成规范的数据集格式。如果你的数据是CSV文件就用read_csv(),如果是手动输入的可以用tribble()快速构建:
# 加载核心工具包 library(tidyverse) # 构建示例数据集(把你剩下的患者数据补充进去就行) df <- tribble( ~Patient, ~DiseaseActivity, ~Bacteria, 15, "Severe", 0.6704, 15, "Quiescent", 0.0350, 24, "Quiescent", 0.0137, 24, "Quiescent", 0.0088, 26, "Quiescent", 0.0023, 26, "Severe", 0.0410, 33, "Quiescent", 0.2031, 33, "Quiescent", 0.0893, 37, "Quiescent", 0.0345, 37, "Quiescent", 0.0031, 52, "Quiescent", 0.0601, 52, "Severe", 0.0200, 53, "Severe", 0.0050, 53, "Severe", 0.2724, 69, "Severe", 0.9369, 69, "Quiescent", 0.0008, 2, "Severe", 0.0421, 2, "Quiescent", 0.0100 # 假设这里补充缺失的数值 ) # 先检查每个患者的状态分布,看看哪些患者有状态转换,哪些一直是单一状态 df %>% count(Patient, DiseaseActivity) %>% print(n = Inf)
第二步:识别疾病状态变化模式
接下来咱们可以给每个患者标记状态类型——是一直保持单一状态,还是出现了状态转换(从Quiescent到Severe或反过来):
patient_status_summary <- df %>% group_by(Patient) %>% summarise( unique_state_count = n_distinct(DiseaseActivity), status_category = case_when( unique_state_count == 1 ~ "持续单一状态", unique_state_count == 2 ~ "存在状态转换" ) ) # 统计两类患者的数量 patient_status_summary %>% count(status_category)
这一步能帮你快速定位核心分析对象:那些有状态转换的患者,是探究变化趋势的关键。
第三步:结合细菌丰度分析状态变化关联
对于有状态转换的患者,咱们可以对比两种状态下的细菌丰度差异(注意同一状态下有多条记录的患者,先计算均值/中位数避免重复统计):
# 筛选出有状态转换的患者,计算每种状态下的平均细菌丰度 transition_patient_data <- df %>% inner_join(patient_status_summary %>% filter(status_category == "存在状态转换"), by = "Patient") %>% group_by(Patient, DiseaseActivity) %>% summarise(avg_bacteria = mean(Bacteria), .groups = "drop") %>% pivot_wider(names_from = DiseaseActivity, values_from = avg_bacteria) # 计算每个患者两种状态下的细菌丰度差值 transition_patient_data %>% mutate(bacteria_diff = Severe - Quiescent) %>% print(n = Inf)
通过这个差值,你能直观看到每个患者状态变化时细菌丰度的升降趋势。
第四步:统计检验验证趋势显著性
如果想确认两种状态下的细菌丰度差异是否具有统计学意义,因为是同一患者的配对数据,用配对t检验最合适:
# 把数据转换为配对检验需要的长格式 paired_test_data <- transition_patient_data %>% pivot_longer(cols = c(Severe, Quiescent), names_to = "DiseaseActivity", values_to = "avg_bacteria") # 执行配对t检验 t_test_result <- t.test(avg_bacteria ~ DiseaseActivity, data = paired_test_data, paired = TRUE) print(t_test_result)
看输出里的p值,如果p<0.05就说明两种状态下的细菌丰度差异显著。
第五步:可视化展示变化趋势
最后用图表把趋势直观呈现出来,比如箱线图看整体分布,折线图看单个患者的变化:
# 箱线图:对比两种状态下细菌丰度的整体分布 ggplot(df, aes(x = DiseaseActivity, y = Bacteria)) + geom_boxplot(fill = "#4292c6", alpha = 0.7) + geom_jitter(width = 0.2, alpha = 0.5, color = "#2171b5") + labs( title = "不同疾病活动状态下的细菌丰度分布", x = "疾病活动状态", y = "细菌丰度" ) + theme_minimal() # 折线图:展示有状态转换患者的细菌丰度变化 ggplot(paired_test_data, aes(x = DiseaseActivity, y = avg_bacteria, group = Patient, color = as.factor(Patient))) + geom_line(linewidth = 1) + geom_point(size = 2) + labs( title = "患者疾病状态转换时的细菌丰度变化", x = "疾病活动状态", y = "平均细菌丰度", color = "患者ID" ) + theme_minimal()
如果你的数据集里有时间序列信息(比如每个记录的采样时间),还可以进一步用折线图按时间顺序展示每个患者的状态和细菌丰度变化,这样趋势会更清晰~
内容的提问来源于stack exchange,提问作者Lothlorian




