【python因果推断库8】工具变量回归与使用 pymc 验证工具变量1

news2024/11/16 4:34:17

目录

工具变量回归与使用 pymc 验证工具变量

回归机制与局部平均处理效应

旁白:从多元正态分布中采样


import arviz as az
import daft
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pymc as pm
import scipy
from matplotlib.lines import Line2D
from matplotlib.patches import Ellipse
from sklearn.preprocessing import StandardScaler

import causalpy as cp
from causalpy.pymc_experiments import InstrumentalVariable
from causalpy.pymc_models import InstrumentalVariableRegression
%config InlineBackend.figure_format = 'retina'
seed = 42
np.random.seed(seed)

对于这个笔记,我们还安装了 jax 和 numpyro。这使得我们在 `InstrumentalVariable` 类中对后验预测分布的采样速度大大加快。您可以在 Jupyter 笔记本中运行以下命令来安装这两个库:

!conda install jax
!conda install numpyro

工具变量回归与使用 pymc 验证工具变量

决定学业成功和后续就业的因素是多样的。有许多社会人口统计特征和个人能力方面的因素在起作用。因此,如何干净地评估教育的影响存在合理的担忧。如果不设法考虑能力和教育之间的混淆关系,我们可能会使结果出现偏差。在这个例子中,我们将探讨著名的经济学问题之一:投资于教育所能获得的经济回报。我的教育程度对我一生财富的预期增加有何影响?经济学文献的建议是利用工具变量回归来分解教育对未来工资获取的影响。

具体来说,建议我们可以使用一个人距离四年制大学的(假设如同随机的)距离作为一个工具变量。回想一下,这个工具变量 `nearcollege` 必须满足:(i) 相关性,即它会影响我们感兴趣的因果路径,例如靠近大学被认为会对个人的教育产生因果影响;(ii) 独立性,即分配给工具变量应尽可能随机,从而减轻原始的选择效应偏差;(iii) 需要满足排除限制,即工具变量应该仅仅通过我们感兴趣的处理变量(教育)来影响结果(工资)。如果这些条件得到满足,那么我们可以认为工具变量回归技术能够提炼出处理变量的因果影响。

GRID_UNIT = 2.0
DPI = 200
NODE_EC = "none"

pgm = daft.PGM(dpi=DPI, grid_unit=GRID_UNIT, node_ec=NODE_EC)

pgm.add_node("z", "$Z$", 0, 0)
pgm.add_node("t", "$T$", 1, 0)
pgm.add_node("y", "$Y$", 2, 0)
pgm.add_node("x", "$\mathbf{X}$", 1.5, 0.75)
pgm.add_edge("z", "t")
pgm.add_edge("x", "t")
pgm.add_edge("x", "y")
pgm.add_edge("t", "y")


pgm.add_node("nearcollege", "$Near$", 3, 0)
pgm.add_node("education", "$Edu$", 4, 0)
pgm.add_node("wage", "$Wage$", 5, 0)
pgm.add_node("ability", "$\mathbf{ability}$", 4.5, 0.75)
pgm.add_edge("nearcollege", "education")
pgm.add_edge("ability", "education")
pgm.add_edge("ability", "wage")
pgm.add_edge("education", "wage")

pgm.render();

在许多方面,工具变量回归是经济学和社会科学中可信度革命的一个典范方法。对社会科学中可信度的需求源自复制危机。下面我们将探讨工具变量设计的假设,并强调在哪些条件下它可以合理地应用。首先,我们将概述工具变量回归中因果估计量的本质。然后,我们将探讨这些估计程序是如何根据上述假设工作的。我们将展示不同的方法来检验这些模型,并在类似的模型之间进行比较,以论证结果的可信度。

回归机制与局部平均处理效应

