一文搞懂相关性分析!分类变量与连续变量之间

等级变量与连续变量之间的相关性分析的概念:

等级变量与连续变量相关性分析是指研究和量化等级变量连续变量之间关系的方法。其目的是探讨一个有序类别变量(等级变量)如何与一个连续变量相关,或者等级变量不同水平是否对连续变量产生显著影响。

1. 等级变量与连续变量的定义

a. 等级变量(Ordinal Variable)

等级变量是一种分类变量,其类别之间有明确的顺序关系,但各类别之间的距离不一定相等。例如:

  • 教育程度(小学、中学、大学、研究生)
  • 满意度(非常不满意、不满意、一般、满意、非常满意)
  • 健康评分(差、一般、好、非常好)
b. 连续变量(Continuous Variable)

连续变量可以在某一范围内取任意值,具有大小和顺序,且可以量化差距。例如:

  • 体重、身高、收入、血压
  • 考试分数、温度、年龄

2. 等级变量与连续变量相关性分析的意义

通过等级变量与连续变量相关性分析,可以回答以下问题:

  • 等级变量的顺序变化是否会引起连续变量的显著变化。
  • 连续变量是否随着等级变量的增加呈现某种趋势,如正相关、负相关或无相关。

这种分析广泛应用于社会科学、市场分析、医学研究等领域。例如:

  • 分析教育水平(等级变量)是否影响收入(连续变量)。
  • 探讨健康评分(等级变量)与体重指数(BMI,连续变量)之间的关系。


代码:

第一部分:加载所需包

library(ggplot2)
library(dplyr)
library(tidyr)
library(gridExtra)
library(openxlsx)
library(readxl)
library(MASS)
library(VGAM)
library(polycor)
library(DescTools)
library(Kendall)
library(boot)
  • 主要功能:
    • 数据处理:dplyrtidyr
    • 数据输入输出:openxlsxreadxl
    • 统计分析:KendallbootDescToolspolycor 等。
    • 这些包为数据清理、相关性计算和结果保存提供了全面支持。

第二部分:数据导入与检查

mydata <- read.xlsx("combined_data【含sort】.xlsx")
cat("数据结构检查:\n")
str(mydata)
  1. 读取数据:

    • read.xlsx("combined_data【含sort】.xlsx"):从 Excel 文件中加载数据。
    • 文件名为 combined_data【含sort】.xlsx,包含用于分析的各类数据。
  2. 结构检查:

    • str(mydata):输出数据框的结构,检查变量类型和数据完整性。

第三部分:数据转换

mydata <- mydata %>%
  mutate(
    across(c(gpt, system, query), ~ factor(.x, ordered = TRUE)),
    sort_new = factor(
      sort,
      labels = c("10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%"),
      ordered = TRUE
    )
  )
cat("转换后数据结构:\n")
str(mydata)
  1. 转换变量为因子:

    • 使用 mutateacrossgptsystemquery 转为有序因子。
    • sort_new 列重命名并设为有序因子,代表比例值。
  2. 再次检查数据结构:

    • str(mydata):确认转换后的变量类型是否符合预期。

第四部分:定义计算 Kendall's Tau 的函数

calculate_kendall <- function(var1, var2, data) {
  # 数据检查
  if (nrow(data) < 3) {
    stop("数据行数不足,无法计算 Kendall's Tau")
  }
  if (any(is.na(data[[var1]])) || any(is.na(data[[var2]]))) {
    stop("数据中存在 NA 值,请清理数据")
  }
  
  # 计算 Kendall's Tau-b 和显著性
  kendall_result <- Kendall(data[[var1]], data[[var2]])
  
  # 自举法计算置信区间
  boot_kendall <- function(data, indices) {
    d <- data[indices, ]
    Kendall(d[[var1]], d[[var2]])$tau
  }
  
  set.seed(123)
  boot_result <- boot(data, boot_kendall, R = 1000)
  ci <- boot.ci(boot_result, type = "perc")
  
  ci_lower <- if (!is.null(ci$percent)) ci$percent[4] else NA
  ci_upper <- if (!is.null(ci$percent)) ci$percent[5] else NA
  
  # 返回结果
  data.frame(
    X = var1,
    Y = var2,
    Kendall = kendall_result$tau,
    P值 = kendall_result$sl,
    置信区间下界 = ci_lower,
    置信区间上界 = ci_upper
  )
}
  1. 功能:

    • 针对两列变量,计算 Kendall's Tau 相关系数及其显著性水平。
    • 通过自举法(boot 包)计算 Tau 的置信区间。
  2. 数据检查:

    • 如果数据行数不足或存在 NA 值,会终止执行并给出提示。
  3. 自举法:

    • boot_kendall 是定义的自举函数,通过随机采样计算 Tau。
    • boot.ci 用于提取百分位置信区间。
  4. 返回值:

    • 返回一个数据框,包括相关系数、p 值及置信区间上下界。

第五部分:生成分组组合并计算相关性

group_combinations <- expand.grid(
  gpt = c("gpt3.5", "gpt4"),
  system = c("system1", "system2"),
  query = c("query1", "query2"),
  stringsAsFactors = FALSE
)
  1. 创建分组组合:
    • 使用 expand.grid 生成所有可能的分组组合。
    • 每个分组由 gptsystemquery 定义。
