热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python的ols_工具方法|6行代码教你用Python做OLS回归(内附CFPS实例)

写在前面的话阅读本文前需要掌握的基础知识:Python的基础知识、numpy的基础知识、pandas的基础知识、基本的计量知识。如果你还不会,那么本文也

写在前面的话

阅读本文前需要掌握的基础知识:Python 的基础知识、 numpy 的基础知识、 pandas 的基础知识、基本的计量知识。如果你还不会,那么本文也会介绍一些 python 语法的基础内容,方便大家理解。

随着数据资源的日渐丰富,学者们越来越多的需要接触到大数据的处理,许多学者还是习惯使用 Stata 对数据进行处理,而 Stata 由于其自身的限制,在处理大数据集时要么需要强劲的处理性能(昂贵的硬件成本),要么需要等待较长时间(更加昂贵的时间成本)。Python 和 R 也就日渐进入学者的视野,相对于 R ,Python 的语法更为简单,成为一部分学者的首选。

在数据处理上,numpy 和 pandas 的组合,使得 Python 能够轻松应对千万级别的数据处理。在攻克数据处理这一环后,在数据应用上,除了新潮的机器学习、深度学习的方法,对于现阶段社科学者来说,计量可能才是最现实的。在 Python 中处理的数据如果还需要调回到 Stata 中做计量,那未免太「蹩脚」。今天,数据Seminar 公众号将带大家体验 Python 上的第三方计量库:Statsmodels[1] 。

简介

Statsmodels 是一个Python的第三方模块,他封装了许多计量模型,方便学者直接调用。所谓封装,就相当于 Stata 中一个 reg 命令,代表了最基础的 OLS 回归命令,在Statsmodels 中也有类似 reg 的语句,提供给 OLS 估计。另外 Statsmodels 的开源协议为 BSD [2](基本上对于用户来说属于为所欲为协议,你可以任意使用这款扩张包,具体参见链接地址)。statsmodels is a Python module that provides classes and functions for the estimation of many different statistical models, as well as for conducting statistical tests, and statistical data exploration. An extensive list of result statistics are available for each estimator. The results are tested against existing statistical packages to ensure that they are correct. The package is released under the open source Modified BSD (3-clause) license. The online documentation is hosted at statsmodels.org.

安装

如果你使用 Anaconda 安装的 python ,那么:conda install statsmodels

如果你使用 pip 管理你的python包,那么:pip install statsmodels # python2

或者:pip3 install statsmodels #python3

“精读”代码,初探:OLS

首先先看了一下 OLS 的示例:import numpy as np

import statsmodels.api as sm

import statsmodels.formula.api as smf

dat = sm.datasets.get_rdataset("Guerry", "HistData").data

results = smf.ols('Lottery ~ Literacy + np.log(Pop1831)', data=dat).fit()

print(results.summary())

运行后:

本文采用的编辑器为 Google 的 colab

是的,OLS就是这么几行,具体来看内容,其实进行 OLS 回归只需要一行内容。为了方便 Python 基础不那么好的同学,我们驻行“精读”一遍这些代码:

1. 导入模块import numpy as np

import statsmodels.api as sm

import statsmodels.formula.api as smf

首先是需要导入 numpy、statsmodels 的相关模块,numpy 推荐的缩写命名 np,statsmodels 推荐的缩写命名是 sm,这样后面的代码就可以通过 np.[具体的函数\方法] ,sm. [具体的函数\方法] 的方式来更加简洁的调用了。

2. 生成测试数据集dat = sm.datasets.get_rdataset("Guerry", "HistData").data

这个数据集以DataFrame 格式的储存在了 dat 这个变量中。DataFrame 格式在 Python 中被广泛的使用,可以说无论是机器学习还是本文介绍的计量相关内容,DataFrame 格式相关的操作都需要熟练掌握。关于 DataFrame 的相关内容,需要更加细致的去学习Python的另一个第三方库 pandas ,本文不再赘述。

3. 回归操作

results = smf.ols('Lottery ~ Literacy + np.log(Pop1831)', data=dat).fit()

首先是smf.ols, smf 就是前面的 statsmodels.formula.api ,OLS 回归的方法在 statsmodels.formula.api下,如果前文没有声明 smf 代表statsmodels.formula.api 的话,你这里可就要写成 statsmodels.formula.api.ols 了,可见合理的缩写声明对于代码的简洁美观非常有帮助。

接下来是括号内的内容('Lottery ~ Literacy + np.log(Pop1831)', data=dat)这其实是OLS模型需要传入的参数,以,为区隔,第一个参数是回归模型,第二个参数是数据。

在这行代码中,回归模型是:'Lottery ~ Literacy + np.log(Pop1831)',数据是前面加载的dat ,比较方便的是,statsmodels,直接从数据dat中读取了变量名称,并不需要进行额外的赋值操作。我们具体看一下这个模型的写法,对于没有接触过 Python 和 R 的读者来说,这种写法可能相对有些陌生,其实这个模型代表了:

这种写法参考了R的相关内容,具体是由 Python 中的 Patsy 库实现的。上面这个就是一个计量模型(他当然不是计算 Literacy + np.log(Pop1831)的和,Literacy 和 np.log(Pop1831) 都是矩阵)。这就和 Stata 中 reg y x0 x1 x2 是一样,只是在Python 中模型需要写成y~x0+x1+x2,而 reg 需要写成 smf.ols()。

这个模型中还用到了一个知识点:np.log ,就是说引用了 numpy 中的 log 函数,对变量Pop1831 取对数,就是使用 numpy 进行 log 运算。如果你直接写 log(Pop1831),Python是不知道 log 是做什么的,所以要告诉 Python,这个 log 来自于 numpy,这样 Python 就能正常处理 Pop1831 这个数据切片(“切片” 是Python数据处理中常用名词,可以理解为一个 DataFrame 的一列、一行或者几列、几行的数据)了。

