你每天都在做“预测”。叫网约车时,师傅说“8 分钟到”,其实是在心里快速算了一条公式:距离近一点、路况好一点、红灯少一点,时间就短一点。距离、红灯数、天气这些因素就是自变量,到达时间就是结果,而那条“综合各路信息给出估计”的规则,正是统计建模想做的事。
R 语言里的 lm() 和 glm(),就是你用来把这种模糊经验“写成公式、算清参数、验证可靠度”的工具箱。lm() 擅长画直线——预测连续数值,比如到达时间、体重、房价;glm() 则更灵活,能画“S 型曲线”——预测概率,比如“会不会迟到”“是否患病”“是否点击广告”。本文用“导航估时”这个生活场景贯穿始终,带你从零上手这两种最常用的统计建模方法,并掌握一套完整的建模流程:拟合公式、解读系数、检验显著性、诊断残差、比较模型、预测和可视化。
对 AI 从业者而言,lm/glm 是理解机器学习可解释性的起点:它们把“预测”变成“可读的系数 + 可信的检验”,是你在做特征分析、业务归因、风控评分时最值得信赖的“白盒”工具。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
公式语法与数据准备
用导航软件规划路线前,你需要在输入框里给出“起点”和“终点”,再把距离、红绿灯、拥堵指数一并加进去。R 的公式对象就是建模的“导航输入框”:它用一行文字写清楚“用什么预测什么”。
这句话的意思是:用 wt(车重)和 hp(马力)这两个变量去预测 mpg(油耗),数据来自 mtcars 数据框。波浪号 ~ 左边是结果变量,右边是预测变量。运行之后,R 会把模型中的所有结果打包成一个模型对象,包括系数、残差、拟合值等,供后续提取和诊断。
理解公式后,你自然明白为什么 glm() 也用同样的写法:它只是把 family 参数换成 binomial 或 poisson,就切换了“导航模式”。这一小段语法,是你打开整个统计建模世界的第一把钥匙。
y 由“基准值 + 各因素乘以各自权重 + 随机噪声”三部分构成。- 结果变量 y你要预测的对象,比如导航里的“到达时间”。
- 截距项 β₀所有自变量都为零时,结果的基准水平。
- 系数项 βⱼxⱼ第 j 个因素乘以它的“权重”,权重决定影响大小。
- 误差项 ε模型预测与实际观测之间的随机偏差。
fit <- lm(mpg ~ wt + hp, data = mtcars)lm线性回归拟合
导航估算“8 分钟到”时,干的事其实是在一堆历史数据里找一条“最顺眼的直线”。lm() 用的是最小二乘法:让所有数据点到直线的竖直距离的平方和最小。这条线一旦确定,就成了一台自动估时器。
运行后,你会看到系数估计、标准误、t 值、p 值和 R²。其中R² 是“拟合优度”,表示自变量能解释因变量多大比例的波动。R² 越接近 1,说明这辆“预测车”的路线越贴合历史数据。
用 coef(fit) 可以直接取出最新拟合的系数,重新写一条带数字的路线公式。这条“最优直线”就是你在新手阶段最快的成就感来源——你亲手从数据里“炼”出了一条预测线。
- 括号内的预测值用当前参数算出的“估时结果”。
- 残差真实观测减去预测,即导航估时和实际到达的差。
- 平方求和把差值平方再加总,避免正负抵消。
- argmin在所有可能的 β 中,挑出使平方和最小的那一组。
summary(fit)回归系数解读
拿到导航给出的预计时间,你心里会琢磨:到底是距离起主要作用,还是红灯太多更耽误事?回归系数就是帮你拆解这个问题的“账单”。
假设输出显示 wt 的系数是 3.9,意思是:在 hp 不变的前提下,车重每增加一个单位,油耗平均增加 3.9 个单位。这就是“边际效应”——其他条件不变,只看这一个变量动一格,结果变动多少。
此外,confint(fit) 能给出每个系数的置信区间。区间越窄,说明这个“权重”估计得越有把握。读懂系数,你从“会用函数”进阶到“能解释业务”,这是统计建模最有价值的一步。
- 变化量 Δxⱼ某个预测变量的单位变动,比如距离多 1 公里。
- 系数估计 β̂ⱼ该变量对结果的“边际影响”大小。
- 结果变化 Δy预测值随变量变动的幅度。
- 控制其他变量多元回归中每个系数都自带“保持其余不变”的声明。
coef(fit)显著性检验体系
导航说某个路口“通常多等 3 分钟”,但这个结论会不会只是偶然?统计检验就是你的“怀疑过滤器”:它计算在“该变量其实毫无影响”的前提下,出现当前数据的概率有多大。这个概率就是 p 值。
输出里每个系数都对应一列 t 值和 p 值。t 值等于“系数估计 ÷ 标准误”,相当于“信号 ÷ 噪声”。p 值小于 0.05 时,我们习惯说“统计显著”——当然,这个阈值只是行业惯例,不是圣旨。
整体模型的显著性则看 F 检验,它把所有变量打包成一个整体问:“合起来到底有没有预测力?” 检验完毕,你心里就有底了——哪些路线因素是稳定规律,哪些只是随机波动。
- 系数估计 β̂ⱼ回归给出的“影响力度”数字。
- 标准误 se估计值的波动程度,类似导航估时的误差范围。
- t 统计量信号与噪声的比值,比值越大越可信。
- p 值由 t 值推算出的“在原假设下出现此结果的概率”。
summary(fit)残差诊断分析
衣服做好后,裁缝会让顾客试穿,看哪里绷着、哪里空着。回归模型的“试穿”就是残差诊断:残差等于真实值减去预测值,它记录了每个样本“没被解释干净”的部分。
这一行会生成四张诊断图。第一张“残差 vs 拟合值”如果呈现出喇叭口形状,说明方差随预测值增大而增大;Q-Q 图检查残差是否近似正态分布;还有专门揪出“高杠杆异常点”的图。lm 假设残差独立、同方差、近似正态,诊断就是验证这些假设是否成立。
如果残差明显违背假设,别急着下结论——可能需要加入非线性项、对因变量做变换,或者改用 glm。残差是模型的“照妖镜”,会老老实实告诉你哪里不合身。
- 真实值 yᵢ第 i 个样本的实际观测结果。
- 预测值 ŷᵢ模型在同样输入下的估计输出。
- 残差 eᵢ两者之差,正数代表低估,负数代表高估。
- 残差图模式若残差随机散布在 0 附近,说明模型结构合理;若呈现曲线,说明漏掉了非线性关系。
plot(fit)模型选择与比较
导航 App 会给你规划三条路线:最快、最省、最顺。每个回归模型也是一条路线,我们需要一个“打分标准”来权衡“拟合得好”与“不要过度复杂”。AIC 和 BIC 就是这样的一把尺。
逐步回归会自动向模型里添加或剔除变量,每一步都看看 AIC 是否变好。AIC 的思想是:既要拟合得好(似然高),又要简洁(参数少)。它给“复杂程度”加了惩罚分,防止你把无关变量都塞进模型里自嗨。
嵌套模型还可以用 anova(fit1, fit2) 做似然比检验。模型选择的意义在于:你的预测路线不是越绕越多变量越好,而是要在“解释力”和“可维护性”之间找到最优解。
- 似然函数 L̂在当前模型下,观测到这批数据出现的概率密度。
- -2ln(L̂)拟合越差、似然值越低,这一项就越大。
- 惩罚项 2kk 是参数个数,每多一个变量就多一份“复杂度税”。
- 比较逻辑两个模型比较,AIC 小者优先推荐。
step(fit_full, direction = "both")glm广义线性模型
有时候结果不是“几分钟到”,而是“会不会迟到”——二分类问题。直线给不了概率,把直线强行压到 0~1 之间也会出负数或超过 1 的荒谬结果。这时就该请出 glm(广义线性模型) 了。
family = binomial 告诉 R:结果变量是 0/1,请使用逻辑回归。核心魔法在于链接函数——把“概率”转换到“直线可表达的尺度”上。对二分类用 logit 链接,对计数数据用泊松族 family = poisson,对数链接让平均计数不落为负数。
当你需要预测“事件发生的概率”而不是“数值大小”时,glm 就是那辆从直线切换到 S 型弯道的导航车。
- 事件概率 p要预测的结果发生的概率,比如“迟到”的概率。
- 优势比事件发生与不发生的概率之比。
- 对数优势比取对数后把 0~1 的概率映射到全体实数,方便用直线拟合。
- 预测式的线性组合右边仍然是熟悉的“截距 + 系数×变量”,只是左边换成了链接函数。
fit_glm <- glm(vs ~ wt + hp, data = mtcars, family = binomial)预测与可视化
导航最有用的时刻不在规划,而在出发后的“实时预估”。建模的最终目的同样是把模型用起来:给新数据做预测,并把结果画成图讲给同事听。
predict() 是 R 的“导航播报”:给一批新样本,它会输出预测值,还能带出置信区间。置信区间像导航的“预计到达时间偏差范围”——告诉你预测值的可信范围。可视化方面,ggplot2 是利器:
预测、画图、汇报,这一套流程下来,你已经完成了一次完整的统计建模循环:从公式到拟合、从检验到诊断、从选择到部署。你不再是只会写函数的搬运工,而是能用数据讲故事的建模者。
- 新样本 x₀一条新的“路线数据”,比如一辆从未出现过的车型。
- 代入估计系数将每个变量的值乘以对应系数。
- 求和预测值全部加总得预测输出。
- 置信区间反映系数估计的不确定性,给出上下界。
predict(fit, newdata = my_df, interval = "confidence")ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() + geom_smooth(method = "lm", se = TRUE)
AI 应用场景
即时配送 ETA 预测
阶段:特征工程与模型评估
解决的问题:外卖平台传统做法是按“距离÷速度”粗算时间,误差大,导致超时投诉。用 lm() 把历史订单的距离、天气、时段、骑手状态纳入模型,能精准预测配送耗时,动态调整预计送达时间。
具体案例:某外卖平台用 R 建模发现“下雨天 + 高峰期 + 商家出餐慢”会让配送时间增加 12 分钟,通过系数解读定位瓶颈环节,并上线“雨天补贴”策略。
信贷违约风险评估
阶段:模型选择与部署监控
解决的问题:银行判断“是否放贷”是典型二分类问题,传统人工审批费时且标准不一。用 glm(family = binomial) 构建违约概率模型,输出 0~1 的信用评分,阈值可调,规则透明可解释,满足监管要求。
具体案例:消费金融公司用逻辑回归筛选 20+ 特征,发现“近三月查询次数”和“收入负债比”是最强风险因子,模型 AUC 达 0.78,审批效率提升 5 倍。
用户转化分析与营销归因
阶段:因果推断与业务归因
解决的问题:市场团队想知道“哪个渠道带来更多转化”,但流量数据噪声大。通过 glm 建模转化概率并解读各渠道系数,可量化每个渠道的边际贡献,替代“最后点击”这种简单归因。
具体案例:某 SaaS 公司将“是否注册”作为结果,对搜索广告、社交媒体、邮件三个渠道做逻辑回归,发现邮件触达的系数是社交媒体的 2.3 倍,于是重新分配预算,注册率提升 18%。
Python 演示
import numpy as npfrom sklearn.datasets import load_diabetesfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegression, LogisticRegressionfrom sklearn.metrics import r2_score, accuracy_score # 加载内置糖尿病数据集, 相当于 R 的 data(mtcars)data = load_diabetes()X = data.datay = data.target # 第一部分: 对应 R 的 lm() 线性回归X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42)lr = LinearRegression().fit(X_train, y_train)pred_lm = lr.predict(X_test)print("lm 对应: R2 =", round(r2_score(y_test, pred_lm), 3))print("lm 对应: coef =", np.round(lr.coef_[:3], 3)) # 第二部分: 对应 R 的 glm() 二分类逻辑回归y_bin = (y > np.median(y)).astype(int)Xb_train, Xb_test, yb_train, yb_test = train_test_split( X, y_bin, test_size=0.2, random_state=42)glm_bin = LogisticRegression(max_iter=1000).fit(Xb_train, yb_train)pred_glm = glm_bin.predict(Xb_test)print("glm 对应: acc =", round(accuracy_score(yb_test, pred_glm), 3))print("glm 对应: coef =", np.round(glm_bin.coef_[0][:3], 3))
lm 和 glm 的建模范式,跑完即可看到线性回归的 R² 与逻辑回归的准确率。X_train, X_test, y_train, y_test = train_test_split(...)把数据切分为训练集和测试集,对应 R 中的建模“留出法”。LinearRegression().fit(X_train, y_train)等价于 R 的lm(),用最小二乘拟合线性模型。lr.predict(X_test)等价于 R 的predict(fit, newdata),在新样本上做预测。r2_score(y_test, pred_lm)计算 R²,对应 R 中summary(fit)输出的Multiple R-squared。(y > np.median(y)).astype(int)把连续目标二值化,模拟“是否超标”的分类场景。LogisticRegression(max_iter=1000).fit(Xb_train, yb_train)等价于 R 的glm(family=binomial),拟合逻辑回归。glm_bin.predict(Xb_test)输出 0/1 类别预测,对应 R 中predict(fit, type="response")的截断结果。
常见误区
误区我用 `lm()` 一跑,R² 是 0.95,我觉得模型特别完美,直接上线用就行。
正解R² 高只说明模型在训练数据上拟合得好,可能是在“背答案”。加入太多无关变量后,R² 也会虚高,但真实预测能力反而下降。判断模型好坏要看测试集上的表现,或调整后 R²、AIC 等更审慎的指标。
为何常见:R² 是最直观的输出指标,初学者天然会用“越大越好”的直觉去评价,却忽略了它掩盖的过拟合风险。
误区某变量的 p 值是 0.0001,另一个是 0.03,所以前者对结果的影响“大得多”。
正解p 值衡量的是“证据强度”而非“效应大小”。样本量够大时,一个微不足道的影响也能算出极小的 p 值。要看影响大小,应该读系数估计和置信区间;p 值只负责筛选“不能排除为零”的变量。
为何常见:多数人会本能地把“更不可能偶然”理解成“更强烈”,这正是对显著性检验的经典误读。
误区lm 和 glm 语法几乎一样,那 0/1 的结果我直接用 `lm()` 不就行了?先跑再说。
正解用 lm() 拟合 0/1 结果会得到“线性概率模型”,它可能预测出负数或大于 1 的概率值,且残差不满足正态、同方差假设。应该改用 glm(family = binomial),用逻辑曲线把预测限制在 0~1 之间。
为何常见:两者的公式写法几乎相同,让初学者误以为“换成 glm() 只是仪式感”,没有意识到链接函数带来的本质变化。
误区`summary(fit)` 里所有星星都打上了,R² 也不错,我认为模型已经“验证完成”,不需要再看那些复杂的图形。
正解显著性与拟合优度都不能保证模型假设成立。如果残差呈喇叭口或曲线分布,说明存在异方差或遗漏非线性项,此时系数的标准误和 p 值都不可信。plot(fit) 的四张诊断图,是下结论前必须扫一眼的“质检报告”。
为何常见:残差图不像 p 值和 R² 那样有“达标线”,需要主观判断,初学者容易因为不知道怎么解读而选择忽略。
面试题
Q1. 在 R 的 lm() 中,最小二乘法优化的目标函数是?
- A.残差平方和最小化← 正确答案
- B.绝对残差和最小化
- C.预测值总和最大化
- D.真实值总和最大化
答案:A。lm() 默认使用普通最小二乘,即让“真实值减预测值”的平方和最小。绝对残差和对应的是 LAD 回归而非默认方法;预测值总和、真实值总和与模型优化无关。
Q2. 公式 mpg ~ wt + hp 中的 + 号表示什么?
- A.加入一个预测变量← 正确答案
- B.两个变量做加法
- C.逻辑或的运算
- D.变量间的交互作用
答案:A。公式中的 + 表示把右侧变量“加入线性预测式”,不是算术加法,也不是逻辑运算。交互作用在 R 里用 : 或 * 表示,例如 wt:hp。
Q3. R² = 0.8 通常被解释为?
- A.八成的数据点落在直线上
- B.因变量方差被解释了八成← 正确答案
- C.模型通过了 80% 的显著性检验
- D.预测误差比均值模型少 80%
答案:B。R² 表示模型解释的因变量方差比例,即 80% 的波动被自变量解释。它不表示数据点落在直线上的比例,也不表示显著性检验通过率,更不能等价衡量预测误差的减少比例。
Q4. 回归中某系数 p 值 < 0.05 的正确解释是?
- A.模型整体犯错的概率小于 5%
- B.系数等于零的概率小于 5%
- C.原假设下取得该结果的概率低于 5%← 正确答案
- D.该变量存在确定的因果效应
答案:C。p 值是指在“系数为零”的原假设下,观察到当前或更极端结果的概率小于 5%。A 混淆了模型错误率,B 犯了“反向概率”错误,D 把统计显著与因果效应混为一谈。
Q5. glm 做二分类时,默认使用的链接函数是?
- A.恒等链接函数
- B.Logit 对数几率链接← 正确答案
- C.倒数对称链接
- D.幂指数链接
答案:B。glm(family = binomial) 默认使用 logit 链接,即 ln(p/(1-p))。恒等链接用于高斯族,倒数链接用于伽马族,平方根链接用于泊松族,都不是二分类默认选择。
Q6. 泊松族 family = poisson 最适合分析哪类数据?
- A.一天内交通事故发生次数← 正确答案
- B.身高和体重的关系数据
- C.股票每日涨跌的方向
- D.产品寿命的时长数据
答案:A。泊松回归面向“计数数据”,如事故次数、网页点击量。身高体重是连续型,适合 lm();涨跌方向是 0/1 二分类,适合 binomial;寿命数据通常用生存分析。
Q7. 回归中系数 t 值小、p 值大,但模型整体 F 检验显著,最可能的解释是?
- A.样本量太小导致检验失效
- B.变量之间存在多重共线性← 正确答案
- C.因变量不符合正态分布
- D.回归模型完全错误
答案:B。当预测变量高度相关时,系数标准误被膨胀,导致单个系数的 t 检验不显著,但模型整体的 F 检验依然显著。样本量小通常让所有检验都受影响,因变量正态性不是 OLS 的必要条件。
Q8. 比较两个嵌套模型,AIC 更小的模型意味着什么?
- A.拟合与复杂度权衡更优← 正确答案
- B.绝对预测误差一定更小
- C.模型的 R 方一定更高
- D.纳入的变量个数一定更少
答案:A。AIC = -2lnL + 2k,它在拟合优度和参数数量之间取平衡,越小说明权衡越优。AIC 不直接承诺预测误差一定更小,也不要求 R² 更高或变量更少。
Q9. 对 lm() 结果做残差诊断时,通常要检查哪些内容?
- A.残差是否近似正态分布← 正确答案
- B.残差是否具有相同方差← 正确答案
- C.残差是否相互独立← 正确答案
- D.残差与自变量是否无关← 正确答案
答案:ABCD。经典线性回归假设残差满足正态性、同方差、独立性、线性关系成立。plot(fit) 的四张图正是快速检查这四类问题的入口,A、B、C、D 均属于残差诊断范畴。
Q10. 关于线性回归推断,下列说法正确的是?
- A.加入新变量后 R 方不会下降← 正确答案
- B.调整 R 方可能因冗余变量下降← 正确答案
- C.变量高度相关会引起多重共线性← 正确答案
- D.系数显著即可证明因果关系
答案:ABC。普通最小二乘中加入新变量,R² 单调不减,A 正确;调整 R² 会惩罚冗余变量,可能下降,B 正确;高度相关的预测变量会引发多重共线性,C 正确;系数显著只说明统计关联,不能证明因果,D 错误。