工具变量问题的结构帮助我们探究因果影响的问题,但它并不针对典型的平均处理效应<ATE>因果估计量。相反,我们必须满足于估计局部平均处理效应<LATE>量,在我们的设计中的“遵从者”群体中评估受限的处理效应。这是有道理的,因为我们隐含地评估了一个没有遵守保证的群体中的处理效应。更具体地说,我们的工具变量,由于其独立性,旨在在一个响应我们工具变量的子人群中诱导出如同随机分配的处理。所以我们不能做出更广泛的声称已经评估了平均变化。相反,它是对那些被诱导遵守我们设计的子群体中变化的评估。这些个体的处理(教育)受到了我们的工具变量(nearcollege)的影响。

LATE估计量的理论是非常丰富的。有多种方法可以隔离LATE量,也有多种LATE估计量。这里我们展示了一种经典的表示方法,即在我们工具变量的实现下的结果和处理的条件期望。

\tau=LATE=\frac{E[Y|Z=1]-E[Y|Z=0]}{E[T|Z=1]-E[T|Z=0]}=\frac\phi\psi=\frac{\text{reduced form}}{\text{first stage}}

最后的表述突出了我们对工具变量 `Z` 引起的两个变化成分感兴趣的事实。这是一种看待我们试图在一个结构方程模型中估计两个随机变量的联合分布的方式。但更重要的是,我们通过相关性假设认为工具变量 `Z` 的实现与处理变量 `T` 之间存在一些非平凡的相关性。因此,选择与感兴趣的子群体相关的工具变量或预期遵守率高的工具变量尤为重要。

旁白:从多元正态分布中采样

我们如何衡量工具变量与处理变量之间的相关性?我们应该期望多少相关性?在 CausalPy 的工具变量回归实现中,我们使用 LKJ Cholesky 先验对多元正态分布建模,以显式地模拟这种相关性。在这里值得做一个简短的旁白,展示在不同先验下从这种分布中采样如何塑造联合分布的相关性。下面我们将展示这为我们提供了一种机制,以对我们关于工具变量之间关系的信念施加约束。

sd_dist = pm.Exponential.dist(1.0, shape=2)
lkj = pm.LKJCholeskyCov.dist(
    eta=2,
    n=2,
    sd_dist=sd_dist,
)
lkj1 = pm.LKJCholeskyCov.dist(
    eta=10,
    n=2,
    sd_dist=sd_dist,
)
chol, corr, sigmas = pm.draw(lkj, draws=100)
chol1, corr1, sigmas = pm.draw(lkj1, draws=100)

fig, axs = plt.subplots(4, 1, figsize=(9, 12))
axs = axs.flatten()
corrs = []
corrs1 = []
for i in range(100):
    xy = pm.draw(pm.MvNormal.dist(0, chol=chol[i]), 1000)
    xy1 = pm.draw(pm.MvNormal.dist(0, chol=chol1[i]), 1000)
    corrs.append(np.corrcoef(xy[:, 0], xy[:, 1])[0][1])
    corrs1.append(np.corrcoef(xy1[:, 0], xy1[:, 1])[0][1])

    axs[0].scatter(xy[:, 0], xy[:, 1], alpha=0.1, color="blue", rasterized=True)
    axs[1].scatter(xy1[:, 0], xy1[:, 1], alpha=0.1, color="red", rasterized=True)
    axs[2].scatter(xy[:, 0], xy[:, 1], alpha=0.1, color="blue", rasterized=True)
    axs[2].scatter(xy1[:, 0], xy1[:, 1], alpha=0.1, color="red", rasterized=True)
