1.8.1 线性回归
功能说明
从已准备的数据框 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 区间依赖模型形式和误差假设;重复测量、异方差等情况应另选推断方案。
- 不自动筛变量、填补缺失或添加交互项;共线性使系数不可估计时,先修正模型。