【因果推断python】8_线性回归模型2

目录

回归理论

非随机数据的回归


回归理论

我不打算深入研究线性回归是如何构建和估计的。然而,一点点理论将有助于解释它在因果推断中的力量。首先,回归解决了理论上的最佳线性预测问题。令 \beta^{*}是一个参数向量:

\beta^*=argminE[(Y_i-X_i'\beta)^2]

线性回归找到最小化均方误差 (MSE) 的参数。

如果你对上述等式进行微分并将其置零,你会发现这个问题的线性解由下式给出

\beta^*=E[X_i'X_i]^{-1}E[X_i'Y_i]

面对样本估计的时候,我们可以使用等价如下公式估计这个 beta:\hat{\beta}=(X'X)^{-1}X'Y

但不要只看上面的论述。如果相对钻研公式,您更喜欢直接写代码,那么不妨自己尝试一下:

X = data[["format_ol"]].assign(intercep=1)
y = data["falsexam"]

def regress(y, X): 
    return np.linalg.inv(X.T.dot(X)).dot(X.T.dot(y))

beta = regress(y, X)
beta

array([-4.9122215 , 78.54748458])

上面的公式很笼统。 然而,我们研究只有一个回归变量的情况是值得的。 在因果推断中,我们经常想估计变量 T 对结果 y 的因果影响。 因此,我们使用带有这个单一变量的回归来估计这种影响。 即使我们在模型中包含其他变量,它们通常也只是辅助变量。 添加其他变量可以帮助我们估计干预的因果效应,但我们对估计它们的参数不是很感兴趣。

对于单个回归变量 T,与其关联的参数将由下式给出\beta_1=\frac{Cov(Y_i,T_i)}{Var(T_i)}

如果 T 是随机分配的,则 \beta_{1} 是 ATE。

kapa = data["falsexam"].cov(data["format_ol"]) / data["format_ol"].var()
kapa

-4.912221498226952

如果我们有多个回归量,我们可以扩展以下公式来适应这一点。假设那些其他变量只是辅助变量,我们真正感兴趣的只是估计与T 关联的参数 \kappa

y_i=\beta_0+\kappa T_i+\beta_1X_{1i}+\ldots+\beta_kX_{ki}+u_i

 \kappa可以通过以下公式获得\kappa=\frac{Cov(Y_i,\tilde{T_i})}{Var(\tilde{T_i})}

其中 \tilde{T}_i 是所有其他协变量 X_{1i}+\ldots+X_{ki} 在 T_{i} 上回归的残差。现在,让我们欣赏一下这有多酷。这意味着多元回归的系数是在考虑模型中其他变量的影响后相同回归量的双变量系数。在因果推断方面,\kappa 是 T 在使用所有其他变量进行预测后的双变量系数。

这背后有一个很好的直觉解释。如果我们可以使用其他变量来预测 T,那就意味着它不是随机的。但是,一旦我们控制了其他可用变量,我们就可以使 T 与随机一样好。为此,我们使用线性回归从其他变量预测它,然后我们取该回归的残差 \tilde{T}。根据定义,\tilde{T} 不能被我们已经用来预测 T的其他变量 X 预测。非常优雅地,\tilde{T} 是一种与X 中的任何其他变量无关的处理版本。

顺便说一下,这也是线性回归的一个特性。残差始终与创建它的模型中的任何变量正交或不相关:

e = y - X.dot(beta)
print("正交意味着矩阵相乘结果为0", np.dot(e, X))
X[["format_ol"]].assign(e=e).corr()

更酷的是,这些属性不依赖于任何东西!无论您的数据是什么样子,它们都是数学真理。

非随机数据的回归

到目前为止,我们使用的是随机实验数据,但正如我们所知,这些数据很难获得。进行实验的成本非常高,或者根本不可行。很难说服麦肯锡公司随机免费提供他们的服务,以便我们能够一劳永逸地将他们的咨询服务带来的价值与那些有能力支付他们的公司已经很好的事实区分开来离开。

出于这个原因,我们现在将深入研究非随机或观察数据。在以下示例中,我们将尝试估计多受教育一年对小时工资的影响。正如您可能已经猜到的那样,进行教育实验是极其困难的。你不能简单地将人们随机分配到 4、8 或 12 年的教育中。在这种情况下,我们只有观察数据。

首先,让我们估计一个非常简单的模型。我们将对受教育年限的小时工资进行回归。我们在这里使用对数,以便我们的参数估计有一个百分比解释。有了它,我们就可以说多接受 1 年的教育会使工资增加 x%。

(hwage\text{)}_i=\beta_0+\beta_1edu_i+u_i

wage = pd.read_csv("./data/wage.csv").dropna()
model_1 = smf.ols('np.log(hwage) ~ educ', data=wage.assign(hwage=wage["wage"]/wage["hours"])).fit()
model_1.summary().tables[1]

\beta_{1} 的估计值为 0.0536,95% 的置信区间为 (0.039, 0.068)。 这意味着该模型预测,每增加一年的教育,工资将增加约 5.3%。 这一百分比增长符合教育以指数方式影响工资的信念:我们预计从 11 年到 12 年的教育(平均到高中毕业)比从 14 到 16 年(平均到毕业 大学)。

from matplotlib import pyplot as plt
from matplotlib import style
style.use("fivethirtyeight")

x = np.array(range(5, 20))
plt.plot(x, np.exp(model_1.params["Intercept"] + model_1.params["educ"] * x))
plt.xlabel("Years of Education")
plt.ylabel("Hourly Wage")
plt.title("Impact of Education on Hourly Wage")
plt.show()

当然,并不是因为我们可以估计这个简单的模型是正确的。请注意我是如何小心地用我的话来预测来自教育的工资。我从来没有说过这个预测是因果关系。事实上,到现在为止,您可能有非常严重的理由相信这个模型是有偏见的。由于我们的数据并非来自随机实验,因此我们不知道受教育程度高的人和受教育程度低的人是否具有可比性。更进一步,根据我们对世界运作方式的理解,我们非常确定它们没有可比性。也就是说,我们可以争辩说,那些受教育年限更长的人可能拥有更富裕的父母,而且随着教育程度的提高,我们看到的工资增长只是家庭财富与受教育年限的关系的反映。用数学来说,我们认为E[Y_0|T=0]<E[Y_0|T=1],也就是说,那些受教育程度高的人无论如何都会有更高的收入,即使没有这么多年的教育。如果你对教育真的很冷淡,你可以争辩说它甚至可以通过让人们远离劳动力和降低他们的经验来减少工资。

幸运的是,在我们的数据中,我们可以访问许多其他变量。我们可以看到父母的教育‘meduc’、‘feduc’、那个人的‘IQ’分数、经验年数‘exper’以及他或她在当前公司的任期‘tenure’。我们甚至有一些关于婚姻和黑人种族的虚拟变量。

wage.head()

我们可以在模型中包含所有这些额外变量并对其进行估计:log(hwage)_i=\beta_0+\kappa\textit{educ}_i+\boldsymbol{\beta}X_i+u_i

要了解这如何帮助解决偏差问题,让我们回顾一下多元线性回归的二元细分。

\kappa=\frac{Cov(Y_i,\tilde{T_i})}{Var(\tilde{T_i})}

这个公式说我们可以根据父母的教育、智商、经验等来预测“edu”。在我们这样做之后,我们将得到一个版本的 edue\tilde{d}u,它与之前包含的所有变量都不相关。这将打破诸如“受过更多教育年限的人因为他们的智商更高而拥有它。教育不会导致更高的工资的情况。只是与智商相关的情况,这就是推动工资”。好吧,如果我们在我们的模型中包含 IQ,那么 \kappa 将成为额外一年教育的回报,同时保持 IQ 不变。暂停一下以了解这意味着什么。即使我们不能使用随机对照试验来保持治疗和未治疗之间的其他因素相等,回归可以通过在模型中包含这些相同的因素来做到这一点,即使数据不是随机的!

controls = ['IQ', 'exper', 'tenure', 'age', 'married', 'black',
            'south', 'urban', 'sibs', 'brthord', 'meduc', 'feduc']

X = wage[controls].assign(intercep=1)
t = wage["educ"]
y = wage["lhwage"]

beta_aux = regress(t, X)
t_tilde = t - X.dot(beta_aux)

kappa = t_tilde.cov(y) / t_tilde.var()
kappa

0.04114719101005263

我们刚刚估计的这个系数告诉我们,对于具有相同智商、经验、任期、年龄等的人,我们应该预期多受教育一年与每小时工资增长 4.11% 相关。 这证实了我们的怀疑,即第一个只有 edu 的简单模型是有偏见的。 它还证实,这种偏见高估了教育的影响。 一旦我们控制了其他因素,教育的估计影响就会下降。

如果我们更聪明并使用其他人编写的软件而不是自己编写所有代码,我们甚至可以在这个估计值周围放置一个置信区间。

model_2 = smf.ols('lhwage ~ educ +' + '+'.join(controls), data=wage).fit()
model_2.summary().tables[1]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/667701.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript倍速播放视频

F12打开开发者工具&#xff0c;打开控制台&#xff0c;输入这行代码&#xff0c;视频即可加速播放&#xff0c; 可以调整倍速&#xff08;2&#xff0c;4&#xff0c;8&#xff0c;16&#xff09; document. getElementsByTagName("video")[0]. playbackRate16

单片机建立自己的库文件(1)

文章目录 前言一、代码模块化是什么&#xff1f;二、使用步骤1.以LCD1602作为例子2.将LCD1602 相关的代码抽取到另外一个文件中 三、调用LCD1602.h1.新建一个工程项目&#xff0c;将LCD1602.h添加到工程中2.在主函数上加入 #include <LCD1602.h> 总结 前言 提示&#xf…

MACOS安装 vue 抱错解决方法npm ERR! code EACCESnpm ERR! syscall mkdirnpm ERR!

问题 在使用脚手架 vue-cli 创建 vue 工程的时候存在权限不足的情况下&#xff0c;报错&#xff1b; npm error code EACCES npm error syscall open npm error path /Users/ npm ERR! code EACCESnpm ERR! syscall mkdirnpm ERR! 解决方案&#xff1a; sudo npm cache cl…

Go跨平台编译

1.编译windows平台运行程序 # windows env GOOSwindows GOARCHamd64 go build main.go2.编译linux平台运行程序 # linux env GOOSlinux GOARCHamd64 go build main.go 3.编译macos平台运行程序 # macos env GOOSdarwin GOARCHamd64 go build main.go 编译结果:

VQAScore开启文本到视觉生成评估新篇章

随着生成式人工智能技术的飞速发展&#xff0c;如何全面评估生成内容的质量和与输入提示的一致性成为了一个挑战。在图像-文本对齐领域&#xff0c;传统的评估方法如CLIPScore存在局限性&#xff0c;尤其是在处理涉及多个对象、属性和关系的复杂提示时。它们通常基于简单的词袋…

Linux域名解析不了/网络不可达/虚拟机连接不了的问题

记录域名解析不了/网络不可达/虚拟机连接不了的问题问题 目录 文章目录 记录域名解析不了/网络不可达/虚拟机连接不了的问题问题1.首先确定已经连接上路由器(我的就是在这嗝屁了....)1.1 查看路由表1.2查看当前的网络连接状态&#xff0c;包括网关1.3查看网络接口的状态&…

机器学习笔记 - PyTorch 分布式训练概览

一、简述 对于大规模的数据集,只能进行分布式训练,分布式训练会尽可能的利用我们的算力,使模型训练更加高效。PyTorch提供了Data Parallel包,它可以实现单机、多GPU并行。 PyTorch 数据并行模块的内部工作原理 上面的图像说明了PyTorch 如何在单个系统中利用多个 G…

jmeter多用户登录并退出教程

有时候为了模拟更真实的场景&#xff0c;在项目中需要多用户登录并退出操作&#xff0c;大致参考如下 多用户登录前面已经实现&#xff1a;参考博文 多用户登录并退出jmx文件&#xff1a;百度网盘 提取码&#xff1a;0000 一、多用户退出操作 添加一个setUp线程组&#xff0…

pcdn如何规避运营商查封线路

在使用PCDN&#xff08;Private Content Delivery Network&#xff09;时&#xff0c;为了规避运营商查封线路&#xff0c;可以采取以下措施&#xff1a; 基于成本和宽带的调度&#xff1a;从CDN厂商的角度出发&#xff0c;考虑在不同业务量的地区进行调度&#xff0c;以减少在…

C#WPF数字大屏项目实战05--人员绩效展示

1、创建人员绩效实体类 2、定义视图模型中的属性 3、创建数据转换器 运行效果就是这样 4、绘制刻度 5、运行效果 6、小结 第1行StackPanel控件&#xff0c;里面放border和textblock 第2行ItemsControl控件&#xff0c;里面的ItemsSource绑定视图模型中的WorkerCompareList 第…

如何让数据标注

1.用Anacoda创建一个新的虚拟环境 2.进入虚拟环境 conda activate stu_data&#xff08;就是刚才创建的虚拟变量的名称&#xff09; 3.在此环境中安装labelimg pip install labelimg 4.进入labelimg 直接输入 labelimg 快捷键&#xff1a;D&#xff1a;下一个图片 A&#xff1a…

基于单片机的微型太阳能电站低功耗系统设计

摘 要 : 综合设计性实验是提高单片机类实验课程教学质量行之有效的手段 。 将实验课程内容结合社会热点问题而设计的实验教学案例&#xff0c;融合了单片机实验的所有知识点&#xff0c;提高了学生对实验课程的学习热情&#xff0c;激发了学生对实践教学的兴趣。 让学生通过对一…

java mybatis处理大数据量,开启和配置二级缓存,及注意事项,已解决

注意事项&#xff1a; 尽量避免使用下面方式写sql否则会降低服务器性能&#xff1a; mybatis二级缓存开启后&#xff0c;避免使用事务注解&#xff08;加上事务注解后二级缓存数据会导致两次访问不一致问题&#xff09;&#xff1a; 3. 返回的对象实体类&#xff0c;要实现Se…

FreeRTOS基础(三):动态创建任务

上一篇博客&#xff0c;我们讲解了FreeRTOS中&#xff0c;我们讲解了创建任务和删除任务的API函数&#xff0c;那么这一讲&#xff0c;我们从实战出发&#xff0c;规范我们在FreeRTOS下的编码风格&#xff0c;掌握动态创建任务的编码风格&#xff0c;达到实战应用&#xff01; …

用贪心算法进行10进制整数转化为2进制数

十进制整数转二进制数用什么方法&#xff1f;网上一搜&#xff0c;大部分答案都是用短除法&#xff0c;也就是除2反向取余法。这种方法是最基本最常用的&#xff0c;但是计算步骤多&#xff0c;还容易出错&#xff0c;那么还有没有其他更好的方法吗&#xff1f; 一、短除反向取…

一键分割视频并生成M3U8格式:高效管理视频内容,畅享流畅播放新体验

视频内容已成为我们日常生活和工作中的重要组成部分。无论是个人分享生活点滴&#xff0c;还是企业宣传产品与服务&#xff0c;视频都以其直观、生动的形式&#xff0c;吸引着我们的眼球。然而&#xff0c;随着视频内容的不断增多&#xff0c;如何高效、便捷地管理这些视频&…

Java——String类

1.String常用方法 1.1三种常用构造方法 1. String s1"hello";2. String s2new String("world");3. char []str{h,e,l,l,o, ,w,o,r,l,d};String s3new String(str); 1.2String对象的比较 比较 对于内置类型来说&#xff0c;“”比较…

在Unity中配置Android项目以允许HTTP流量,解决AVPro在Android平台中无法播放http视频

解决方法快速通道&#xff1a;拉到底&#xff0c;看倒数第二张图 好记性不如烂笔头 最近在使用AVpro插件播放http视频&#xff0c;在Editor中一切正常&#xff0c;然而打包在Android平台下就播放不了 AVPro在Unity中的警告&#xff1a; 感觉只是个警告&#xff0c;没引起注意…

嵌入式人工智能开发:基于TensorFlow Lite和OpenCV的实时姿态估计算法实现

文章目录 引言环境准备人工智能在嵌入式系统中的应用场景代码示例常见问题及解决方案结论 1. 引言 在嵌入式系统中集成人工智能&#xff08;AI&#xff09;技术已经成为一种重要的发展方向。实时姿态估计是AI在嵌入式领域的一个高级应用&#xff0c;能够在资源受限的环境中实…

关于12306技术相关说明以及暂定计划

12306 项目中包含了缓存、消息队列、分库分表、设计模式等代码&#xff0c;通过这些代码可以全面了解分布式系统的核心知识点。 在系统设计中&#xff0c;采用最新 JDK17 SpringBoot3&SpringCloud 微服务架构&#xff0c;构建高并发、大数据量下仍然能提供高效可靠的 1230…