results <- purrr::map_dfr(seq_len(nrow(group_combinations)), function(i) {
  group <- group_combinations[i, ]
  
  mydata_subset <- mydata %>%
    filter(
      gpt == group$gpt,
      system == group$system,
      query == group$query
    )
  
  if (nrow(mydata_subset) >= 3) {
    group_name <- paste(group, collapse = "_")
    
    rbind(
      cbind(所属 = group_name, calculate_kendall("sort_new", "all", mydata_subset)),
      cbind(所属 = group_name, calculate_kendall("sort_new", "average", mydata_subset))
    )
  } else {
    cat("跳过分组:", paste(group, collapse = "_"), "数据不足 3 行\n")
    NULL
  }
})
  1. 遍历分组组合:

    • 对每个分组筛选数据子集(filter)。
    • 如果数据子集行数不足 3,跳过计算。
  2. 计算相关性:

    • 调用 calculate_kendall 计算每个分组的相关系数。
  3. 结果整合:

    • 使用 purrr::map_dfr 将所有结果整合为一个数据框。

第六部分:保存结果

final_results <- bind_rows(results, global_results)
write.xlsx(final_results, "相关性分析.xlsx", rowNames = FALSE)
cat("相关性分析完成,结果已保存为 相关性分析.xlsx\n")
  1. 结果保存:

    • 将计算结果保存为 Excel 文件 相关性分析.xlsx
    • bind_rows 合并结果,write.xlsx 写入文件。
  2. 完成提示:

    • cat 打印提示信息。

总结:

# ------- 加载所需包 -------
library(ggplot2)
library(dplyr)
library(tidyr)
library(gridExtra)
library(openxlsx)
library(readxl)
library(MASS)
library(VGAM)
library(polycor)
library(DescTools)
library(Kendall)
library(boot)

# ------- 数据导入与检查 -------
mydata <- read.xlsx("combined_data【含sort】.xlsx")  # 导入 Excel 数据
cat("数据结构检查:\n")
str(mydata)

# ------- 数据预处理 -------
mydata <- mydata %>%
  mutate(
    across(c(gpt, system, query), ~ factor(.x, ordered = TRUE)),  # 转为有序因子
    sort_new = factor(
      sort,
      labels = c("10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%"),
      ordered = TRUE
    )
  )
cat("转换后数据结构:\n")
str(mydata)

# ------- 定义计算 Kendall's Tau 的函数 -------
calculate_kendall <- function(var1, var2, data) {
  # 数据检查
  if (nrow(data) < 3) {
    stop("数据行数不足,无法计算 Kendall's Tau")
  }
  if (any(is.na(data[[var1]])) || any(is.na(data[[var2]]))) {
    stop("数据中存在 NA 值,请清理数据")
  }
  
  # 计算 Kendall's Tau 和显著性
  kendall_result <- Kendall(data[[var1]], data[[var2]])
  
  # 自举法计算置信区间
  boot_kendall <- function(data, indices) {
    d <- data[indices, ]
    Kendall(d[[var1]], d[[var2]])$tau
  }
  
  set.seed(123)  # 确保结果可重复
  boot_result <- boot(data, boot_kendall, R = 1000)
  ci <- boot.ci(boot_result, type = "perc")
  
  ci_lower <- if (!is.null(ci$percent)) ci$percent[4] else NA
  ci_upper <- if (!is.null(ci$percent)) ci$percent[5] else NA
  
  # 返回结果
  data.frame(
    X = var1,
    Y = var2,
    Kendall = kendall_result$tau,
    P值 = kendall_result$sl,
    置信区间下界 = ci_lower,
    置信区间上界 = ci_upper
  )
}

# ------- 生成分组组合并计算相关性 -------
# 创建所有分组组合
group_combinations <- expand.grid(
  gpt = c("gpt3.5", "gpt4"),
  system = c("system1", "system2"),
  query = c("query1", "query2"),
  stringsAsFactors = FALSE
)

# 遍历每个分组组合
results <- purrr::map_dfr(seq_len(nrow(group_combinations)), function(i) {
  group <- group_combinations[i, ]
  
  # 筛选对应分组的数据
  mydata_subset <- mydata %>%
    filter(
      gpt == group$gpt,
      system == group$system,
      query == group$query
    )
  
  if (nrow(mydata_subset) >= 3) {
    group_name <- paste(group, collapse = "_")
    
    rbind(
      cbind(所属 = group_name, calculate_kendall("sort_new", "all", mydata_subset)),
      cbind(所属 = group_name, calculate_kendall("sort_new", "average", mydata_subset))
    )
  } else {
    cat("跳过分组:", paste(group, collapse = "_"), "数据不足 3 行\n")
    NULL
  }
})

# ------- 保存结果 -------
write.xlsx(results, "相关性分析.xlsx", rowNames = FALSE)  # 保存为 Excel 文件
cat("相关性分析完成,结果已保存为 相关性分析.xlsx\n")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱做科研的桶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值