Dunn‘s检验:揭示具有显著统计差异的组中位数(使用R语言)

90 篇文章 ¥59.90 ¥99.00
本文介绍了如何利用R语言的'PMCMRplus'和'rcompanion'包执行Dunn's检验,这是一种非参数方法,用于检测不同组间的中位数差异。通过示例代码和结果解读,阐述了如何根据adj.p-value判断统计显著性,并强调了在解释结果时考虑多重比较和错误发现率的重要性。

Dunn’s检验:揭示具有显著统计差异的组中位数(使用R语言)

概述:
在统计分析中,我们经常需要比较多个组之间的中位数是否存在显著差异。Dunn’s检验是一种非参数方法,用于确定不同组的中位数是否存在统计上显著的差异。本文将介绍如何使用R语言进行Dunn’s检验,并提供相应的源代码示例。

方法:
首先,我们需要安装和加载R中的相关包。在执行以下代码前,请确保已安装"PMCMRplus"和"rcompanion"包。

install.packages("PMCMRplus")
install.packages("rcompanion")

library(PMCMRplus)
library(rcompanion)

接下来,我们使用一个示例数据集来说明Dunn’s检验的用法。假设我们有一个名为data的数据框,其中包含了一个名为group的分组变量和一个名为value的对应数值变量。

data <- data.frame(
  group = c(rep("A", 10), rep("B", 10), rep("C", 10)),
  value = c(rnorm(10, mean = 5), rnorm(10, mean = 8), rnorm(10, mean = 12))
)

接下来,我们可以使用dunnTest()函数执行Dunn’s检验,并使用compare

