如何在R语言中对分组数据集执行三类chi²(卡方)检验?
卡方检验实现方案
首先处理数据中的缺失值,卡方检验无法直接处理NA,因此所有检验前都会过滤掉对应位置的缺失值。另外,全为NA的列(如option2c、option3a等)不具备检验意义,会自动跳过。
步骤1:同编号数据集的卡方检验(如option1a vs option1b)
通过正则提取编号分组(如option1、option2),对每组内的非全NA列构建列联表,执行卡方独立性检验:
# 提取编号分组(更稳健的正则匹配) id_groups <- split(colnames(data), sub("(option\\d+).*", "\\1", colnames(data))) # 遍历每个编号组 lapply(id_groups, function(group_cols) { # 过滤全NA的列 valid_cols <- group_cols[sapply(data[group_cols], function(col) !all(is.na(col)))] if(length(valid_cols) < 2) { cat("编号组", unique(sub("(option\\d+).*", "\\1", valid_cols)), "有效列不足2个,跳过检验\n") return(NULL) } # 提取数据并过滤NA(仅保留所有列都非NA的行) paired_data <- na.omit(data[valid_cols]) if(nrow(paired_data) == 0) { cat("编号组", unique(sub("(option\\d+).*", "\\1", valid_cols)), "无有效配对数据,跳过检验\n") return(NULL) } # 构建列联表并执行卡方检验 contingency_table <- table(paired_data) chisq_result <- chisq.test(contingency_table) return(chisq_result) })
步骤2:同字母后缀数据集的卡方检验(如option1a、option2a...)
提取字母后缀分组(如a、b、c),对每组内的非全NA列合并为频数矩阵,执行卡方独立性检验(检验不同编号的同后缀列分布是否一致):
# 提取后缀分组 suffix_groups <- split(colnames(data), sub("option\\d+(.)", "\\1", colnames(data))) # 遍历每个后缀组 lapply(suffix_groups, function(group_cols) { # 过滤全NA的列 valid_cols <- group_cols[sapply(data[group_cols], function(col) !all(is.na(col)))] if(length(valid_cols) < 2) { cat("后缀组", unique(sub("option\\d+(.)", "\\1", valid_cols)), "有效列不足2个,跳过检验\n") return(NULL) } # 提取各列的频数(仅统计非NA值) freq_list <- lapply(data[valid_cols], function(col) table(factor(col, levels = c(1,3,5)))) # 合并为频数矩阵 freq_matrix <- do.call(cbind, freq_list) colnames(freq_matrix) <- valid_cols # 执行卡方检验 chisq_result <- chisq.test(freq_matrix) return(chisq_result) })
步骤3:单个列内部的卡方拟合优度检验
检验单列数据的分布是否符合预期(示例假设1、3、5出现的概率相等,可根据需求修改预期概率):
# 遍历所有列 lapply(colnames(data), function(col) { col_data <- na.omit(data[[col]]) if(length(col_data) == 0) { cat("列", col, "无有效数据,跳过检验\n") return(NULL) } # 观测频数 obs_freq <- table(factor(col_data, levels = c(1,3,5))) # 预期概率(示例:均匀分布) exp_prob <- c(1/3, 1/3, 1/3) # 执行拟合优度卡方检验 chisq_result <- chisq.test(obs_freq, p = exp_prob) return(chisq_result) })
内容的提问来源于stack exchange,提问作者timtams
相关产品推荐
相关产品推荐

