1.8.1 线性回归

更新日期

2026年11月9日

功能说明

从已准备的数据框 huyiba_rawdata 拟合含截距的加性线性模型。每行一个独立观察单位,结局是同一单位的有限数值;连续预测列为有限数值,分类预测列为无序因子,所用列无缺失。请配置 outcome_var、predictor_vars 和每个因子的 reference_levels,列名须能直接用于 R 公式。

huyiba_model 保存模型,huyiba_result 返回系数、标准误、区间与 P 值。系数解释见1.8.1 线性回归。

核心R包

包名 主要用途 实际验证版本
stats(R 基础包) 最小二乘拟合、处理对比及系数 t 区间 4.5.2(随 R 4.5.2)

无需安装额外分析包。

代码

准备符合要求的输入后,修改开头的配置。下载同一份 R 源码。

# 多变量线性回归:输入 huyiba_rawdata,结局为有限数值。
outcome_var <- "outcome"
predictor_vars <- c("predictor_continuous", "predictor_group")
reference_levels <- c(predictor_group = "reference")
# 每个无序因子声明一个参考水平;没有因子时用 character(0)。
conf_level <- 0.95 # 系数的 t 区间;提高置信水平通常会使区间变宽。

# 只选所需列;分析样本由研究者先确定,缺失值不由模型静默删除。
model_columns <- c(outcome_var, predictor_vars)
if (!length(predictor_vars) || anyDuplicated(model_columns) ||
    !all(model_columns %in% names(huyiba_rawdata))) {
  stop("请指定一个结局及至少一个不同的预测列;列名必须存在且不可重复。")
}
huyiba_analysis_data <- huyiba_rawdata[model_columns]
is_finite_numeric <- function(x) is.numeric(x) && is.null(dim(x)) && all(is.finite(x))
valid_predictors <- vapply(
  huyiba_analysis_data[predictor_vars],
  function(x) is_finite_numeric(x) || (is.factor(x) && !is.ordered(x)),
  logical(1)
)
if (anyNA(huyiba_analysis_data) ||
    !is_finite_numeric(huyiba_analysis_data[[outcome_var]]) ||
    !all(valid_predictors)) {
  stop("请提供无缺失的有限数值结局;预测列须为有限数值或无序因子。")
}

# 用显式处理对比,使每个分类系数都相对所声明的参考水平。
factor_vars <- predictor_vars[vapply(
  huyiba_analysis_data[predictor_vars], is.factor, logical(1)
)]
if (!setequal(names(reference_levels), factor_vars) ||
    anyDuplicated(names(reference_levels))) {
  stop("请为每个因子声明一个参考水平。")
}
model_contrasts <- NULL
for (variable in factor_vars) {
  huyiba_analysis_data[[variable]] <- stats::relevel(
    droplevels(huyiba_analysis_data[[variable]]), ref = reference_levels[[variable]]
  )
  model_contrasts[[variable]] <- stats::contr.treatment(
    levels(huyiba_analysis_data[[variable]]), base = 1L
  )
}

# 加性模型含截距;每项系数是在其余项固定时的平均结局差。
model_formula <- stats::reformulate(predictor_vars, response = outcome_var)
huyiba_model <- stats::lm(
  model_formula, data = huyiba_analysis_data, contrasts = model_contrasts,
  na.action = stats::na.fail, singular.ok = FALSE
)
if (stats::df.residual(huyiba_model) <= 0L) {
  stop("没有剩余自由度,无法估计系数区间。")
}
coefficient_summary <- summary(huyiba_model)$coefficients
coefficient_ci <- stats::confint(huyiba_model, level = conf_level)

# 保留计算精度:连续预测列按其原单位增加 1,分类列按对比解释。
huyiba_result <- data.frame(
  term = rownames(coefficient_summary),
  estimate = coefficient_summary[, "Estimate"],
  standard_error = coefficient_summary[, "Std. Error"],
  ci_lower = coefficient_ci[, 1],
  ci_upper = coefficient_ci[, 2],
  p_value = coefficient_summary[, "Pr(>|t|)"],
  row.names = NULL
)
print(stats::nobs(huyiba_model))
print(huyiba_result)

注意事项

  • 连续变量按原单位增加 1 解读;每个分类系数相对于配置的参考水平。多水平因子会生成多个系数。
  • 常规 t 区间依赖模型形式和误差假设;重复测量、异方差等情况应另选推断方案。
  • 不自动筛变量、填补缺失或添加交互项;共线性使系数不可估计时,先修正模型。