1.5.3 卡方检验与确切概率检验
功能说明
用 huyiba_rawdata 中的两个独立组和二分类结局组成 表。数据框每行一个观察单位,分组、结局均须完整且各有两个实际出现的类别。修改 group_var、outcome_var 和类别顺序;第二列是阳性,第二组相对于第一组。
huyiba_result 返回观察计数、期望频数、组内比例和所选检验对象;Fisher 分支还返回 OR 及区间。结果解读见1.5.3 卡方检验与确切概率检验。
核心R包
| 包名 | 主要用途 | 实际验证版本 |
|---|---|---|
| stats(R 基础包) | Pearson 卡方检验及 Fisher 确切概率检验 | 4.5.2(随 R 4.5.2) |
无需安装额外分析包。
代码
准备符合要求的输入后,修改开头的配置。下载同一份 R 源码。
# 两个独立组的二分类结局:输入 huyiba_rawdata,每行一个观察单位。
group_var <- "group"
outcome_var <- "outcome"
group_levels <- c("reference", "comparison")
outcome_levels <- c("no", "yes") # 第 2 列是阳性;行百分比按各组人数计算。
test_method <- "auto" # "pearson" 固定用卡方;"fisher" 固定用确切检验。
min_expected <- 5 # auto 的 2×2 表经验线:任一格低于此值用 Fisher。
correct <- FALSE # 仅影响卡方;TRUE 加 Yates 连续性校正。
conf_level <- 0.95 # 仅用于 Fisher 的 OR 区间;提高时区间通常更宽。
# 明确类别顺序,避免无效编码被因子转换后静默丢弃。
input_columns <- c(group_var, outcome_var)
if (anyDuplicated(input_columns) || !all(input_columns %in% names(huyiba_rawdata))) {
stop("分组列和结局列必须存在且不同。")
}
huyiba_analysis_data <- huyiba_rawdata[input_columns]
group_values <- as.character(huyiba_analysis_data[[group_var]])
outcome_values <- as.character(huyiba_analysis_data[[outcome_var]])
if (anyNA(huyiba_analysis_data) ||
length(group_levels) != 2L || length(outcome_levels) != 2L ||
!setequal(group_values, group_levels) ||
!setequal(outcome_values, outcome_levels)) {
stop("请提供完整数据;分组和结局必须各有两个实际出现且与配置一致的类别。")
}
observed <- table(
group = factor(group_values, levels = group_levels),
outcome = factor(outcome_values, levels = outcome_levels)
)
expected <- outer(rowSums(observed), colSums(observed)) / sum(observed)
dimnames(expected) <- dimnames(observed)
# 先看期望频数,再按预设方案选择检验;两个分支均为双侧的独立性问题。
test_method <- match.arg(test_method, c("auto", "pearson", "fisher"))
if (test_method == "auto") {
test_method <- if (any(expected < min_expected)) "fisher" else "pearson"
}
test_result <- if (test_method == "pearson") {
stats::chisq.test(observed, correct = correct)
} else {
stats::fisher.test(
observed, alternative = "two.sided", conf.level = conf_level
)
}
# row_proportion 是 0–1 的组内比例;Fisher OR 方向为第 2 组相对第 1 组。
huyiba_result <- list(
observed = observed, expected = expected,
row_proportion = prop.table(observed, margin = 1),
method = test_method, test = test_result
)
print(huyiba_result$observed)
print(huyiba_result$expected)
print(huyiba_result$row_proportion)
print(huyiba_result$test)注意事项
- 按研究设计确认观察单位独立;配对资料需用配对方法。本模板限定为 表。
- 自动分支依据期望频数,不依赖观察频数或 P 值。若方案预先指定方法,应显式选择该方法。
- 比例按行计算;报告时写清阳性列和比较方向。检验未控制其他变量。