# 1.5.1 t检验：比较两个独立组的连续结局均值。
# 输入：已准备好的数据框 huyiba_rawdata；每行一个独立观察单位。

# 1. 修改列名、组别顺序及检验设置。
outcome_var <- "outcome"               # 数值型连续结局；输出沿用该列的单位。
group_var <- "group"                   # 分组列，只能包含下面指定的两个组。
group_levels <- c("control", "treatment")
# 差值方向为第一个组减第二个组；替换为数据中的实际组别取值。
null_difference <- 0                  # 零假设中的总体均值差，与结局同单位。
alternative <- "two.sided"             # 双侧；"greater"/"less"为差值大于/小于mu。
# 单侧方向须由研究问题预先确定，不能看过结果再选择。
conf_level <- 0.95                    # 区间置信水平；如改为0.99，区间通常更宽。
equal_variance <- FALSE               # FALSE为Welch；TRUE需等方差假设支持。

# 2. 按角色取列；输入应无缺失，不在检验时静默删除观察。
huyiba_analysis_data <- huyiba_rawdata[c(outcome_var, group_var)]
if (anyNA(huyiba_analysis_data) ||
    !is.numeric(huyiba_analysis_data[[outcome_var]]) ||
    any(!is.finite(huyiba_analysis_data[[outcome_var]]))) {
  stop("请先准备无缺失、结局为有限数值的分析数据。")
}
if (length(group_levels) != 2L || anyDuplicated(group_levels) ||
    !setequal(as.character(huyiba_analysis_data[[group_var]]), group_levels)) {
  stop("group_levels须恰好列出实际存在的两个组，且不能重复。")
}
huyiba_analysis_data[[group_var]] <- factor(
  huyiba_analysis_data[[group_var]], levels = group_levels
)
group_values <- split(
  huyiba_analysis_data[[outcome_var]], huyiba_analysis_data[[group_var]]
)

# 3. 每组至少两条观察；标准差描述组内个体差异。
huyiba_group_summary <- data.frame(
  group = names(group_values),
  n = vapply(group_values, length, integer(1)),
  mean = vapply(group_values, mean, numeric(1)),
  sd = vapply(group_values, stats::sd, numeric(1)),
  row.names = NULL
)

# 4. x、y按指定组别顺序传入，保证检验方向和差值方向一致。
huyiba_result <- stats::t.test(
  x = group_values[[1]], y = group_values[[2]],
  paired = FALSE,                     # 两组独立；配对资料须另行准备真实配对输入。
  mu = null_difference,
  alternative = alternative,
  conf.level = conf_level,
  var.equal = equal_variance
)

# 5. estimate、conf.int、p.value来自同一检验对象；保留计算精度。
# 单侧检验返回含无穷端点的单侧区间，解释时须与alternative一致。
huyiba_result_table <- data.frame(
  contrast = paste(group_levels, collapse = " - "),
  mean_difference = unname(huyiba_result$estimate[1] - huyiba_result$estimate[2]),
  ci_lower = huyiba_result$conf.int[1],
  ci_upper = huyiba_result$conf.int[2],
  t_value = unname(huyiba_result$statistic),
  degrees_freedom = unname(huyiba_result$parameter),
  p_value = huyiba_result$p.value
)
print(huyiba_group_summary, row.names = FALSE)
print(huyiba_result)
print(huyiba_result_table, row.names = FALSE)
