第一章:R语言广义线性模型与分布族概述
广义线性模型(Generalized Linear Models, GLM)是传统线性回归的扩展,允许响应变量服从非正态分布,并通过链接函数将线性预测子与期望响应关联。在R语言中,`glm()` 函数是实现GLM的核心工具,支持多种分布族和链接函数,适用于分类、计数、连续等多种数据类型。
分布族与链接函数的选择
GLM的关键在于选择合适的分布族和链接函数。常见的分布族包括:
- 高斯(Gaussian):用于连续型响应变量,等价于普通线性回归
- 二项(Binomial):适用于二分类问题,如成功/失败结果
- 泊松(Poisson):用于计数数据,假设均值等于方差
- 伽马(Gamma):适合右偏连续数据,如等待时间
每种分布对应默认链接函数,例如二项分布使用logit链接,泊松分布使用log链接。
使用R构建GLM模型
以下示例展示如何在R中拟合一个逻辑回归模型(二项GLM):
# 加载示例数据
data("mtcars")
# 拟合二项GLM:预测发动机类型(V/S)
model <- glm(vs ~ mpg + wt, data = mtcars, family = binomial(link = "logit"))
# 输出模型摘要
summary(model)
上述代码中,`family = binomial(link = "logit")` 指定使用二项分布和logit链接函数。`mpg` 和 `wt` 作为协变量用于预测 `vs`(发动机形状),`summary()` 提供系数估计、显著性检验等统计信息。
常见分布族对照表
| 分布族 | 适用数据类型 | 默认链接函数 |
|---|
| Gaussian | 连续数值 | identity |
| Binomial | 二分类或比例 | logit |
| Poisson | 计数数据 | log |
| Gamma | 正偏连续数据 | inverse |
第二章:高斯分布族在GLM中的理论与实践
2.1 高斯分布的数学基础与假设条件
高斯分布(正态分布)是统计学中最核心的概率分布之一,其概率密度函数定义为:
f(x | \mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right)
其中,$\mu$ 表示均值,决定分布的中心位置;$\sigma^2$ 为方差,控制分布的宽度。该函数对称于 $\mu$,且约68%的数据落在 $\mu \pm \sigma$ 区间内。
核心假设条件
高斯分布的应用依赖以下几个关键假设:
- 数据独立同分布(i.i.d.)
- 总体误差服从正态性假设
- 方差齐性:不同输入下的噪声方差恒定
参数影响分析
当 $\mu = 0, \sigma = 1$ 时,称为标准正态分布。改变 $\mu$ 平移曲线,调整 $\sigma$ 则影响峰度与尾部厚度。
2.2 使用gaussian族拟合连续响应变量
在广义线性模型中,gaussian族用于处理连续型响应变量,假设误差项服从正态分布。该设定下,模型通过恒等链接函数将线性预测器与响应变量的期望值直接关联。
模型构建示例
model <- glm(y ~ x1 + x2, family = gaussian, data = dataset)
summary(model)
上述代码使用R语言构建高斯族GLM。参数
family = gaussian指定响应变量服从正态分布,默认链接函数为恒等链接(identity link)。输出结果包含系数估计、标准误及显著性检验。
关键特性对比
| 分布族 | 典型响应类型 | 默认链接函数 |
|---|
| Gaussian | 连续数值 | 恒等 |
| Binomial | 二分类 | logit |
2.3 模型诊断与残差分析实战
残差图的可视化诊断
通过绘制残差图可直观判断模型假设是否成立。理想情况下,残差应随机分布在零线附近,无明显模式。
import matplotlib.pyplot as plt
import seaborn as sns
sns.residplot(x=y_pred, y=residuals, lowess=True, line_kws={'color': 'red'})
plt.xlabel('预测值')
plt.ylabel('残差')
plt.title('残差 vs 预测值')
plt.show()
该代码绘制了残差对预测值的散点图,其中
lowess=True添加了平滑趋势线,便于识别非线性模式。若趋势线明显偏离零线,说明模型可能存在异方差或非线性问题。
常见残差模式分析
- 漏斗形扩散:表明误差方差随预测值增大,存在异方差;
- 曲线趋势:提示模型未捕捉到非线性关系;
- 离群点密集:可能含有异常样本或数据录入错误。
2.4 处理异方差性与变换技巧
在回归分析中,异方差性会导致参数估计的方差偏误,影响模型推断的准确性。为缓解这一问题,数据变换是常用且有效的手段。
常见变换方法
- 对数变换:适用于右偏数据,压缩数值范围,稳定方差;
- 平方根变换:轻度压缩,适合计数型数据;
- Box-Cox 变换:统一框架下的幂变换族,自动选择最优参数。
Box-Cox 变换示例代码
from scipy import stats
import numpy as np
# 假设 data 存在异方差
data = np.array([1, 2, 5, 10, 20, 50, 100])
transformed_data, lambda_val = stats.boxcox(data + 1) # 加1避免零值
print(f"最优λ: {lambda_val:.3f}")
该代码调用 scipy.stats.boxcox 对非负数据进行变换,自动搜索使变换后数据最接近正态分布的 λ 参数。加1操作确保无零值输入,符合函数要求。
效果对比
| 变换类型 | 适用场景 | 方差稳定性提升 |
|---|
| 对数 | 指数增长数据 | 高 |
| 平方根 | 泊松类数据 | 中 |
| Box-Cox | 通用连续数据 | 高 |
2.5 实例演练:房价预测的线性回归建模
数据准备与特征分析
使用波士顿房价数据集,选取房屋面积、房间数、地理位置等关键特征。通过 pandas 进行数据清洗与归一化处理,确保输入特征量纲一致。
模型构建与训练
采用 scikit-learn 实现线性回归模型:
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LinearRegression()
model.fit(X_train, y_train)
代码中
LinearRegression() 初始化模型,
fit() 方法执行最小二乘法求解权重参数,训练集用于拟合特征与房价间的线性关系。
性能评估
使用均方误差(MSE)和决定系数(R²)评估预测效果,R² 接近 1 表示模型解释性强,预测趋势可靠。
第三章:二项分布族在分类问题中的应用
3.1 二项分布与逻辑回归的理论关联
概率模型的基础假设
逻辑回归虽名为“回归”,实则是一种分类模型,其理论根基建立在二项分布之上。当因变量仅取0或1时,可视为一次伯努利试验,而多次独立试验的总成功次数服从二项分布。
从线性输出到概率映射
逻辑回归通过Sigmoid函数将线性组合映射为概率:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
其中
z = w^T x + b,Sigmoid确保输出值落在(0,1)区间,恰好对应事件发生的概率,符合二项分布中成功概率p的定义。
似然函数与参数估计
基于二项分布的概率质量函数,逻辑回归采用最大似然估计法。设样本独立,似然函数为:
- 单样本概率:$P(y|x;\theta) = p^y (1-p)^{1-y}$
- 整体似然:$\prod_{i=1}^{n} p_i^{y_i} (1-p_i)^{1-y_i}$
- 对数化后转化为交叉熵损失函数
3.2 使用binomial族构建Logistic回归模型
在广义线性模型(GLM)中,binomial族适用于响应变量为二分类的情形。Logistic回归通过logit链接函数将线性预测值映射到(0,1)区间,输出事件发生的概率。
模型构建语法
model <- glm(y ~ x1 + x2,
data = dataset,
family = binomial(link = "logit"))
其中,
family = binomial 指定响应变量服从二项分布,
link = "logit" 设置默认的logit链接函数。模型估计采用最大似然法,回归系数表示自变量对对数几率(log-odds)的影响。
关键输出解释
- 系数符号:正系数增加事件发生概率
- p值:评估变量统计显著性
- 偏差(Deviance):衡量模型拟合优度
3.3 分类性能评估与ROC曲线实现
在分类模型的性能评估中,准确率并非唯一指标,尤其在类别不平衡场景下,ROC曲线提供了更全面的判断依据。通过计算不同阈值下的真正率(TPR)与假正率(FPR),可绘制出ROC曲线。
ROC曲线绘制代码实现
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
# 假设y_true为真实标签,y_scores为预测概率
fpr, tpr, thresholds = roc_curve(y_true, y_scores)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, label=f'ROC Curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], 'k--', label='Random Classifier')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
该代码首先调用
roc_curve生成各阈值对应的FPR与TPR,
auc函数计算曲线下面积。AUC越接近1,模型区分能力越强。
评估指标对比
| 指标 | 定义 | 适用场景 |
|---|
| 准确率 | (TP+TN)/Total | 类别均衡 |
| AUC-ROC | ROC曲线下面积 | 类别不均衡 |
第四章:泊松与负二项分布族在计数数据中的建模
4.1 泊松分布的适用场景与过离散识别
泊松分布常用于建模单位时间内稀有事件的发生次数,适用于事件独立发生且平均发生率恒定的场景,如服务器每分钟接收到的请求数、网络故障报警次数等。
典型适用条件
- 事件在不相交时间区间内独立发生
- 单位时间内的平均发生率 λ 恒定
- 两个事件几乎不会同时发生
过离散的识别方法
当观测数据的方差显著大于均值时,表明存在过离散(overdispersion),此时泊松分布不再适用。可通过以下方式检验:
import numpy as np
# 假设 count_data 为观测到的事件频次
mean = np.mean(count_data)
variance = np.var(count_data)
print(f"均值: {mean:.2f}, 方差: {variance:.2f}")
if variance > mean * 1.5:
print("存在显著过离散,建议使用负二项回归")
该代码通过比较均值与方差的比例判断是否满足泊松假设。若方差远超均值,则应考虑使用负二项分布等更灵活的模型。
4.2 使用poisson族建模事件发生频次
在统计建模中,当响应变量表示单位时间或空间内事件发生的次数时,Poisson分布成为理想选择。该分布假设事件独立发生且平均发生率恒定,适用于如网站访问量、客服来电数等计数数据。
模型假设与适用场景
Poisson回归要求因变量为非负整数,且均值等于方差(等离散性)。若数据呈现过离散(方差大于均值),需考虑负二项回归替代。
代码实现示例
# 使用glm拟合Poisson回归
model <- glm(count ~ x1 + x2, family = poisson(link = "log"), data = dataset)
summary(model)
上述代码中,
family = poisson(link = "log") 指定使用对数链接函数的Poisson族,确保预测值非负。系数解释为单位自变量变化引起的事件发生率的对数比值变化。
常见诊断指标
- 残差分析:检查偏差残差是否符合模型假设
- 过离散检验:通过残差偏差与自由度之比判断是否需调整模型
4.3 负二项回归对过离散的解决方案
在计数数据建模中,泊松回归常因假设均值等于方差而无法应对过离散(overdispersion)现象。当观测数据的方差显著大于均值时,模型推断将产生偏差。
负二项回归的优势
负二项回归通过引入额外的参数来建模方差,允许方差大于均值,从而有效处理过离散问题。其方差形式为 $\text{Var}(Y) = \mu + \alpha\mu^2$,其中 $\alpha$ 控制过离散程度。
代码实现示例
import statsmodels.api as sm
import pandas as pd
# 假设 df 包含响应变量 'counts' 和协变量 'x1', 'x2'
X = df[['x1', 'x2']]
X = sm.add_constant(X)
y = df['counts']
# 拟合负二项回归模型
model = sm.GLM(y, X, family=sm.families.NegativeBinomial())
result = model.fit()
print(result.summary())
该代码使用 `statsmodels` 库拟合负二项回归模型。`NegativeBinomial` 家族自动估计离散参数,无需手动设定。`GLM` 框架提供灵活接口,适用于多种广义线性模型。
4.4 实战案例:交通事故次数的统计建模
在本案例中,我们基于某城市交通部门提供的历史数据,构建泊松回归模型来预测特定路段每日交通事故发生次数。该模型适用于计数型响应变量,假设事故次数服从泊松分布。
数据预处理
原始数据包含时间、天气、能见度、道路类型等字段。我们对分类变量进行独热编码,并提取小时、星期等时间特征以捕捉周期性模式。
模型实现
使用Python的`statsmodels`库构建广义线性模型(GLM):
import statsmodels.api as sm
import pandas as pd
# 加载并准备数据
X = pd.get_dummies(data[['hour', 'weather', 'road_type']])
X = sm.add_constant(X) # 添加截距项
y = data['accident_count']
# 拟合泊松回归模型
model = sm.GLM(y, X, family=sm.families.Poisson()).fit()
print(model.summary())
代码中,`family=sm.families.Poisson()`指定响应变量服从泊松分布,`GLM`框架自动采用最大似然估计参数。输出结果包含各协变量的回归系数及其显著性,例如“雨天”可能对应较高的事故风险比。
性能评估
通过残差分析与过离散检验验证模型合理性,必要时可改用负二项回归增强鲁棒性。
第五章:四大分布族的比较与选择策略
适用场景与性能特征对比
在实际系统设计中,正态、泊松、指数和伽马分布族常用于建模不同类型的随机现象。例如,服务请求到达间隔适合用指数分布描述,而单位时间内请求数则更适合泊松分布。
| 分布族 | 典型应用场景 | 关键参数 | 支持偏态 |
|---|
| 正态 | 响应时间均值分析 | μ, σ | 否 |
| 泊松 | 事件计数(如每秒请求数) | λ | 是 |
| 指数 | 等待时间建模 | λ | 是 |
| 伽马 | 累计等待时间或故障间隔 | k, θ | 是 |
基于数据形态的选择流程
- 首先检验数据是否对称:若近似对称且集中于均值,优先尝试正态分布拟合
- 对于离散计数数据,使用泊松分布并验证方差与均值是否接近
- 若观测到显著偏态,考虑指数或伽马分布,通过最大似然估计拟合参数
- 利用AIC/BIC准则进行模型选择,避免过度假设
实战案例:API 请求延迟建模
某微服务系统记录了连续10分钟的请求延迟数据,呈现右偏特性。采用伽马分布拟合后,K-S检验p值为0.83,显著优于正态假设下的0.02。
// 使用Go语言拟合伽马分布参数
func fitGamma(data []float64) (k, theta float64) {
mean := stats.Mean(data)
variance := stats.Variance(data)
k = mean * mean / variance
theta = variance / mean
return
}