#导入ImmuCellAI_abundance_result文件 df<-ImmuCellAI_abundance_result library(dplyr) library(viridis) library(ggforce) library(ggsignif) library(scales) library(ggplot2) library(FSA) df <- df[,-27] immune_cols <- colnames(df)[3:ncol(df)] # 免疫细胞列 #创建一个新数据框res_df,有两列:"Cell"存储免疫细胞类型名称,"Kruskal_p"初始化为NA,用于存储p值。 res_df <- data.frame(Cell = immune_cols, Kruskal_p = NA) for (i in seq_along(immune_cols)) { #循环遍历每个免疫细胞类型 cell <- immune_cols[i]#获取当前细胞类型名称 kruskal <- kruskal.test(df[[cell]] ~ df$group)#执行Kruskal-Wallis检验 #分变量是df$group res_df$Kruskal_p[i] <- kruskal$p.value #将p值存储在res_df中对应行 } # FDR 校正 res_df$FDR <- p.adjust(res_df$Kruskal_p, method = "BH")#对p值进行多重比较校正,使用Benjamini-Hochberg方法(BH),控制错误发现率(FDR) #存储校正后的p值(FDR < 0.05 通常视为显著) # 筛选显著细胞类型 significance_level <- 0.05 significant_cells <- res_df %>% filter(FDR <= significance_level) %>% arrange(FDR) # 仅对显著细胞进行Dunn事后检验 df$group <- as.factor(df$group)# 确保group列是因子 #df指的是原始的未经过细胞差异性分析的数据框(即包含所有样本和所有细胞类型的数据) #创建初筛选后显著差异细胞的字符向量 significant_cells1 <- c(significant_cells[,1])#显著细胞类型,字符向量 dunn_results <- list()# 初始化一个空列表用于存储 for(cell in significant_cells1) {#循环遍历significant_cells1向量中的每一个细胞类型名称 # 执行Dunn检验 dunn_test <- dunnTest( x = df[[cell]], g = df$group, method = 'bh' # Benjamini-Hochberg校正 ) # 存储结果 dunn_results[[cell]] <- dunn_test } #整合为数据框 final_df <- lapply(names(dunn_results), function(cell) { res_df <- dunn_results[[cell]]$res res_df$cell_type <- cell return(res_df) }) %>% bind_rows() # 筛选有显著差异的细胞类型 significant_comparisons <- subset(final_df, P.adj < 0.05) #差异性细胞中位线连线图,观察免疫细胞趋势 #数据框准备 df1 <- df[,c(1,2,4,5,7,8,12,15,16,17,18,19,21,24,26)] # 2. 定义分顺序和细胞类型名称 groups <- c("CN", "DM", "DPN") # 必须与数据中的分标签一致 signif_cells1 <- colnames(df1)[3:ncol(df1)] # 替换为13种显著细胞名称 # ====================== 数据处理 ====================== # 转换长格式 long_data <- df1 %>% pivot_longer( cols = all_of(signif_cells1), names_to = "CellType", values_to = "Abundance" ) %>% mutate( Group = factor(group, levels = groups), # 固定分顺序 CellType = factor(CellType, levels = signif_cells1) # 固定细胞顺序 ) # 计算各中位数 median_data <- long_data %>% group_by(Group, CellType) %>% summarise(Median_Abundance = median(Abundance), .groups = "drop") 现在我已经完成了以上代码,怎么做13种细胞的中位线的连线图,能表示趋势
最新发布
10-06
<think> 我们拥有immucellAI获得的免疫细胞丰度数据,现在需要比较不同之间(例如不同疾病、治疗等)的免疫细胞丰度是否存在显著差异。 通常,这样的数据是连续变量(细胞比例或丰度),且可能不满足正态分布,因此非参数检验可能更合适。 我们将使用以下步骤: 1. 数据准备:读取数据,确保数据结构正确(行是样本,列是细胞类型和分信息) 2. 正态性检验(可选)和方差齐性检验(可选)来决定使用参数检验还是非参数检验 3. 根据分情况选择检验方法: - 两比较:Wilcoxon秩和检验(Mann-Whitney U检验) - 多比较:Kruskal-Wallis检验,如果显著则进行事后两两比较(如Dunn检验,并控制多重检验) 4. 结果整理和可视化 注意:由于免疫细胞丰度数据通常是成分数据(总和为100%),但immucellAI输出的应该是每种细胞类型的比例(或绝对分数),我们可以直接进行间比较。 然而,成分数据分析有特殊方法(如ALR/CLR变换后使用参数检验),但这里我们按照常规的差异分析进行,因为目前文献中多数使用非参数检验。 我们假设数据格式如下: 样本ID 分 CD4T CD8T B细胞 NK细胞 ... sample1 Group1 0.25 0.18 0.10 0.05 ... ... 步骤: 1. 读取数据 2. 按分进行循环,对每种细胞类型进行差异检验 由于可能有多种细胞类型,我们需要进行多重检验校正(如FDR校正)。 我们将编写一个函数来处理多比较,并返回校正后的p值。 另外,我们也可以考虑使用线性模型(考虑协变量)或混合效应模型(如果有配对设计等),但这里用户只要求间比较,因此先做简单的间比较。 如果数据是配对样本(例如同一个病人治疗前后),那么需要使用配对检验(如Wilcoxon符号秩检验)。 根据用户提供的信息,我们不知道具体分情况,因此我们将提供两种代码:独立样本和配对样本。 我们首先按照独立样本处理,然后补充配对样本的代码。 此外,我们还可以进行可视化,如箱线图展示。 代码结构: 1. 加载必要的包 2. 读入数据 3. 检查数据结构 4. 定义分列和细胞类型列 5. 对于每种细胞类型: - 进行正态性检验(Shapiro-Wilk检验)和方差齐性检验(Levene检验或Bartlett检验,Bartlett要求正态,Levene不要求) - 根据检验结果选择参数检验(t检验或ANOVA)或非参数检验(Wilcoxon或Kruskal-Wallis) - 但注意:由于细胞比例数据通常不满足正态分布,我们默认使用非参数检验 6. 输出结果表格(包含细胞类型,检验统计量,p值,校正后的p值) 7. 可视化:生成每个细胞类型的箱线图,并在图中标注显著性 我们这里默认使用非参数检验,因为更稳健。 由于用户没有提供具体数据,我们生成一个模拟数据并演示。 假设我们有三:Group1, Group2, Group3,比较每种细胞类型在三间是否有差异。 独立样本非参数多比较:Kruskal-Wallis检验,然后进行Dunn事后检验(并校正p值)。 如果是两,则用Wilcoxon秩和检验。 我们编写一个通用的函数,可以自动判断分数量。 注意:分列必须是因子类型。 我们将使用以下包: - dplyr: 数据处理 - rstatix: 提供易于使用检验函数,并能与管道操作符结合 - ggpubr: 用于统计可视化 如果没有安装,请先安装。 代码示例: 步骤1:安装和加载包 步骤2:读取数据 步骤3:将数据从宽格式转换为长格式(便于循环或分操作) 步骤4:按细胞类型分,然后进行检验 步骤5:校正p值 步骤6:可视化 由于rstatix包提供了很好的管道操作,我们使用它。 注意:rstatix中的函数要求数据是长格式。 例如: ID Group CellType Abundance sample1 Group1 CD4T 0.25 sample1 Group1 CD8T 0.18 ... 但是我们的原始数据可能是宽格式,即每种细胞类型占一列。因此需要转换。 我们将使用tidyr的gather或pivot_longer函数。 下面我们开始编写代码。 </think> 以下是根据 ImmucellAI 输出的免疫细胞丰度数据进行显著差异分析的 R 语言完整代码方案,结合微生物和免疫细胞分析的最佳实践: ### 一、数据预处理与加载 ```r # 加载必要包 library(tidyverse) # 数据处理 library(ggpubr) # 统计可视化 library(rstatix) # 统计检验 library(FSA) # Dunn事后检验 # 读取ImmucellAI输出数据(示例格式) # 列:SampleID | Group | CD4_Tcells | CD8_Tcells | Bcells | NKcells | ... cell_data <- read.csv("immucellAI_results.csv") %>% mutate(Group = factor(Group)) # 确保分为因子 # 查看数据结构 head(cell_data) ``` ### 二、显著差异分析(自动适配数) ```r # 函数:自动选择检验方法 perform_cell_test <- function(data, cell_type) { cell_vector <- data[[cell_type]] # 正态性检验(Shapiro-Wilk) norm_test <- by(cell_vector, data$Group, shapiro.test) norm_pvals <- sapply(norm_test, `[[`, "p.value") # 方差齐性检验(Levene) var_test <- levene_test(data, reformulate("Group", cell_type)) # 根据检验结果选择分析方法 if (all(norm_pvals > 0.05) & var_test$p > 0.05) { # 参数检验:ANOVA或t检验 if (nlevels(data$Group) > 2) { anova_result <- aov(reformulate("Group", cell_type), data) return(list( test = "ANOVA", result = tidy(TukeyHSD(anova_result)), # 事后检验 p.value = summary(anova_result)[[1]]$`Pr(>F)`[1] )) } else { t_result <- t.test(reformulate("Group", cell_type), data) return(list( test = "t-test", result = tidy(t_result), p.value = t_result$p.value )) } } else { # 非参数检验:Kruskal-Wallis或Wilcoxon if (nlevels(data$Group) > 2) { kw_result <- kruskal.test(reformulate("Group", cell_type), data) dunn_result <- dunnTest(cell_vector ~ data$Group, method = "bh") # Benjamini-Hochberg校正 return(list( test = "Kruskal-Wallis", result = dunn_result$res, p.value = kw_result$p.value )) } else { wilcox_result <- wilcox.test(reformulate("Group", cell_type), data) return(list( test = "Wilcoxon", result = tidy(wilcox_result), p.value = wilcox_result$p.value )) } } } # 循环分析所有免疫细胞类型 cell_types <- setdiff(names(cell_data), c("SampleID", "Group")) results_list <- map(cell_types, ~perform_cell_test(cell_data, .x)) %>% set_names(cell_types) # 提取简化结果表格 results_table <- map_dfr(results_list, ~{ tibble( CellType = .y, Test = .x$test, Global.p = .x$p.value, Details = list(.x$result) ) }, .id = "CellType") ``` ### 三、结果可视化 ```r # 1. 整体差异热图 heatmap_plot <- cell_data %>% pivot_longer(cols = -c(SampleID, Group), names_to = "CellType", values_to = "Abundance") %>% group_by(CellType, Group) %>% summarise(MeanAbundance = mean(Abundance)) %>% ggplot(aes(x = Group, y = CellType, fill = MeanAbundance)) + geom_tile(color = "white") + scale_fill_gradientn(colors = viridis::viridis(10)) + labs(title = "免疫细胞丰度热图", x = "", y = "") + theme_minimal() # 2. 显著差异细胞箱线图 signif_cells <- results_table %>% filter(Global.p < 0.05) %>% pull(CellType) boxplot_list <- map(signif_cells, ~{ ggboxplot(cell_data, x = "Group", y = .x, fill = "Group", palette = "jco", add = "jitter") + stat_compare_means(method = ifelse(results_list[[.x]]$test %in% c("t-test", "ANOVA"), "anova", "kruskal")) + labs(title = paste(.x, "丰度差异"), y = "相对丰度") }) # 3. 多比较结果图(示例:CD4_Tcells) if (nlevels(cell_data$Group) > 2) { cd4_plot <- ggboxplot(cell_data, x = "Group", y = "CD4_Tcells", color = "Group", palette = "npg") + stat_pvalue_manual( results_list$CD4_Tcells$result %>% mutate(p.adj = format.pval(p.adj, digits = 2)), label = "p.adj = {p.adj}", y.position = max(cell_data$CD4_Tcells)*1.1 ) } ``` ### 四、结果导出 ```r # 导出统计结果 write_csv(results_table, "immune_cell_stats_results.csv") # 导出可视化图表 ggsave("immune_heatmap.png", heatmap_plot, width = 10, height = 8) walk2(boxplot_list, signif_cells, ~ggsave(paste0(.y, "_boxplot.png"), .x, width = 8, height = 6)) ``` ### 五、生物学解释框架 对于显著结果的解读,建议结合以下生物学背景进行分析: ```r # 1. T细胞亚群分析(参考[2]) t_cell_analysis <- results_table %>% filter(str_detect(CellType, "CD4|CD8|Treg")) %>% arrange(Global.p) # 2. B细胞与浆细胞关联(参考[2][3]) b_cell_cor <- cell_data %>% select(matches("Bcell|Plasma")) %>% cor(method = "spearman") # 3. 免疫抑制微环境指标(参考[3]) immunosuppression_score <- cell_data %>% mutate(ImmunoScore = Tregs + MDSCs - (CD8_Teff + NKcells)) ``` ### 注意事项 1. **数据要求**:确保输入数据为数值型矩阵,分信息正确编码 2. **多重检验校正**:代码已内置Benjamini-Hochberg校正 3. **成分数据问题**:免疫细胞丰度总和恒定,建议添加: ```r library(compositions) clr_transformed <- cell_data %>% select(-SampleID, -Group) %>% clr() # 中心化对数比变换 ``` 4. **高级分析**:如需考虑混杂因素(年龄、性别等),推荐使用: ```r library(lme4) mixed_model <- lmer(CD4_Tcells ~ Group + Age + (1|Batch), data = cell_data) ``` > **关键生物学解读点**: > - CD4+ T细胞亚群变化与自身免疫疾病进展相关[^2] > - B细胞克隆扩增表征慢性炎症状态[^2] > - Treg/MDSC升高提示免疫抑制微环境[^3] > - NK细胞降低与免疫逃逸机制相关[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值