# Prompt 03：LASSO 与 Logistic 主线建模

## 背景

这是流程的第三阶段：在训练集内完成主线建模——LASSO（Least Absolute Shrinkage and Selection Operator）筛选变量，映射回原始变量后用 Logistic 回归无惩罚重拟合，给出 OR 与置信区间，并用 Nomogram 表达模型。产物只是候选模型，尚未经过任何验证。对应 Book 3 第 3 章，参考实现见 `Demo_R_Project/R/03_lasso_logistic_nomogram.R`。

## 数据说明

- 输入：清理后的分析队列、`results/tables/split_manifest.csv`（只用其中 split 为 train 的成员）；
- 结局变量：`<结局变量>`；正类：`<正类>`；
- 候选预测变量：`<候选变量清单>`（数值变量与因子变量分别注明，因子注明水平与参照）；
- 交叉验证折数（LASSO 内部调 lambda 用）：`<折数>`；种子：`<种子>`。

## 当前任务

仅在训练集内：学习预处理（缺失插补值、因子编码、标准化参数均只用训练集估计），用交叉验证 LASSO 在 lambda.min 处筛选，将入选项映射回原始变量，以原始变量做 Logistic 无惩罚重拟合，输出 OR/CI 与 Nomogram。

先检查输入并给出简要计划，然后继续执行指定任务；不要在计划后等待用户再次确认。只有输入冲突、字典冲突、必须改变方法或命中暂停条件时停止。

## 方法

1. 按 split 成员清单取训练集；测试集本阶段不读取、不使用；
2. 预处理参数（连续变量中位数插补、因子众数插补、标准化均值与标准差）只在训练集上学习；
3. 构造设计矩阵后运行交叉验证 LASSO（family = binomial，`<折数>` 折，种子 `<种子>`），按 lambda.min 取入选项；
4. 分别报告三个数：入选 dummy 数、映射回的原始变量数、最终模型系数数；因子变量任一非参照 dummy 入选即映射为该原始变量整体进入；
5. 用入选原始变量做 Logistic 回归（glm，无惩罚）重拟合；OR 的 95% 置信区间用 profile likelihood；
6. 基于重拟合模型绘制 Nomogram；
7. 单因素筛选或逐步法如需展示，只能作为方法对照并列呈现：不与 LASSO 结果求并集或交集，不回流主模型；
8. 保存 LASSO 系数表、入选项清单、入选原始变量清单与重拟合模型对象。

## 输出

- `results/tables/lasso_coefficients.csv`：LASSO 系数；
- `results/tables/lasso_selected_terms.csv`：入选 dummy 清单；
- `results/tables/lasso_selected_variables.csv`：入选原始变量清单；
- `results/tables/logistic_or_ci.csv`：重拟合模型的 OR 与 95% CI；
- `results/figures/` 下的 LASSO 路径图、LASSO 交叉验证图、OR 森林图、Nomogram 图；
- `results/models/` 下的重拟合模型对象；
- 日志：记录 lambda.min、三个数量、模型收敛与分离检查。

## 约束

- 全部学习限定在训练集内；测试集任何形式的参与都视为事故；
- LASSO 惩罚系数只用于筛选；最终效应量必须来自无惩罚 glm 重拟合，不得直接解释惩罚系数；
- dummy 与原始变量两个口径必须分清，报告时不得混用；
- 对照方法（单因素、逐步）的结果只并列展示，不改变主线模型；
- 不根据本阶段结果回头增删候选变量；候选集由 `<候选变量清单>` 唯一确定；
- 全程使用仓库内相对路径。

## 验收

- 入选 dummy 数、原始变量数、最终系数数三者均有记录且关系正确（dummy ≥ 原始变量，系数数 = 展开后的 dummy 口径 + 截距）；
- `logistic_or_ci.csv` 每个系数给出 OR + 95% CI + P 三件套；
- 重拟合模型收敛、无分离警告（若有警告须已触发暂停）；
- 四张图存在且非空；
- 日志可复核 lambda.min 与折数、种子与指定值一致。

## 暂停条件

出现以下任一情况，停止并报告，等待人工决定：LASSO 在 lambda.min 处无有效入选变量；Logistic 重拟合出现明显分离或不收敛；置信区间出现非有限值；训练集事件数不足以支撑入选参数量（EPV 明显不足）；候选变量与字典冲突。