最后 data=dat 就是声明对于这个模型,使用的数据时 dat, 这样前面的模型中的 Lottery 、Literacy 和 Pop1831,statsmodels 都能智能的去从 DataFrame 切片(切片操作需要学习Pandas哦),然后应用到模型中。

括号内的内容就是进行回归操作的核心。

括号外还有.fit(),就是告诉 Python,可以进行回归计算了。如果没有这个.fit() ,Python 只会记录这个模型和相关的数据信息,而添加了.fit(),记录时回归后的结果。

上图可以看到储存在计算机中的内容是有差异的\n同样,.fit() 后输出的结果也并非像 Stata 那样那样直接输出的是结果,而是将结果储存,可以进行多种方式的调用。

如果想输入结果,那么就使用 results.summary() ,将其打印出来,正如示例中展示的那样:

OLS 实例

这里简单演示一下 OLS 回归,数据处理这一部分内容,在 Python 中主要使用 numpy 和 pandas,这里就不演示,本文直接读取处理完的数据来演示 OLS 的内容:

本文的数据来自CFPS,主要研究的内容是子女认知能力和父母是否创业的关系,处理后的第一个回归模型的内容主要是,母亲的创业状态(self_employed_m_16),教育年限(edu),是否参加课外补习(extra_classes),家庭药品支出(expend_medical)、自评健康状况(health)、家庭氛围(quarrel)、与母亲同住时长(livewith_m)、与父亲同住时常(livewith_f)、log的家庭收入(lg_fin)、子女数量(num_chd)、母亲的受教育程度(edu_m)、父亲的受教育程度(edu_f)、户口(hukou)、东中西部虚拟变量(east 、 west),然后被解释变量就是认知能力(y_rznl)。import numpy as np

import pandas as pd

import statsmodels.api as sm

import statsmodels.formula.api as smf

df = pd.read_csv("testing.csv")

OLS_1 = smf.ols("y_rznl~ self_employed_m_16 + edu + extra_classes + \

expend_medical + health + quarrel + livewith_m + livewith_f + \

lg_fin + num_chd + edu_m + edu_f + hukou + east + west", data=df).fit()

print(OLS_1.summary())

最后输出结果:

而stata输出的结果(置信区间是97.5%):

可以看到,结果基本一致。

最后,在OLS这里案例中,可以看到 Python 输出结果基本与 Stata 相同,在代码的撰写上, Python 同样非常方便,并且由于 Python 是一门编程语言,在一些循环的撰写上非常有优势,例如我需要多次循环某几个变量,以及对应的被解释变量:import numpy as np

import pandas as pd

import statsmodels.api as sm

import statsmodels.formula.api as smf

df = pd.read_csv("testing.csv")

y_list =[y1, y2, y3, y4] # 被解释变量的列表

x0_list = [x0_1, x0_2, x0_3, x0_4, x0_5] # 某一个解释变量的列表

model_list = []

for y in y_list:

for x0 in x0_list:

model = "%s ~ %s + edu + extra_classes + \

expend_medical + health + quarrel + livewith_m + livewith_f + \

lg_fin + num_chd + edu_m + edu_f + hukou + east + west" % (y, x0)

OLS = smf.ols(model, data = df).fit()

print(OLS.summary())

这样就能一次性依次输出,以下内容的回归结果:y1 = x0_1 + edu + extra_calsses +...

y1 = x0_2 + edu + extra_calsses +...

y1 = x0_3 + edu + extra_calsses +...

y1 = x0_5 + edu + extra_calsses +...

y2 = x0_1 + edu + extra_calsses +...

y2 = x0_2 + edu + extra_calsses +...

y2 = x0_5 + edu + extra_calsses +...

y4 = x0_5 + edu + extra_calsses +...

所以无论是数据处理还是计量回归中,都能给你极大的便利。

相比Stata,Python 是免费开源的,不需要额外的授权费用,并且如果志在机器学习,那么先从相对熟悉的计量入手或许是一个不错的选择。

参考资料:

文章首发于公众号 数据Seminar工具&方法 | 6行代码教你用python做OLS回归(内附CFPS实例)​mp.weixin.qq.com

更多精彩内容请关注公众号数据Seminar



推荐阅读
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 如何在Python中配置库并创建可视化对象:详细指南与实践步骤
    本文详细介绍了如何在Python中配置库并创建复杂的可视化对象。通过具体的实践步骤,读者将学会利用Python的强大功能来实现高度定制化的数据可视化,特别是在PowerBI环境中,Python能够显著提升可视化的灵活性和表现力。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • Git核心命令全解析:掌握日常开发必备技能
    本文深入解析了 Git 的核心命令,帮助开发者掌握日常开发中的必备技能。从 `git init` 命令开始,介绍了如何将当前目录转变为 Git 可管理的仓库。接着详细讲解了 `git add` 命令的使用方法,包括如何将文件(如 `readme.txt`)添加到暂存区,以便在后续提交时进行版本控制。此外,还探讨了其他关键命令,如 `git commit` 和 `git push`,以确保代码变更能够安全地保存和同步到远程仓库。通过这些命令的综合应用,开发者可以更加高效地管理和协作项目。 ... [详细]
  • 在C#中开发MP3播放器时,我正在考虑如何高效存储元数据以便快速检索。选择合适的数据结构,如字典或数组,对于优化性能至关重要。字典能够提供快速的键值对查找,而数组则在连续存储和遍历方面表现优异。根据具体需求,合理选择数据结构将显著提升应用的响应速度和用户体验。 ... [详细]
author-avatar
徐州九七医院沁尿外科1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有