逆概率加权(R和Python案例)

news2024/10/2 6:40:00

逆概率加权(Inverse Probability Weighting, IPW)是一种统计技术,用于观察性研究中调整混杂变量的影响,以便更准确地估计因果关系。这种方法特别有用于在无法进行随机化实验的情况下,通过给予不同个体不同的权重,从而使得样本在处理组和对照组之间更加平衡,达到类似于随机对照试验的效果。

基本原理

逆概率加权的核心思想是通过给予每个个体一个权重,这个权重是其接受治疗或暴露的概率的倒数。具体来说:

  • 对于接受治疗的个体,权重是 1 Pr ( T = 1 ∣ X ) \frac{1}{\text{Pr}(T=1 | X)} Pr(T=1∣X)1
  • 对于未接受治疗的个体,权重是 1 Pr ( T = 0 ∣ X ) \frac{1}{\text{Pr}(T=0 | X)} Pr(T=0∣X)1

其中, T T T 表示治疗或暴露的指派, X X X 是可能影响 T T T 分配的协变量。

详细公式

逆概率加权的公式可以表示为:
权重 = ( T Pr ( T = 1 ∣ X ) + 1 − T Pr ( T = 0 ∣ X ) ) \text{权重} = \left( \frac{T}{\text{Pr}(T=1 | X)} + \frac{1-T}{\text{Pr}(T=0 | X)} \right) 权重=(Pr(T=1∣X)T+Pr(T=0∣X)1T)
这里, T T T 是治疗指示变量(接受治疗为1,未接受为0),而 Pr ( T ∣ X ) \text{Pr}(T | X) Pr(TX) 是给定协变量 X X X 下接受治疗 T T T 的概率。

案例

假设我们研究一种新药对疾病恢复的影响。我们有以下数据:

  • T T T:治疗指示(1=接受新药,0=接受常规治疗)
  • X X X:患者的年龄、性别等协变量
  • Y Y Y:恢复情况(1=完全恢复,0=未完全恢复)

首先,我们需要使用逻辑回归或其他适当的统计方法来估计 Pr ( T ∣ X ) \text{Pr}(T | X) Pr(TX)。然后,我们计算每个患者的权重,并使用这些权重来估计新药的因果效应。

实现

在实际应用中,逆概率加权可以通过以下步骤实现:

  1. 使用逻辑回归或其他模型估计 Pr ( T ∣ X ) \text{Pr}(T | X) Pr(TX)
  2. 计算每个个体的权重。
  3. 使用加权的观测数据进行因果效应分析。

例如,在R语言中,可以使用如下代码进行逆概率加权的计算和分析 :

# 模拟数据
n <- 1000
simdat <- data.frame(l = rnorm(n, 10, 5))
a.lin <- simdat$l - 10
pa <- exp(a.lin)/(1 + exp(a.lin))
simdat$a <- rbinom(n, 1, prob = pa)
simdat$y <- 10*simdat$a + 0.5*simdat$l + rnorm(n, -10, 5)

# 计算逆概率权重
library(ipw)
temp <- ipwpoint(exposure = a, family = "binomial", link = "logit", numerator = ~ 1, denominator = ~ l, data = simdat)

# 应用权重进行分析
simdat$sw <- temp$ipw.weights
msm <- svyglm(y ~ a, design = svydesign(~ 1, weights = ~ sw, data = simdat))
coef(msm)
confint(msm)

在Python中,可以使用statsmodels库来实现逆概率加权(IPW)。以下是一个简单的示例,展示了如何使用Python进行IPW的计算和分析:

import numpy as np
import pandas as pd
from statsmodels.miscmodels.ordinal_model import OrderedModel
from statsmodels.genmod.generalized_linear_model import GLM
from statsmodels.genmod.families import Binomial

# 模拟数据
np.random.seed(10)
n = 1000
data = pd.DataFrame({
    'age': np.random.normal(10, 5, n),
    'treatment': np.random.binomial(1, 0.5, n),
    'recovery': np.random.binomial(1, 0.5, n)
})

# 估计治疗分配概率模型
glm = GLM(data['treatment'], data[['age']], family=Binomial())
result = glm.fit()
predictions = result.predict(data[['age']])

# 计算逆概率权重
data['weight'] = data['treatment'] / predictions + (1 - data['treatment']) / (1 - predictions)

# 使用权重估计治疗效果
weighted_glm = GLM(data['recovery'] * data['treatment'], data[['age']], family=Binomial(), weights=data['weight'])
weighted_result = weighted_glm.fit()
print(weighted_result.summary())

