使用statsmodels进行有序回归分析:理论与实战
一、什么是有序回归?
有序回归(Ordinal Regression)是用于处理有序分类因变量的回归分析方法。当我们的因变量是像"不满意"、"一般"、"满意"这样的有序类别时,传统的线性回归不再适用,而有序回归正是解决这类问题的利器。
在statsmodels库中,OrderedModel
类提供了有序回归的实现,支持多种连接函数(link function),包括:
- 概率单位(probit)
- 逻辑单位(logit)
- 以及用户自定义的分布
二、数据准备与探索
我们将使用一个经典的学生申请研究生院的数据集,包含400个观测值。主要变量包括:
import numpy as np
import pandas as pd
from statsmodels.miscmodels.ordinal_model import OrderedModel
# 加载数据
data_student = pd.read_stata("ologit.dta")
print(data_student.head())
关键变量说明:
- apply: 申请可能性(有序分类变量)
- "unlikely"(不太可能)
- "somewhat likely"(有可能)
- "very likely"(非常可能)
- pared: 父母是否有研究生学历(0/1)
- public: 当前本科院校是否为公立(0/1)
- gpa: 平均绩点(0-4)
三、构建有序回归模型
3.1 Probit有序回归
Probit模型假设潜在变量服从标准正态分布:
mod_prob = OrderedModel(data_student['apply'],
data_student[['pared', 'public', 'gpa']],
distr='probit')
res_prob = mod_prob.fit(method='bfgs')
print(res_prob.summary())
模型输出解读:
-
系数部分:表示自变量对潜在变量的影响
- pared系数为正,说明父母有研究生学历会增加申请可能性
- public系数为负,说明公立学校学生申请意愿较低
- gpa系数为正,说明GPA越高申请意愿越强
-
阈值参数:区分不同类别的临界值
- 使用
transform_threshold_params
方法获取实际阈值
- 使用
num_of_thresholds = 2
mod_prob.transform_threshold_params(res_prob.params[-num_of_thresholds:])
3.2 Logit有序回归
Logit模型使用逻辑分布,结果解释与Probit类似但尺度不同:
mod_log = OrderedModel(data_student['apply'],
data_student[['pared', 'public', 'gpa']],
distr='logit')
res_log = mod_log.fit(method='bfgs', disp=False)
print(res_log.summary())
3.3 模型预测与评估
# 预测各类别概率
predicted = res_log.model.predict(res_log.params,
exog=data_student[['pared', 'public', 'gpa']])
# 计算预测准确率
pred_choice = predicted.argmax(1)
accuracy = (np.asarray(data_student['apply'].values.codes) == pred_choice).mean()
print(f'预测准确率: {accuracy:.2%}')
四、高级应用:自定义分布
除了内置的probit和logit,我们可以使用任何SciPy的连续分布,甚至自定义分布:
# 自定义cloglog分布
class CLogLog(stats.rv_continuous):
def _ppf(self, q):
return np.log(-np.log(1 - q))
def _cdf(self, x):
return 1 - np.exp(-np.exp(x))
cloglog = CLogLog()
# 使用自定义分布拟合模型
res_cloglog = OrderedModel(data_student['apply'],
data_student[['pared', 'public', 'gpa']],
distr=cloglog).fit(method='bfgs', disp=False)
五、使用公式语法
statsmodels支持R风格的公式语法,使模型构建更加直观:
modf_logit = OrderedModel.from_formula(
"apply ~ 0 + pared + public + gpa",
data_student,
distr='logit')
resf_logit = modf_logit.fit(method='bfgs')
注意要点:
- 必须使用
0 +
去除截距项 - 因变量可以是pandas的有序分类变量或数值编码
六、有序回归与二元Logit的关系
当因变量只有两个类别时,有序回归等价于二元Logit模型(参数符号相反):
# 筛选二分类数据
data2 = data_student[data_student['apply'] != "somewhat likely"].copy()
# 有序回归
mod_log = OrderedModel(data2['apply'],
data2[['pared', 'public', 'gpa']],
distr='logit')
res_log = mod_log.fit(method='bfgs', disp=False)
# 二元Logit
from statsmodels.discrete.discrete_model import Logit
mod_logit = Logit(data2['apply'].cat.codes,
add_constant(data2[['pared', 'public', 'gpa']]))
res_logit = mod_logit.fit(method='bfgs', disp=False)
七、模型选择建议
-
分布选择:
- 如果潜在变量分布对称,选择logit或probit
- 如果分布不对称,考虑cloglog等非对称连接函数
-
解释性:
- logit的系数可以解释为优势比(取指数后)
- probit系数解释为标准差变化
-
预测性能:
- 可以通过交叉验证比较不同模型的预测准确率
有序回归是分析有序分类数据的强大工具,statsmodels的实现提供了丰富的功能和灵活性。通过合理选择连接函数和仔细解释模型结果,我们可以深入理解有序响应变量与预测变量之间的关系。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考