
1. 项目概述从线性到曲线的建模跃迁在HiMCM这类高强度的数学建模竞赛中数据关系的捕捉是决定论文深度的关键。很多新手队伍拿到数据后第一反应就是套用线性回归这固然没错但往往只是拿到了基础分。真正的挑战和得分点常常隐藏在那些“弯弯绕绕”的数据关系里。当散点图呈现出明显的曲线趋势或者自变量和因变量之间的关系并非简单的“你增我增”时线性模型就会显得力不从心预测偏差会急剧增大。这时候曲线回归模型就成了我们必须掌握的“进阶武器”。简单来说曲线回归的核心思想就是通过引入自变量的高次项、对数项、指数项等让模型“弯”起来从而更好地拟合非线性数据。但问题也随之而来模型变复杂了我们怎么知道这个“弯”是不是弯得恰到好处是不是为了拟合而过度“扭曲”了数据这就引出了另一个至关重要的环节——回归模型评价。建模不是一锤子买卖而是一个“构建-评价-优化”的循环。评价指标就像一把把尺子帮助我们量化模型的优劣在“拟合优度”和“模型简洁性”之间找到最佳平衡点。这篇文章我就结合多次带队参赛和评审的经验抛开教科书上复杂的公式推导重点聊聊在实际的HiMCM竞赛场景下如何根据数据特征选择合适的曲线回归模型以及如何运用一套务实、高效的组合评价方法为你的模型选择提供坚实的数据支撑避免在论文中写出“我们认为模型很好”这类苍白无力的结论。2. 核心思路拆解为何与何时需要跳出线性框架在动手拟合任何曲线之前我们必须先回答两个问题为什么不用线性模型以及什么样的数据信号提示我们需要曲线模型这是思路的起点决定了后续所有工作的方向。2.1 线性模型的局限性与非线性关系的识别线性回归$y \beta_0 \beta_1 x \epsilon$假设自变量$x$和因变量$y$之间存在恒定斜率的关系。它的局限非常明显只能描述单调的、恒定变化率的关系。现实中大量关系是非线性的。例如增长饱和现象如学习时间与成绩提升的关系初期增长快后期趋于平缓类似对数函数或负指数函数。先增后减或先减后增如广告投入与销售额的关系可能存在一个最优投入点超过后效果递减类似二次函数。指数增长或衰减如病毒传播初期、放射性物质衰变指数函数。周期性波动如气温随时间的变化三角函数。如何识别最直观的方法是绘制散点图和残差图。散点图如果数据点明显呈现一条曲线轨迹而非围绕一条直线分布这是最强烈的视觉信号。残差图拟合线性模型后绘制预测值与残差实际值-预测值的散点图。如果残差随机、均匀地分布在0轴上下说明线性假设可能成立。如果残差呈现出明显的系统性模式如U型、倒U型或扇形则强烈暗示存在未被线性模型捕捉的非线性关系需要引入曲线模型。注意不要完全依赖统计软件输出的线性模型$R^2$值。有时一个中等水平的$R^2$配合糟糕的残差图比一个高$R^2$但残差有模式的模型更危险后者意味着模型有系统性偏差。2.2 曲线回归模型的常见家族与选型逻辑面对非线性数据我们有一整个“模型工具箱”。选择哪一个取决于数据趋势背后的物理、经济或生物机制如果已知以及散点图形状的经验判断。以下是几种最常用、也最容易在HiMCM中实现和解释的曲线回归模型1. 多项式回归这是最直接的方法通过添加$x$的高次项$x^2, x^3, ...$来增加模型的灵活性。公式$y \beta_0 \beta_1 x \beta_2 x^2 ... \beta_n x^n \epsilon$适用场景适用于描述存在拐点如先上升后下降的复杂曲线关系。二次多项式$x^2$可以描述抛物线三次多项式可以描述一个“S”形弯等。选型心得切忌盲目追求高次项。通常二次或三次多项式足以解决竞赛中大部分非线性问题。次数过高极易导致“过拟合”——模型完美拟合训练数据但对新数据的预测能力极差。一个实用技巧是从二次项开始尝试观察$R^2$的提升和残差图的改善若提升不明显则无需继续增加次数。2. 对数回归包括因变量对数化($\ln y$)和自变量对数化($\ln x$)两种常见形式。公式自变量对数$y \beta_0 \beta_1 \ln x \epsilon$。描述$y$随$\ln x$线性变化即$x$对$y$的影响是边际递减的。公式因变量对数$\ln y \beta_0 \beta_1 x \epsilon$。描述$\ln y$随$x$线性变化即$y$本身呈指数增长/衰减趋势$y e^{\beta_0 \beta_1 x}$。适用场景适用于描述“收益递减”规律如经济学中的效用函数或指数增长/衰减趋势如种群增长、物质衰减。散点图形状类似一条逐渐平缓的曲线或一条陡峭增长的曲线。实操要点确保数据值大于0因为对数在零和负数上无定义。如果数据中有零可以考虑使用 $\ln(x1)$ 进行近似处理但需要在论文中说明。3. 指数回归与幂函数回归指数回归$y \alpha e^{\beta x}$。通过对两边取对数可转化为 $\ln y \ln \alpha \beta x$ 的线性形式进行处理。幂函数回归$y \alpha x^{\beta}$。两边取对数得 $\ln y \ln \alpha \beta \ln x$。适用场景指数回归适用于增长/衰减速率与当前值成正比的场景如不受限的种群增长。幂函数回归在物理学如开普勒定律、生物学异速生长等领域很常见。选型逻辑可以先在双对数坐标纸$\ln x - \ln y$或半对数坐标纸$x - \ln y$上画散点图。如果散点在双对数坐标下呈线性则适用幂函数模型如果在半对数坐标$x - \ln y$下呈线性则适用指数模型。4. 其他非线性模型如生长曲线模型Logistic, Gompertz、三角函数模型等通常在问题背景有明确暗示时使用如周期性数据用正弦/余弦拟合。选择模型时一个核心原则是在保证足够拟合精度的前提下选择形式更简单、解释性更强的模型。一个能用二次多项式很好拟合的数据就绝不用三次多项式。模型的简洁性奥卡姆剃刀原理在论文评审中是一个隐性加分项。3. 核心环节实现从拟合到诊断的全流程确定了候选模型家族后接下来就是具体的实现、拟合和诊断过程。这里我以最通用的工具Python的statsmodels和scikit-learn库为例展示一个完整的操作闭环。3.1 数据准备与探索性可视化任何建模工作都始于数据清洗和探索。假设我们有一个包含自变量x和因变量y的DataFrame名为df。import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import StandardScaler import statsmodels.api as sm from statsmodels.formula.api import ols # 1. 加载与查看数据 print(df.head()) print(df.describe()) print(df.isnull().sum()) # 检查缺失值 # 2. 处理缺失值示例用中位数填充 if df.isnull().sum().any(): df_filled df.fillna(df.median()) else: df_filled df.copy() # 3. 绘制核心散点图观察趋势 plt.figure(figsize(10, 6)) plt.scatter(df_filled[x], df_filled[y], alpha0.6, edgecolorsw, s80) plt.xlabel(Independent Variable (x)) plt.ylabel(Dependent Variable (y)) plt.title(Scatter Plot of y vs x - Initial Trend Inspection) plt.grid(True, linestyle--, alpha0.5) plt.show()这个散点图是你做出“是否需要曲线回归”判断的第一依据。如果趋势明显非线性记下它的形状是像抛物线像对数曲线还是像指数曲线3.2 构建与拟合对比模型假设我们从散点图中观察到一种先快速上升后趋于平缓的趋势我们怀疑它可能符合对数或二次多项式关系。我们来同时构建三个模型进行对比线性模型、二次多项式模型、对数模型自变量取log。# 为多项式回归创建高次项特征这里创建x^2 df_filled[x_squared] df_filled[x] ** 2 # 为对数回归创建特征确保x0 df_filled[log_x] np.log(df_filled[x] 1e-9) # 加一个极小值防止x为0 # 模型1: 简单线性回归 model_linear ols(y ~ x, datadf_filled).fit() # 模型2: 二次多项式回归 model_poly ols(y ~ x x_squared, datadf_filled).fit() # 模型3: 对数回归 (y ~ log(x)) model_log ols(y ~ log_x, datadf_filled).fit() print(线性模型摘要:) print(model_linear.summary()) print(\n二次多项式模型摘要:) print(model_poly.summary()) print(\n对数模型摘要:) print(model_log.summary())运行后你会得到每个模型的详细统计摘要包括$R^2$、调整后$R^2$、系数估计值、P值等。不要只看$R^2$接下来进入关键的诊断与评价环节。3.3 回归诊断与模型评价实战拟合完模型只是第一步诊断才是判断模型好坏的“体检中心”。我们需要系统性地查看以下几张图、计算以下几组指标。第一步绘制拟合效果对比图将原始散点与不同模型的拟合线画在一起直观感受拟合优劣。# 生成预测值 x_range np.linspace(df_filled[x].min(), df_filled[x].max(), 500) df_plot pd.DataFrame({x: x_range}) df_plot[x_squared] df_plot[x] ** 2 df_plot[log_x] np.log(df_plot[x] 1e-9) # 为statsmodels预测准备带常数的设计矩阵 X_linear sm.add_constant(df_plot[[x]]) X_poly sm.add_constant(df_plot[[x, x_squared]]) X_log sm.add_constant(df_plot[[log_x]]) pred_linear model_linear.predict(X_linear) pred_poly model_poly.predict(X_poly) pred_log model_log.predict(X_log) # 绘图 plt.figure(figsize(14, 6)) plt.scatter(df_filled[x], df_filled[y], alpha0.5, labelActual Data, s70) plt.plot(df_plot[x], pred_linear, r-, linewidth3, labelLinear Fit) plt.plot(df_plot[x], pred_poly, g--, linewidth3, labelQuadratic Polynomial Fit) plt.plot(df_plot[x], pred_log, b:, linewidth3, labelLogarithmic Fit (x)) plt.xlabel(x) plt.ylabel(y) plt.title(Model Fitting Comparison) plt.legend() plt.grid(True, linestyle--, alpha0.3) plt.show()这张图能立刻告诉你哪个模型的曲线形状最贴合数据的整体走势。是多项式曲线完美穿过了数据弯道还是对数曲线更好地描述了尾部平缓的趋势第二步残差分析——检验模型假设的核心残差分析是回归诊断的灵魂。我们以表现较好的多项式模型为例进行系统分析。# 计算多项式模型的残差 residuals_poly model_poly.resid fitted_values_poly model_poly.fittedvalues fig, axes plt.subplots(2, 2, figsize(14, 10)) # 1. 残差 vs 拟合值图 axes[0, 0].scatter(fitted_values_poly, residuals_poly, alpha0.6) axes[0, 0].axhline(y0, colorr, linestyle--) axes[0, 0].set_xlabel(Fitted Values) axes[0, 0].set_ylabel(Residuals) axes[0, 0].set_title(Residuals vs Fitted Values) axes[0, 0].grid(True, alpha0.3) # 2. 残差的正态Q-Q图 sm.qqplot(residuals_poly, line45, fitTrue, axaxes[0, 1]) axes[0, 1].set_title(Normal Q-Q Plot of Residuals) # 3. 残差的分布直方图 axes[1, 0].hist(residuals_poly, bins30, edgecolorblack, alpha0.7, densityTrue) # 叠加正态分布曲线 from scipy.stats import norm mu, std norm.fit(residuals_poly) xmin, xmax axes[1, 0].get_xlim() x np.linspace(xmin, xmax, 100) p norm.pdf(x, mu, std) axes[1, 0].plot(x, p, k, linewidth2) axes[1, 0].set_xlabel(Residuals) axes[1, 0].set_ylabel(Density) axes[1, 0].set_title(Histogram of Residuals with Normal Fit) # 4. 残差 vs 自变量x的图 axes[1, 1].scatter(df_filled[x], residuals_poly, alpha0.6) axes[1, 1].axhline(y0, colorr, linestyle--) axes[1, 1].set_xlabel(Independent Variable (x)) axes[1, 1].set_ylabel(Residuals) axes[1, 1].set_title(Residuals vs Independent Variable) axes[1, 1].grid(True, alpha0.3) plt.tight_layout() plt.show()残差vs拟合值图我们希望看到残差随机、均匀地分布在0线上下无明显规律如漏斗形、弧形。如果出现规律说明模型可能遗漏了某个非线性项或交互项或者存在异方差性。Q-Q图用于检验残差是否服从正态分布。理想情况下点应大致落在45度对角线上。严重偏离意味着正态性假设可能不成立可能会影响后续假设检验如系数显著性t检验的准确性。残差vs自变量图检查残差是否与自变量$x$相关。理想情况也是随机分布。如果出现曲线模式强烈提示当前模型形式即使是曲线模型可能仍不充分需要考虑更复杂的模型或数据变换。第三步量化指标综合对比最后我们需要一套数字指标来客观比较不同模型。除了常见的$R^2$更要关注那些考虑了模型复杂度的指标。from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score # 为每个模型计算关键指标 models {Linear: model_linear, Quadratic: model_poly, Logarithmic: model_log} results [] for name, model in models.items(): y_pred model.predict() y_true df_filled[y] mse mean_squared_error(y_true, y_pred) rmse np.sqrt(mse) mae mean_absolute_error(y_true, y_pred) r2 r2_score(y_true, y_pred) adj_r2 1 - (1-r2)*(len(y_true)-1)/(len(y_true)-model.df_model-1) aic model.aic bic model.bic results.append({ Model: name, R-squared: round(r2, 4), Adj. R-squared: round(adj_r2, 4), MSE: round(mse, 2), RMSE: round(rmse, 2), MAE: round(mae, 2), AIC: round(aic, 1), BIC: round(bic, 1) }) results_df pd.DataFrame(results) print(results_df.to_string(indexFalse))这个对比表格是你在论文中呈现模型选择依据的核心。我们来解读关键指标$R^2$ (R-squared)模型解释的方差比例。越高越好但会随变量增加而虚假增高。调整后$R^2$ (Adj. R-squared)考虑了自变量个数的惩罚比$R^2$更可靠。这是比较不同复杂度模型时的首要指标。RMSE (均方根误差) MAE (平均绝对误差)预测误差的度量单位与因变量相同。越小越好能直观反映预测的平均偏差大小。AIC (赤池信息准则) BIC (贝叶斯信息准则)用于模型比较的黄金标准。它们平衡了模型的拟合优度和复杂度参数个数。AIC/BIC值越小模型相对越好。当两个模型$R^2$接近时AIC/BIC能帮你选出更简洁、更可能推广到新数据的模型。实操心得在HiMCM论文中不要只罗列表格。一定要有文字分析例如“尽管二次多项式模型的$R^2$0.92仅比对数模型0.90略高但其AIC-205.3和BIC-198.7均显著低于对数模型AIC: -189.5, BIC: -183.2且其残差图显示更随机的分布。因此我们选择二次多项式模型作为最终模型因其在略微提升拟合精度的同时保持了更好的统计性质和简洁性。”4. 高级技巧与避坑指南掌握了基础流程一些高级技巧和常见陷阱能让你在竞赛中更进一步。4.1 处理多重共线性与过拟合当你使用多项式回归特别是高次项时自变量$x$和$x^2$、$x^3$之间会存在高度的相关性这称为多重共线性。它不会影响模型的整体预测能力但会使各个系数的估计值变得非常不稳定标准误增大导致t检验失效系数可能不显著。诊断方法计算方差膨胀因子VIF。通常VIF 10被认为存在严重共线性。from statsmodels.stats.outliers_influence import variance_inflation_factor # 对于多项式模型计算VIF X_poly_with_const sm.add_constant(df_filled[[x, x_squared]]) vif_data pd.DataFrame() vif_data[feature] X_poly_with_const.columns vif_data[VIF] [variance_inflation_factor(X_poly_with_const.values, i) for i in range(X_poly_with_const.shape[1])] print(vif_data)解决方法中心化处理在创建高次项之前先将自变量$x$减去其均值$x_{centered} x - \bar{x}$然后用中心化后的值计算平方项。这能显著降低$x$和$x^2$之间的相关性。df_filled[x_centered] df_filled[x] - df_filled[x].mean() df_filled[x_centered_sq] df_filled[x_centered] ** 2 model_poly_centered ols(y ~ x_centered x_centered_sq, datadf_filled).fit() # 再次计算VIF通常会大幅下降使用正交多项式statsmodels和R语言支持直接使用正交多项式进行拟合其生成的各项之间是正交的不相关彻底解决共线性问题。在Python中可以通过patsy库的poly函数实现。正则化如岭回归、Lasso如果模型非常复杂且数据量有限可以考虑使用带惩罚项的正则化回归这本身就是应对共线性和过拟合的有力工具。过拟合的典型特征是模型在训练集上表现极好$R^2$接近1但在测试集或新数据上表现很差。对于曲线回归防止过拟合的最有效方法就是保持模型简洁优先使用低次多项式以及进行交叉验证。4.2 交叉验证评估模型泛化能力的金标准我们之前的所有评价都是在训练数据上进行的“训练集”。为了更可靠地估计模型对新数据的预测能力“泛化能力”必须使用交叉验证。from sklearn.model_selection import cross_val_score, KFold from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import make_pipeline # 准备数据 X df_filled[[x]].values y df_filled[y].values # 定义要比较的模型复杂度多项式次数 degrees [1, 2, 3, 4, 5] cv_scores [] # 设置交叉验证策略这里用5折 kf KFold(n_splits5, shuffleTrue, random_state42) for degree in degrees: # 创建多项式回归管道 model make_pipeline(PolynomialFeatures(degree), LinearRegression()) # 计算交叉验证的负均方误差MSE取负值是因为scikit-learn约定得分越高越好 scores cross_val_score(model, X, y, cvkf, scoringneg_mean_squared_error) # 将负MSE转换回RMSE以便理解 rmse_scores np.sqrt(-scores) cv_scores.append({ Degree: degree, Mean RMSE: rmse_scores.mean(), Std RMSE: rmse_scores.std() }) cv_results_df pd.DataFrame(cv_scores) print(cv_results_df)通过交叉验证的RMSE你可以清晰地看到随着多项式次数增加模型在训练集外的平均预测误差Mean RMSE是如何变化的。通常你会选择那个使交叉验证误差最小或达到平台期的模型复杂度。如果次数增加到4或5时RMSE不降反升或波动剧烈那就说明3次可能已经足够了更高次模型出现了过拟合。4.3 结果可视化与论文呈现技巧在HiMCM论文中一图胜千言。除了基础的拟合对比图以下两种图能极大提升你论文的专业性1. 带置信区间和预测区间的拟合图这不仅展示拟合曲线还展示了估计的不确定性。# 使用statsmodels获取预测的置信区间和预测区间 from statsmodels.sandbox.regression.predstd import wls_prediction_std # 以二次多项式模型为例 prstd, iv_l, iv_u wls_prediction_std(model_poly) # 预测区间的标准差下限上限 plt.figure(figsize(10, 6)) # 绘制原始数据 plt.scatter(df_filled[x], df_filled[y], alpha0.5, labelData, s50) # 绘制拟合线 plt.plot(df_filled[x].sort_values(), model_poly.fittedvalues.sort_values(), r-, labelQuadratic Fit, linewidth2) # 绘制95%置信区间均值的置信区间 # 注意这里需要按x排序后绘图使用fill_between sorted_idx df_filled[x].argsort() x_sorted df_filled[x].iloc[sorted_idx].values fitted_sorted model_poly.fittedvalues.iloc[sorted_idx].values # 计算置信区间这里简化处理可使用get_prediction方法获得更精确的区间 # 绘制95%预测区间个体预测值的区间 plt.fill_between(x_sorted, iv_l[sorted_idx], iv_u[sorted_idx], colorgray, alpha0.3, label95% Prediction Interval) plt.xlabel(x) plt.ylabel(y) plt.title(Quadratic Regression Fit with 95% Prediction Interval) plt.legend() plt.grid(True, alpha0.3) plt.show()在论文中解释置信区间反映了回归线本身的不确定性均值在哪而预测区间反映了对于一个新观测值y的不确定性范围更宽。预测区间更能体现模型的实用预测能力。2. 模型指标对比雷达图或条形图将多个模型的RMSE、MAE、调整$R^2$、AIC等指标标准化后放在一张雷达图上可以非常直观地进行多维度比较。# 示例绘制调整R-squared和RMSE的对比条形图 metrics_compare results_df[[Model, Adj. R-squared, RMSE]].copy() metrics_compare.set_index(Model, inplaceTrue) fig, (ax1, ax2) plt.subplots(1, 2, figsize(12, 5)) metrics_compare[Adj. R-squared].plot(kindbar, axax1, colorskyblue, edgecolorblack) ax1.set_title(Adjusted R-squared Comparison) ax1.set_ylabel(Adj. R-squared) ax1.axhline(ymetrics_compare[Adj. R-squared].max(), colorr, linestyle--, alpha0.5) ax1.tick_params(axisx, rotation0) metrics_compare[RMSE].plot(kindbar, axax2, colorlightcoral, edgecolorblack) ax2.set_title(RMSE Comparison (Lower is Better)) ax2.set_ylabel(RMSE) ax2.axhline(ymetrics_compare[RMSE].min(), colorg, linestyle--, alpha0.5) ax2.tick_params(axisx, rotation0) plt.tight_layout() plt.show()5. 常见问题与排查实录在实际操作中你肯定会遇到各种报错和反常现象。这里记录几个最典型的问题和我的解决思路。问题1拟合多项式模型时出现奇异矩阵错误或结果异常。现象运行model.fit()时提示“LinAlgError: Singular matrix”或系数值变得极其巨大、不合理。原因几乎肯定是严重的多重共线性导致设计矩阵不可逆或病态。当$x$和$x^2$、$x^3$等项量纲差异巨大且相关性极强时就会发生。解决立即对自变量进行中心化见4.1节这是首选且通常最有效的办法。如果数据范围很大考虑先进行标准化减均值除以标准差然后再生成多项式特征。使用sklearn的PolynomialFeatures时设置include_biasFalse并配合StandardScaler使用管道。问题2对数或指数模型拟合后预测值出现NaN或inf。现象模型可以拟合但用新数据预测时predict()函数返回了NaN或无穷大。原因新数据中包含了小于等于0的值而你在拟合时可能对原始数据做了log(x1)的处理但预测时直接对新数据取了log(x)。解决确保预测时的数据变换与训练时完全一致。最好的做法是使用scikit-learn的管道Pipeline将变换器和模型封装在一起。from sklearn.compose import TransformedTargetRegressor from sklearn.preprocessing import FunctionTransformer # 创建一个对数变换器 log_transformer FunctionTransformer(funcnp.log1p, inverse_funcnp.expm1) # log1p log(x1), expm1 exp(x)-1 # 创建管道先变换目标变量y再用线性模型拟合 pipeline TransformedTargetRegressor(regressorLinearRegression(), transformerlog_transformer) pipeline.fit(X, y) # X是原始特征y是原始目标值 predictions pipeline.predict(X_new) # 自动进行正反变换问题3模型评价指标看起来都很好但残差图还是有明显的模式。现象$R^2$很高AIC也低但残差vs拟合值图呈现明显的“弯月形”或“喇叭形”。原因说明当前模型形式仍然没有完全捕捉数据中的非线性关系或者存在异方差性残差的方差随预测值增大而改变。解决尝试更复杂的模型形式例如加入$x^3$项或尝试其他函数族如指数、幂函数。如果怀疑是异方差可以考虑对因变量$y$进行变换如Box-Cox变换或者使用加权最小二乘法WLS而不是普通最小二乘法OLS进行拟合。在statsmodels中只需在ols函数中指定weights参数即可。检查是否遗漏了重要的交互项或另一个关键自变量。问题4如何向非数学背景的队友或评委解释AIC/BIC技巧不要直接扔公式。可以这样类比“AIC和BIC就像给模型考试打分不仅看它做对了多少题拟合优度$R^2$还要惩罚它用了太多小抄模型参数。一个用了5个参数考95分的模型和一个用了10个参数考96分的模型AIC/BIC可能会判定前者更优因为它更简洁、更不容易在未来的新题新数据上出错。” 在论文中直接报告AIC/BIC的数值并说明“我们选择AIC/BIC值最小的模型”即可这是统计学界的通用标准。最后记住数学建模竞赛的核心是用合适的模型讲一个合理的数据故事。曲线回归和模型评价是你工具箱里强大的工具但永远要从数据本身和问题背景出发去使用它们。一个被指标证明“最优”但无法用常识解释的复杂模型其价值可能远低于一个稍逊一筹但逻辑清晰的简单模型。在你的论文中将可视化诊断、量化指标和逻辑论述结合起来才能构建出令人信服的模型选择论证链。