# 使用权重估计控制组效果
weighted_glm_control = GLM(data['recovery'] * (1 - data['treatment']), data[['age']], family=Binomial(), weights=data['weight'])
weighted_result_control = weighted_glm_control.fit()
print(weighted_result_control.summary())

# 计算平均治疗效果 (ATE)
ate = (weighted_result.params[0] - weighted_result_control.params[0])
print(f'Estimated Average Treatment Effect (ATE): {ate}')

在这个示例中,我们首先使用GLM(广义线性模型)来估计治疗分配概率模型。然后,我们计算每个个体的逆概率权重,并使用这些权重来估计治疗的效果。

请注意,这个示例使用了模拟数据,实际应用中需要用真实的数据集替换data DataFrame,并根据实际情况选择合适的协变量。

此外,statsmodels库提供了丰富的统计模型,可以根据具体的研究问题选择适当的模型进行分析。在实际应用中,可能还需要进行模型诊断、敏感性分析等步骤,以确保结果的稳健性和可靠性。

局限性

逆概率加权的有效性取决于对 Pr ( T ∣ X ) \text{Pr}(T | X) Pr(TX) 的准确估计。如果模型设定不准确,或者某些个体的治疗概率非常接近0或1,可能导致权重过大,从而影响估计的稳定性和可靠性。

总的来说,逆概率加权是一种强大的工具,可以在观察性研究中调整混杂变量,但需要谨慎使用,确保模型的正确性和数据的质量。

  • 执行结果
    在这里插入图片描述

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

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

相关文章

[数据库实验七]事务设计

目录 一、实验目的与要求 二、实验内容 三、实验小结 实验中涉及的数据参考&#xff1a;[数据库实验一]数据库和表-CSDN博客 一、实验目的与要求 1.熟悉提交事务 2.回滚事务 3.检查点技术 注&#xff1a;可以用可视化软件来实现 二、实验内容 基于现有数据库设计事务提…

Axure-本地发布,局域网内用户访问

目录 前言内容一. 选择Axure发布路径&#xff0c;进行相应配置二.添加IIS服务配置&#xff08;不在这里赘述&#xff01;&#xff09;三&#xff1a;添加IIS配置&#xff0c;创建网站四.添加安全策略&#xff1a;实践&#xff1a; 前言 最近加入了公司的积分系统&#xff0c;由…

时尚与科技的融合,戴上更轻更悦耳的QCY C30耳夹耳机,随时享受好音乐

不知不觉&#xff0c;蓝牙耳机已经成了我日常必备的小工具了&#xff0c;尤其是这两年新出现的耳夹式耳机&#xff0c;轻松解决了入耳式耳机的舒适性难题&#xff0c;戴上一整天也不会觉得累&#xff0c;而且一款好看的耳机不仅能够提供澎湃的音质&#xff0c;还能成为时尚出街…

理解信息安全中的SOAR

在信息安全领域&#xff0c;SOAR&#xff08;Security Orchestration, Automation, and Response&#xff0c;安全编排、自动化与响应&#xff09;是一个现代化的解决方案&#xff0c;旨在通过集成和自动化的方式优化安全操作流程&#xff0c;提升威胁检测、事件响应的速度与效…

雷达原理-绪论-西电魏青

Radar 雷达&#xff1a;radio detection and ranging 无线电探测和测距 无线电&#xff1a;电磁波信号 探测&#xff1a;通过电磁波信号的一个回波特性实现物体探测 测距&#xff1a;利用回波信号&#xff08;现在技术发展&#xff0c;不单单是测距&#xff0c;还能是物体的各种…

stm32 flash无法擦除

通过bushound调试代码发现&#xff0c;当上位机发送命令到模组后flash将不能擦除&#xff0c;通过 HAL_FLASH_GetError&#xff08;&#xff09;函数查找原因是FLASH Programming Sequence error&#xff08;编程顺序错误&#xff09;&#xff0c;解决办法是在解锁后清零标志位…

构建高效房屋租赁系统:Spring Boot应用

1 绪论 1.1 研究背景 中国的科技的不断进步&#xff0c;计算机发展也慢慢的越来越成熟&#xff0c;人们对计算机也是越来越更加的依赖&#xff0c;科研、教育慢慢用于计算机进行管理。从第一台计算机的产生&#xff0c;到现在计算机已经发展到我们无法想象。给我们的生活改变很…

MySQL purge逻辑分析与调测

