0、引言
广义线性模型------把"线性"的边界再推远一步
距离国赛还有2天,今天我们来精讲一个在国赛中出场率极高、但很多队伍只会套代码不会解释 的核心模型------广义线性模型(GLM)。
国赛数据题的常见场景是:因变量不是连续正态分布------可能是0/1二分类(某事件发不发生)、可能是计数(事故次数、患病数量)、也可能是偏态严重的连续值。这时候再用线性回归,假设就不成立了。广义线性模型正是为此而生。
一、什么是广义线性模型?
一句话概括: 广义线性模型是线性回归的"扩展版"------它允许因变量的分布不再是正态分布,允许因变量的期望值与自变量的线性组合之间通过一个连接函数联系起来。
核心公式: g(E(Y)) = β₀ + β₁X₁ + β₂X₂ + ... + βₚXₚ
其中g(·)就是连接函数,它把"因变量的期望值"和"自变量的线性组合"连接起来。
什么时候用? 判断标准很简单:看因变量的类型。因变量是连续正态分布→线性回归;因变量是0/1二分类→Logistic回归(二项分布+logit连接);因变量是计数(0,1,2,3...)→泊松回归(泊松分布+log连接)。
二、国赛中最常用的三种GLM
1. Logistic回归------因变量是二分类
适用场景: 因变量只有两个取值,比如"成功/失败""患病/未患病""通过/不通过"。
连接函数: logit连接,即 log(p/(1-p)) = β₀ + β₁X₁ + ...,这里的p是事件发生的概率。
R代码示例(用glm函数):
r
# 以高压电线对牲畜影响的实验为例
norell <- data.frame(
x=0:5,
n=rep(70,6),
success=c(0,9,21,47,60,63)
)
> norell
x n success
1 0 70 0
2 1 70 9
3 2 70 21
4 3 70 47
5 4 70 60
6 5 70 63
# 构建二元响应变量(成功次数,失败次数)
norell$Ymat <- cbind(norell$success, norell$n - norell$success)
# 拟合Logistic回归
glm.sol <- glm(Ymat ~ x, family=binomial, data=norell)
summary(glm.sol)
Call:
glm(formula = Ymat ~ x, family = binomial, data = norell)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.3010 0.3238 -10.20 <2e-16 ***
x 1.2459 0.1119 11.13 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 250.4866 on 5 degrees of freedom
Residual deviance: 9.3526 on 4 degrees of freedom
AIC: 34.093
Number of Fisher Scoring iterations: 4
# 预测电流强度为3.5时的响应概率
pre <- predict(glm.sol, data.frame(x=3.5))
p <- exp(pre)/(1+exp(pre)) # 结果为0.7426,即74.3%的牛会有响应
输出结果解读:
- 系数(Coefficients): 截距-3.3010,x的系数1.2459,两者都高度显著(p<0.001)
- 残差偏差(Residual deviance): 9.3526,自由度4,说明模型拟合尚可
- AIC: 34.093,用于模型比较
国赛论文中的解释话术:
"由于因变量为二分类变量(是否......),不满足线性回归的正态性假设,本文采用Logistic回归模型进行分析。模型估计结果显示,自变量X的系数为β,优势比(Odds Ratio)为e^β = 数值,即在控制其他因素后,X每增加一个单位,事件发生的优势比变为原来的百分比。"
系数解读技巧: Logistic回归的系数直接解释为"优势比的对数"。比如黑人比例对支持率的模型,系数为-0.0132,说明黑人比例每增加一个百分点,支持的发生比降低到原来的e^(-0.0132)=0.987,即降低1.3%。
2. 泊松回归------因变量是计数
适用场景: 因变量是非负整数计数,比如"某路段事故次数""某地区患病人数""家庭人口数"。
连接函数: log连接,即 log(λ) = β₀ + β₁X₁ + ...,其中λ是计数的期望值。
R代码示例(以家庭人口数研究为例):
r
# 加载数据(菲律宾2015年调查,1500户家庭)
# 因变量total:除户主外的家庭人数(计数0-16人)
# 自变量age:户主年龄
# 拟合泊松回归
glm.pois <- glm(total ~ age, family=poisson, data=dfp)
summary(glm.pois)
# 输出关键结果:
# Coefficients:
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 1.5499422 0.0502754 30.829 < 2e-16 ***
# age -0.004...
注意事项:
- 因变量是计数,理论上可以取0(所以例题中扣除了户主,因为包括户主人数至少为1)
- 泊松回归假设均值=方差。如果方差远大于均值(过度离势),需要考虑改用负二项回归或quasi泊松
- 如果自变量与因变量对数之间呈非线性关系,可能需要加入自变量的二次项
国赛论文中的解释话术:
"因变量Y为计数型变量,取值范围为非负整数,故采用泊松回归模型。模型估计结果显示,自变量X的系数为β,即X每增加一个单位,Y的期望值变为原来的e^β=数值倍。"
3. 正态GLM------其实就是线性回归
当因变量服从正态分布,连接函数为恒等(identity)时,GLM退化为普通线性回归。使用glm(..., family=gaussian)与lm()结果完全相同。国赛中一般直接用lm,不需要绕到GLM。
三、三种模型的快速选择表
| 因变量类型 | 分布族 | 连接函数 | R中family参数 | 国赛常见场景 |
|---|---|---|---|---|
| 连续、正态 | 高斯(正态) | 恒等 | gaussian | 不符合,用lm即可 |
| 0/1二分类 | 二项分布 | logit | binomial | 是否患病、是否违约 |
| 计数(0,1,2...) | 泊松分布 | log | poisson | 事故次数、需求数量 |
| 计数且过度离势 | 负二项 | log | 需用MASS::glm.nb() | 计数数据方差远大于均值 |
四、模型诊断:四个必须检查的指标
用glm()跑完模型后,summary()输出一大堆内容。国赛论文里必须报告的有:
1. 系数估计与显著性(Coefficients + Pr(>|z|))
- 报告每个自变量的系数估计值、标准误、p值
- p<0.05说明该变量显著,论文中打上"***"或写"在5%水平下显著"
2. 残差偏差(Residual deviance)与自由度
- 如果残差偏差远大于自由度,说明模型拟合不足或存在过度离势
- 可以用残差偏差的卡方检验比较两个嵌套模型
3. AIC(赤池信息准则)
- 用于比较不同模型:AIC越小,模型越好
- 如果使用quasi族(如quasibinomial),则AIC不可用,改用残差偏差比较
4. 过度离势检验
- 二项分布和泊松分布默认离势参数为1
- 如果残差偏差/自由度远大于1,说明存在过度离势
- 解决方法:改用
family=quasibinomial或quasipoisson,此时标准误会放大,p值会更保守
五、国赛论文中的完整写作模板
如果你们决定用Logistic回归:
3.X Logistic回归模型
3.X.1 模型构建
由于因变量为二分类变量(Y=1表示......,Y=0表示......),不满足线性回归模型的正态性假设,本文采用Logistic回归模型进行分析。设事件发生的概率为p,则Logistic回归模型的形式为:
log(p/(1-p)) = β₀ + β₁X₁ + ... + βₚXₚ
其中X₁,...,Xₚ为解释变量,β为待估系数。模型采用最大似然估计进行参数估计,使用R软件的glm()函数拟合。
3.X.2 模型估计结果
模型估计结果如表X所示。从结果看,变量X₁的系数为β₁=,p值为(<0.05),说明该变量对因变量有显著影响。对应的优势比OR=e^β₁=____,即X₁每增加一个单位,事件发生优势比变为原来的____倍。
3.X.3 模型检验
模型残差偏差为____,自由度为____,AIC为____。与仅包含常数项的零模型相比(零偏差为____),偏差下降了____,说明模型整体具有解释力。
如果你们决定用泊松回归:
结构同上,只需把公式改为log(λ)=β₀+β₁X₁+...,把"优势比"改为"发生率比(IRR)=e^β",把"二分类"改为"计数型"。