axs[3].hist(
    np.array(corrs),
    bins=30,
    ec="black",
    label="Correlation of Observations LKJ(eta=2)",
    color="blue",
    alpha=0.5,
    rasterized=True,
)
axs[3].hist(
    np.array(corrs1),
    bins=30,
    ec="black",
    label="Correlation of Observations LKJ(eta=10)",
    color="red",
    alpha=0.5,
    rasterized=True,
)
axs[3].legend()
axs[3].set_title("Correlation Coefficient Distribution")
axs[0].set_title("Realisations from LKJ(eta=2)")
axs[2].set_title("Overlapping Realisations")
axs[1].set_title("Realisations from LKJ(eta=10)");

 在上面的一系列图中,我们从 LKJ 先验概率分布的不同参数化中进行了采样。这个分布是对多元正态概率分布的期望值和协方差结构的先验。我们展示了先验的不同参数化会导致所采样的双变量正态分布的相关性更多或更少。在这里我们可以看到,增加 LKJ 先验中的 eta 参数会缩小可接受的相关性参数的范围。默认情况下,CausalPy 中 `InstrumentalVariable` 类的实现是从处理变量和结果变量的双变量正态分布中采样,eta 参数设置为 2。如果你的模型使得这样的潜在相关性不太可能发生,这是值得注意的。下面我们将展示如何在工具变量的背景下对这些参数应用先验。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何阅读PyTorch文档及常见PyTorch错误

如何阅读PyTorch文档及常见PyTorch错误 文章目录 如何阅读PyTorch文档及常见PyTorch错误阅读PyTorch文档示例常见Pytorch错误Tensor在不同设备上维度不匹配cuda内存不足张量类型不匹配 参考 PyTorch文档查看https://pytorch.org/docs/stable/ torch.nn -> 定义神经网络 torc…

红队攻防 | 利用GitLab nday实现帐户接管

在一次红队任务中&#xff0c;目标是一家提供VoIP服务的公司。该目标拥有一些重要的客户&#xff0c;如政府组织&#xff0c;银行和电信提供商。该公司要求外部参与&#xff0c;资产测试范围几乎是公司拥有的每一项互联网资产。 第一天是对目标进行信息收集。这一次&#xff0…

结构开发笔记(七):solidworks软件(六):装配摄像头、摄像头座以及螺丝,完成摄像头结构示意图

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141931518 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

成功之路:如何获得机器学习和数据科学实习机会

一年内获得两份实习机会的数据科学家的建议和技巧 欢迎来到雲闪世界。在当今竞争激烈的就业市场中&#xff0c;获得数据科学实习机会可以成为您在科技领域取得成功的门票。 但申请者如此之多&#xff0c;你该如何脱颖而出呢&#xff1f; 无论您是学生、应届毕业生还是想要转行…

IDEA2024.2最新工具下载

​软件使用 1、解压缩包 2、打开如图第三个 3、运行过十来秒等待提示以下信息即可

Ubuntu 无法全局安装 node 包

Anchor: $: cat /etc/lsb* DISTRIB_IDUbuntu DISTRIB_RELEASE22.04 DISTRIB_CODENAMEjammy DISTRIB_DESCRIPTION"Ubuntu 22.04.4 LTS" $: node -v v20.17.0 $: npm -v 10.8.2Question: $: npm install -g docsify-cli结果&#xff1a;超时或者如下图 Answer: 有…

【Python 千题 —— 算法篇】字符串替换

Python 千题持续更新中 …… 脑图地址 &#x1f449;&#xff1a;⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在日常编程中&#xff0c;我们经常会遇到需要对字符串中的特定字符或子串进行替换的需求。比如&#xff0c;替换文本中的敏感词汇、…

html初体验标准标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title> </head> <body><input type"text"> </body> </html> 内容展示

C和Java实现杨辉三角

C: #include <stdio.h> #define N 15 int main() {int arr[N][N] { 0 }; //初始化int i 0;//行数int j 0;//列数for (i 0; i < N; i){arr[i][0] 1; //每行首元素是 1for (j 0; j < i; j)//为啥j<i呢&#xff1f;因为每一行的个数&#xff08;每一列多少个…

爵士编曲:如何编写爵士钢琴

排列&#xff08;Voicing&#xff09; 由于爵士和声组成音较为复杂&#xff0c;故此衍声排列内容 密集排列&#xff1a;直接堆一起或者左手低音右手和弦音 。 开放排列&#xff1a;各个声部大于等于纯四度&#xff0c;小于八度&#xff0c;符合两只手能弹的情况 混合排列&a…