目录 purge逻辑分析与调测 一、purge线程 1、什么是purge线程&#xff1f; 2、为什么需要purge&#xff1f; 3、purge哪些内容&#xff1f; 4、什么时候purge&#xff1f; 5、purge内存结构 二、purge主要步骤 1、确认可见性 2、获取需要purge的undo记录 …

开源鸿蒙OpenHarmony系统修改屏幕旋转方法 深圳触觉智能RK3566开发板

本文提供OpenHarmony4.0系统竖屏修改为旋转时的操作方法&#xff0c;在此为大家介绍了两种方法&#xff01;第一种方式是将修改过的文件重新编译后烧录至开发板中实现屏幕旋转&#xff0c;第二种方式则是通过覆盖原文件的方式实现屏幕旋转。 1、源码下载 首先进入触觉智能官网…

【C语言从不挂科到高绩点】22-指针04-结构体指针【重点知识】

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中非常重要的知识点-指针: 本套课程将会从0基础讲解C语言核心技术,适合人群: 大学中开设了C语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想…

UART开发基础

目录 前言 同步传输与异步传输 1.概念与示例 2.差别 UART协议与操作方法 1.UART协议 2.STM32H5 UART硬件结构 3.RS485协议 UART编程 1.三种编程方式 2.查询方式 3.中断方式 4.DMA 方式 效率最高的UART编程方法 1.IDLE中断 2.DMA 发送/DMAIDLE 接收 在RTOS里使…

L2 Loss介绍及梯度计算说明

L1 Loss介绍及梯度计算说明-CSDN博客 L2 Loss&#xff08;MS&#xff0c;也称为均方误差损失或平方误差损失&#xff09;是一种常用的损失函数&#xff0c;广泛应用于回归任务中。它通过计算预测值与真实值之间的平方差来评估模型的性能。 1. L2 Loss 的定义 L2 Loss 的数…

Python | Leetcode Python题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; class Solution:def pathSum(self, root: TreeNode, targetSum: int) -> int:prefix collections.defaultdict(int)prefix[0] 1def dfs(root, curr):if not root:return 0ret 0curr root.valret prefix[curr - targetSum]prefix[cu…

Golang | Leetcode Golang题解之第436题寻找右区间

题目&#xff1a; 题解&#xff1a; func findRightInterval(intervals [][]int) []int {n : len(intervals)type pair struct{ x, i int }starts : make([]pair, n)ends : make([]pair, n)for i, p : range intervals {starts[i] pair{p[0], i}ends[i] pair{p[1], i}}sort.…

第四届工业母机高质量发展论坛在浙江温岭召开

9月24日&#xff0c;由工业和信息化部产业发展促进中心&#xff08;以下简称产促中心&#xff09;主办的“第四届工业母机高质量发展论坛”在浙江温岭成功召开。 中国工程院院士周济、郭东明、王国庆&#xff0c;工业和信息化部装备工业一司一级巡视员苗长兴&#xff0c;中国企…

C语言 | Leetcode C语言题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ //递归遍历树节点&#xff0c;判断是否为有效路径 int dfs(struct TreeNode * root, int ta…

C++ -函数重载-详解

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ C -函数重载-详解 1.是什么2.怎么用2.1示例 3.原理3.1C/C编译链接过程3.2函数名修饰规则3.3过程1.调用函数的过程2.编译阶段的函数调用 总结 1.是什么 如果在百度中搜索重载这…

Adobe Bridge简体中文版百度云下载与安装(附教程)

如大家所熟悉的&#xff0c;Adobe Bridge常常简称为BR&#xff0c;是一款数字资产管理软件&#xff0c;可以帮助用户浏览、组织、搜索和管理各种类型的媒体文件&#xff0c;如照片、音频、视频等。 Bridge发展至今有许多个版本&#xff0c;目前来说常用的版本有Bridge 2018、2…

2024东湖高新下半年水测公示名单啦

2024东湖高新下半年水测公示名单啦 公示时间9月13日-9月20日&#xff0c;快看看你过了没&#xff01;&#xff01; 东湖高新区报名水测共有2600多人&#xff0c;水测公示通过1201人&#xff0c;部分人员免考。 水测通过后就赶紧整理好申报材料&#xff0c;准备申报了&#xff…

2.1 HuggingFists系统架构(一)

系统架构 HuggingFists的前端主体开发语言为HtmlJavascript&#xff0c;后端的主体开发语言为Java。在算子部分有一定份额的Python代码&#xff0c;用于整合Python在数据处理方面强大能力。 功能架构 HuggingFists的功能架构如上&#xff0c;由下向上各层为&#xff1a; 数据存…