使用statsmodels进行有序回归分析:理论与实战

使用statsmodels进行有序回归分析:理论与实战

statsmodels Statsmodels: statistical modeling and econometrics in Python statsmodels 项目地址: https://gitcode.com/gh_mirrors/st/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())

模型输出解读:

  1. 系数部分:表示自变量对潜在变量的影响

    • pared系数为正,说明父母有研究生学历会增加申请可能性
    • public系数为负,说明公立学校学生申请意愿较低
    • gpa系数为正,说明GPA越高申请意愿越强
  2. 阈值参数:区分不同类别的临界值

    • 使用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')

注意要点:

  1. 必须使用0 +去除截距项
  2. 因变量可以是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)

七、模型选择建议

  1. 分布选择

    • 如果潜在变量分布对称,选择logit或probit
    • 如果分布不对称,考虑cloglog等非对称连接函数
  2. 解释性

    • logit的系数可以解释为优势比(取指数后)
    • probit系数解释为标准差变化
  3. 预测性能

    • 可以通过交叉验证比较不同模型的预测准确率

有序回归是分析有序分类数据的强大工具,statsmodels的实现提供了丰富的功能和灵活性。通过合理选择连接函数和仔细解释模型结果,我们可以深入理解有序响应变量与预测变量之间的关系。

statsmodels Statsmodels: statistical modeling and econometrics in Python statsmodels 项目地址: https://gitcode.com/gh_mirrors/st/statsmodels

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙嫣女

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值