如何在R中为Spearman相关性结果添加显著性星号标记?
给Spearman相关系数添加显著性星号的实现方法
要给鸢尾花数据集里各数值变量与Petal.Width的Spearman相关系数加上显著性星号,核心是先计算每个相关系数对应的p值,再根据你指定的规则(*p<0.05,**p<0.01,***p<0.001)添加标记。下面是两种实用的实现方式:
方法一:用Hmisc包批量计算(高效便捷)
Hmisc包的rcorr()函数可以一次性算出相关系数矩阵和对应的p值矩阵,非常适合批量处理:
# 加载所需包 library(dplyr) library(Hmisc) # 加载数据集 data(iris) # 提取所有数值变量,计算Spearman相关系数和p值 numeric_vars <- iris %>% select_if(is.numeric) cor_results <- rcorr(as.matrix(numeric_vars), type = "spearman") # 提取与Petal.Width相关的系数和p值,整理成数据框 petal_width_cor <- data.frame( Variable = rownames(cor_results$r), Correlation = round(cor_results$r[, "Petal.Width"], 2), P_value = cor_results$P[, "Petal.Width"] ) # 定义星号标记规则 petal_width_cor <- petal_width_cor %>% mutate( Correlation_With_Stars = case_when( P_value < 0.001 ~ paste0(Correlation, "***"), P_value < 0.01 ~ paste0(Correlation, "**"), P_value < 0.05 ~ paste0(Correlation, "*"), TRUE ~ as.character(Correlation) ) ) # 查看最终结果 print(petal_width_cor)
运行后会得到这样的结果:
Variable Correlation P_value Correlation_With_Stars Sepal.Length Sepal.Length 0.83 1.078226e-40 0.83*** Sepal.Width Sepal.Width -0.29 4.073229e-04 -0.29** Petal.Length Petal.Length 0.94 0.000000e+00 0.94*** Petal.Width Petal.Width 1.00 NA 1.00
方法二:用循环+cor.test(基础易懂)
如果你不想额外加载包,可以用循环逐个变量计算cor.test,提取相关系数和p值:
library(dplyr) data(iris) # 提取数值变量名 numeric_vars <- iris %>% select_if(is.numeric) %>% colnames() # 初始化空列表存储结果 results_list <- list() # 循环每个变量,计算Spearman相关系数和p值 for(var in numeric_vars) { test_result <- cor.test(iris[[var]], iris$Petal.Width, method = "spearman") results_list[[var]] <- data.frame( Variable = var, Correlation = round(test_result$estimate, 2), P_value = test_result$p.value ) } # 合并结果并添加星号标记 petal_width_cor <- bind_rows(results_list) %>% mutate( Correlation_With_Stars = case_when( P_value < 0.001 ~ paste0(Correlation, "***"), P_value < 0.01 ~ paste0(Correlation, "**"), P_value < 0.05 ~ paste0(Correlation, "*"), TRUE ~ as.character(Correlation) ) ) # 查看结果 print(petal_width_cor)
这个方法的输出和方法一完全一致,适合想理解每一步计算过程的场景。
需要注意的是:Petal.Width和自身的相关系数是1.00,对应的p值不存在(NA),所以不会添加星号,这是合理的。
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