Python | Leetcode Python题解之第388题文件的最长绝对路径

题目&#xff1a; 题解&#xff1a; class Solution:def lengthLongestPath(self, input: str) -> int:ans, i, n 0, 0, len(input)level [0] * (n 1)while i < n:# 检测当前文件的深度depth 1while i < n and input[i] \t:depth 1i 1# 统计当前文件名的长度l…

深入CSS 布局——WEB开发系列29

CSS 页面布局技术允许我们拾取网页中的元素&#xff0c;并且控制它们相对正常布局流、周边元素、父容器或者主视口/窗口的位置。 一、正常布局流&#xff08;Normal Flow&#xff09; CSS的布局基础是“正常流”&#xff0c;也就是页面元素在没有特别指定布局方式时的默认排列…

文件操作详解:fgetc,fputc,fgets,fputs,fscanf,,fprintf,fread,fwrite的使用和例子 C语言

前言 在日常应用中&#xff0c;我们为了持续的使用一些数据&#xff0c;为了让数据可以在程序退出后可以保存并正常使用&#xff0c;引入了文件的概念和操作。本文分享了一些常用的文件操作函数的使用方法和各自的区别。 一、常用文件顺序读写函数 下面例程所使用的VS工程代码…

【全网最全】《2024高教社杯/国赛》 C题 思路+代码+文献 蒙特卡洛+遗传算法 第一问 农作物的种植策略

​ 领取压缩包 问题 1&#xff1a;建模思路与方法 问题描述 我们需要为某乡村在 2024-2030 年间制定最优的农作物种植方案。考虑的因素包括农作物的销售量、种植成本、亩产量、销售价格、以及不同土地的适宜种植条件等。该问题分为两种情况&#xff1a;(1) 超过部分滞销&#…

【redis】本地windows五分钟快速安装redis

用处&#xff1a;本地自测&#xff0c;有时候公司redis环境不稳定&#xff0c;用自己的 1.下载&#xff0c;github下载一个解压缩在自己想要的位置 选择版本&#xff1a;Redis-7.4.0-Windows-x64-msys2-with-Service&#xff0c;zip GitHub - redis-windows/redis-windows: …

django学习入门系列之第十点《案例 用户管理》

文章目录 展示用户列表添加用户删除用户url中&#xff1f;的作用 往期回顾 展示用户列表 方向 展示用户列表 url函数 获取用户所有的信息基于HTML给他个渲染 views.py from django.shortcuts import render, HttpResponse, redirect# Create your views here.from app01.…

c++162 类的封装和访问

怎么样管理类管理对象 类如何定义对象 #include<iostream> using namespace std;//求圆的面积 class MyCirecle { public:double m_r;//属性 成员变量double m_s; public :double getR(){return m_r;}void setR(double r)//成员函数{m_r r;}double getS(){m_s 3.14…

CMU 10423 Generative AI:lec2

文章目录 1 概述2 部分摘录2.1 噪声信道模型&#xff08;Noisy Channel Models&#xff09;主要内容&#xff1a;公式解释&#xff1a;应用举例&#xff1a; 2.2 n-Gram模型1. 什么是n-Gram模型2. 早期的n-Gram模型3. Google n-Gram项目4. 模型规模与训练数据5. n-Gram模型的局…

EmguCV学习笔记 VB.Net 10.1 人脸检测 CascadeClassifier类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

视觉语言模型(VLMs)知多少?

最近这几年&#xff0c;自然语言处理和计算机视觉这两大领域真是突飞猛进&#xff0c;让机器不仅能看懂文字&#xff0c;还能理解图片。这两个领域的结合&#xff0c;催生了视觉语言模型&#xff0c;也就是Vision language models (VLMs) &#xff0c;它们能同时处理视觉信息和…