探索 Python 中的因果关系。差异-差异

原文:towardsdatascience.com/exploring-causality-in-python-difference-in-differences-90179fe71e62

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1010ebec85a6555479253d4919bba9e9.png

图片由 Scott GrahamUnsplash 提供

建立因果关系是现代分析中最基本且经常被忽视的领域之一。我将在一系列即将到来的文章中描述并强调我们因果推断研讨会中最常用的工具。

因果推断 101

让我们从定义因果推断开始。我将使用来自 Mixtape 一书的 Scott Cunningham 的定义。

他将其定义为“对事件和选择对特定感兴趣的结果的影响进行估计的研究”。我们试图建立变量之间的因果关系(我们可以称它们为治疗和效果)。这在许多领域都是一个普遍存在的问题,从商业到公共政策环境。

通常,因果发现框架的设置相对简单,包括:

  • 治疗组 – 接受治疗的组

  • 对照组 – 我们希望将其作为基准来评估治疗效果的组

  • 治疗 – 任何针对我们希望分析的治疗活动的活动

  • 感兴趣的结果

这种设置不仅是一个理论概念,而且是一个可以应用于广泛现实场景的实用工具。从网站优化到 A/B 测试,从药物临床试验到评估发展计划的影响,因果推断的应用范围广泛且多样化。

让我们考虑我们必须满足的条件以建立因果关系。首先,我们必须假设治疗组和对照组是可比的。在治疗和不治疗的情况下,两者都应该表现相同。例如,如果未接受治疗,治疗组中的对象应该与对照组中的对象表现相同。

反之亦然,对照组中的对象应该与那些如果接受过治疗的治疗组对象表现相同。因此,两组之间的唯一差异完全来自治疗。将治疗组的成果与对照组的成果进行比较,给我们提供了治疗效果

对照组不仅仅是比较,而且是治疗组的反事实。它显示了如果前者没有接触到给定的治疗,它会如何表现。这强调了对照组在建立因果关系中的关键作用。

假设两组相似性的假设很强,并且依赖于可用数据和研究设计。实现这种可比性是因果推断的关键任务。

准实验

我们如何获得这样的条件?大多数处理因果关系的文章都从随机实验是建立因果关系的黄金标准这一观念开始。然而,它们往往不可行或不实用。

因此,我们一直在寻找帮助我们找到因果关系的工具。解决这个问题的研究方法被称为准实验

在本文的其余部分,我们将重点关注最常用的一种准实验方法:双重差分法

最低工资研究

我将在其经典应用背景下描述这种方法。为了理解这种方法,我们将探讨 Card 和 Kruger 及其著名的最低工资研究工作。

最低工资对就业的影响是经济学和公共政策中最热烈的辩论之一。该研究的作者试图找到这个问题的答案。这类问题是我们不能使用随机实验来解释的问题的一个完美例子。将某些群体或地理区域随机分配到不同的最低工资水平在实际上是不可能的。

1992 年,新泽西州将最低工资从每小时 4.25 美元提高到 5.05 美元。Card 和 Kruger 正在寻找一个基准来比较新泽西州。

研究人员决定比较新泽西州的就业水平与宾夕法尼亚州的就业水平。前一个州被选为对照组。他们选择宾夕法尼亚州,因为它在地理和经济条件上都与新泽西州相似。

他们调查了 1992 年前后两个州快餐店的员工人数。科学家们使用调查的快餐店的就业情况,因为这种业务可以迅速对最低工资的变化做出反应。

数据集

现在是深入数据集的合适时机。在必要的数据转换(以及为了训练目的的简化)之后,我们有以下数据结构可用。我使用了 David Card 网站上的数据集(davidcard.berkeley.edu/data_sets.html):

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d7dea4594a04accde7ec9bd54985c3b4.png

我们可以将每一行视为餐厅调查的结果。关键信息是州名、总就业人数以及给定记录是否来自最低工资变动前后的标志。我们将最低工资的变化视为分析研究中的一种处理变量。

作为一项技术说明,为了使图表更容易绘制,我们将按时间和州存储平均值在一个数据框中:

MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
<think>好的,用户现在在问关于故障根源诊断的框架顺序,应该先进行数据预处理,然后建立BP网络模型,再进行格兰杰因果关系检验,还是先数据预处理,接着格兰杰检验,最后再建立BP模型。这个问题需要仔细分析两种流程的适用场景,以及用户的实际需求。 首先,用户提到的是故障根源诊断,这通常属于工业或设备维护领域的问题。这类问题的核心在于确定导致故障的根本原因变量,可能涉及多个潜在因素之间的关系。用户可能已经收集了相关数据,希望通过分析这些数据来识别关键影响因素。 接下来,我需要回顾之前对话的历史。用户之前询问了在BP神经网络中如何选择输入和输出变量,我的回答强调了格兰杰因果分析的重要性,并结合相关性分析和领域知识来筛选变量。现在用户的问题是框架的顺序,涉及到格兰杰检验和模型建立的先后顺序。 用户提供的两个选项分别是: 1. 数据预处理 → BP模型建立 → 格兰杰检验 2. 数据预处理 → 格兰杰检验 → BP模型建立 需要考虑这两个顺序的合理性和适用性。首先,格兰杰因果关系检验主要用于确定变量间的因果关系,特别是在时间序列数据中,判断一个变量是否对另一个变量有预测能力。而BP神经网络是一种用于建模输入输出关系的工具,通常用于预测或分类。 在故障诊断中,如果目标是找出导致故障的关键变量(根源),那么格兰杰检验可以作为特征选择的一部分,帮助确定哪些变量是故障的因果因素,从而作为BP神经网络的输入。这种情况下,正确的顺序应该是先进行格兰杰检验筛选出关键变量,然后建立BP模型进行诊断或预测。相反,如果先建立BP模型,可能无法有效识别因果关系,模型可能会包含无关变量,影响效果和解释性。 另外,用户可能在之前的讨论中已经了解了格兰杰检验在变量选择中的作用,所以现在需要明确流程的顺序。需要解释为什么在故障诊断中应该先进行因果分析,再建模,而不是相反。同时,可能需要提到数据预处理的重要性,比如处理缺失值、标准化、平稳性检验等,这对格兰杰检验的有效性至关重要,因为格兰杰检验要求时间序列是平稳的。 还需要考虑用户可能存在的误区,比如认为先建立模型再分析结果中的因果关系,但实际上格兰杰检验需要作为预处理步骤来指导输入变量的选择。此外,如果先建立BP模型,可能会因为变量过多或存在多重共线性而影响模型性能,而先进行因果检验可以减少输入变量的数量,提高模型效率和准确性。 最后,需要总结出一个清晰的框架步骤,并解释每一步的作用,确保用户理解流程的逻辑和必要性。可能还需要举例说明,比如在工业设备故障诊断中,先预处理数据,然后通过格兰杰检验找出影响故障的关键传感器信号,再将这些关键信号作为BP网络的输入,输出故障类型或根源,从而提高诊断的准确性和可解释性。</think>--- ### **故障根源诊断框架设计:流程选择与优化** --- #### **一、核心问题分析** 在故障根源诊断中,**确定变量间的因果关系**是定位关键因素的核心任务。 **关键矛盾**: - **BP神经网络**擅长通过数据驱动建立输入与输出的映射关系,但无法直接解释变量间的因果性。 - **格兰杰因果检验**能识别变量间的统计因果性,但需依赖严格的时序数据假设。 --- #### **二、推荐诊断框架** **推荐流程**: $$数据预处理 \rightarrow 格兰杰因果关系检验 \rightarrow BP神经网络建模$$ **理由**: --- ##### **1. 数据预处理优先(必要性)** - **目的**:为后续分析提供可靠数据基础 - **关键操作**: - **缺失值处理**:插值或删除含缺失数据的样本 - **平稳性检验**:格兰杰检验要求时间序列平稳(通过ADF检验) - *示例代码*: ```python from statsmodels.tsa.stattools import adfuller def check_stationarity(series): result = adfuller(series) p_value = result[1] return p_value < 0.05 # 显著性水平设为5% for col in df.columns: if not check_stationarity(df[col]): # 进行差分平稳化 df[col] = df[col].diff().dropna() ``` - **归一化**:消除量纲差异(对BP网络尤为重要) --- ##### **2. 格兰杰因果检验定位关键变量** - **作用**:筛选出对故障指标有显著因果影响的变量 - **操作建议**: - **双向检验**:检验所有候选变量与故障指标间的因果关系 ```python from statsmodels.tsa.stattools import grangercausalitytests target = '故障指标' candidates = ['温度', '振动', '压力', '电流'] # 示例变量 significant_vars = [] for var in candidates: data = df[[target, var]].dropna().values granger_result = grangercausalitytests(data, maxlag=3, verbose=False) p_values = [granger_result[lag][0]['ssr_chi2test'][1] for lag in [1,2,3]] if any(p < 0.05 for p in p_values): significant_vars.append(var) ``` - **滞后阶数选择**:根据AIC准则确定最优滞后阶数 --- ##### **3. BP神经网络建模阶段** - **输入变量**:格兰杰检验筛选出的显著因果变量 - **输出设计**: - **单输出**:直接预测故障等级(如0-正常,1-轻微故障,2-严重故障) - **多输出**:同时预测多个故障类型(需使用Softmax输出层) - **结构示例**: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense model = Sequential() model.add(Dense(64, activation='relu', input_dim=len(significant_vars))) model.add(Dense(32, activation='relu')) model.add(Dense(1, activation='sigmoid')) # 二分类输出 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) ``` --- #### **三、为何不推荐“先BP建模后格兰杰检验”?** --- ##### **1. 因果关系混淆风险** - **问题**:神经网络可能捕捉到虚假相关性(Spurious Correlation) - *示例*:某传感器噪声与故障指标在训练数据中偶然同步变化,导致模型错误关联 - **后果**:根源诊断结论不可靠 --- ##### **2. 模型可解释性差** - **BP网络的局限性**: - 权重矩阵难以直接解释变量重要性 - 黑箱特性阻碍故障机理分析 --- ##### **3. 计算资源浪费** - **无效特征干扰**:若输入变量包含大量非因果变量,会导致: - 网络结构冗余(需要更多隐藏层节点) - 训练时间增加 - 过拟合风险上升 --- #### **四、增强框架的扩展方法** --- ##### **1. 因果与相关性的融合验证** - **操作**: 1. 用格兰杰检验筛选出因果变量集合$X_{GCI}$ 2. 通过相关系数筛选出高相关变量集合$X_{corr}$ 3. 取并集$X_{final} = X_{GCI} \cup X_{corr}$ - **优势**:兼顾因果性和瞬时相关性 --- ##### **2. 动态因果分析** - **场景**:故障传播路径随时间变化(如级联故障) - **方法**: - 滑动窗口格兰杰检验 - *代码片段*: ```python window_size = 100 for i in range(len(df) - window_size): window_data = df.iloc[i:i+window_size] # 在滑动窗口内执行格兰杰检验 # 记录因果关系的动态变化 ``` --- ##### **3. 基于SHAP值的解释增强** - **作用**:在BP模型训练后,量化各输入变量对预测结果的贡献度 - *实现代码*: ```python import shap explainer = shap.DeepExplainer(model, X_train) shap_values = explainer.shap_values(X_test) shap.summary_plot(shap_values, X_test, feature_names=significant_vars) ``` - **输出示例**: ![SHAP值可视化](https://shap.readthedocs.io/en/latest/example_notebooks/overviews/An%20introduction%20to%20explainable%20AI%20with%20Shapley%20values.html) --- #### **五、典型案例:风力发电机故障诊断** --- ##### **1. 数据预处理** - **原始数据**:振动信号、转速、温度、润滑油压力、电流等20个传感器指标 - **处理步骤**: - 缺失值:线性插值填补 - 平稳化:对振动信号进行一阶差分 - 归一化:Min-Max缩放至[0,1] --- ##### **2. 格兰杰因果检验** - **目标变量**:故障编码(0/1) - **筛选结果**: - 显著因果变量:高频振动信号(p=0.008)、轴承温度(p=0.023) - 非因果变量:环境温度(p=0.62)、机舱倾角(p=0.41) --- ##### **3. BP网络建模** - **输入层**:高频振动、轴承温度(2个节点) - **隐藏层**:64 → 32 → 16(ReLU激活) - **输出层**:1个节点(Sigmoid激活) - **性能**:测试集准确率92.7%,AUC=0.94 --- ##### **4. 诊断结论** - **根源定位**: - 高频振动异常 → 暗示叶片不平衡或轴承磨损 - 轴承温度升高 → 确认润滑系统失效 - **维护建议**:优先检查齿轮箱润滑管路 --- #### **六、框架选择总结** | 步骤 | 正确流程 | 错误流程 | |------|----------|----------| | **因果分析** | 在建模前明确因果变量 | 建模后难以追溯因果 | | **模型效率** | 输入变量精简,训练快 | 包含冗余变量,效率低 | | **结果可信度** | 因果支撑结论可靠 | 可能受虚假相关误导 | --- ### **关键建议** 1. **时序数据严格验证**:确保格兰杰检验前完成平稳性、协整性检验 2. **因果与数据驱动结合**:用格兰杰检验缩小变量范围,再用BP网络捕捉非线性关系 3. **持续验证**:定期重新运行因果检验(如设备老化后故障模式可能改变)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值