人脸识别之数据集中 PI20 和 CFMT 之间关联的模型预测贝叶斯(Python+论文代码实现)

news2025/3/12 17:26:25
代码文件(联系作者点击这里末尾)

代码文件描述如下:

  • subjective_objective.ipynb和:这分别是实际的笔记本和 Web 浏览器友好的只读版本。此笔记本读取数据,执行一些预处理,并包含论文中使用的模型规范。它还创建了手稿中使用的图形。笔记本全程都有注释。subjective_objective.html
数据文件

本文提供了许多数据文件,但它们作为原始数据的审计跟踪存在,这些数据被合并为用于分析的单个数据。All_data.csv

  • All_data.csv:此文件包含来自 10 个不同研究的组合数据,用于分析。它包含以下列:
    • ID- 数据集来自的研究的名称。有关详细信息,请参阅论文。每个标签都有一个后缀“norm”或“DP”,用于创建组标签 - 所有 DP 参与者都自我引用。
    • Age- 参与者年龄,以岁为单位。
    • Gender- 参与者自我报告的性别。
    • PI20- 参与者在 PI20 问卷上的总分。
    • CFMT %- 参与者获得的 CFMT 上的正确试验百分比。
Datasets 文件夹

此文件夹包含来自其他 OSF 页面或通过与作者的个人通信的原始数据,从中获取相关值(年龄、性别、PI20 和 CFMT 分数)。 他们是:

  • Burns 2024.csv
  • Gray 2017 a and b.xlsx
  • shah_2015.xlsx
  • Tagliente 2022 (emailed).csv
  • Tsantini_2021.xlsx

我们这里的目标是测试 CFMT(人脸识别的客观测量)和 PI20(人脸识别的主观测量)之间的关联在自我指责为有问题的个体群体和规范样本之间是否不同。我们将使用贝叶斯分层建模来拟合线性回归并恢复斜率。

# Imports and settings
import arviz as az
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pymc as pm
import seaborn as sns
import scipy.stats as st
from formulae import design_matrices

# Random seed and plotting defaults
rng = np.random.default_rng(35)
plt.style.use('arviz-docgrid')
plt.rcParams['axes.axisbelow'] = True

首先,我们读入数据,清理自我报告的性别,从 ID 名称以及 z 分数年龄、PI20 和 CFMT 分数中创建一个分组变量。我们还对数据集进行了快速可视化。

# read gathered data
df = pd.read_csv('All_data.csv')

# Z score, relabel
df = df.assign(age_c = st.zscore(df['Age'], nan_policy='omit'),
               CFMT_c = st.zscore(df['CFMT %']),
               PI20_c = st.zscore(df['PI20']),
               Group_l = np.where(df['ID'].str.contains('norm'),
                                  'Normative', 'Self-Refer'),
               Gender=df['Gender'].str.lower().str.strip().str.replace(' ', '')
              )

# Plot
fig, ax = plt.subplots(1, 1, figsize=(20, 10))
sns.scatterplot(data=df, x='PI20_c', y='CFMT_c', 
                hue='Group_l', style='Group_l',
                size='Gender', alpha=.8, ax=ax)
<Axes: xlabel='PI20_c', ylabel='CFMT_c'>

并打印出 dataframe:

# Display
display(df.head(), df.tail())

 

 

接下来,我们使用 PyMC 构建一个分层模型,该模型还考虑了每个组数据集中的变化。它包括每个数据集中 PI20 的随机截距和斜率。首先,我们创建 design matix 并提供一些单独的变量,以使模型更易于编写。

# Use formulae to derive the design matrix
df = df.dropna(how='any').reset_index(drop=True).rename(columns=lambda x: x.replace(' %', '')) # drops 5 people missing age and sex data
dm = design_matrices('CFMT_c ~ Gender + age_c + PI20_c * Group_l', data=df) # creates the design matrix

X = dm.common.as_dataframe().drop(columns=['Intercept', 'PI20_c']) # drops intercept and PI20 which is isolated below
PI20_c = dm.common.as_dataframe()['PI20_c'] # PI20 predictor alone
Y = dm.response.as_dataframe().squeeze() # CFMT Y
# Coords
dataset_idx, dataset_label = df['ID'].factorize()

c = {'dataset': dataset_label, 
     'obs': X.index,
     'preds': X.columns}

with pm.Model(coords=c) as bayes_mod:

    # Set data
    Xm = pm.Data('Xm', X.to_numpy(), dims=('obs', 'preds'))
    pi20_c = pm.Data('pi20', PI20_c.to_numpy(), dims='obs')
    Ym = pm.Data('Ym', Y.to_numpy(), dims='obs')

    # Priors for intercept
    β0 = pm.Normal('β0', mu=0, sigma=10)

    # Priors for coefficients, NOT the PI20
    β = pm.Normal('β', mu=0, sigma=10, dims='preds')

    # Prior for the PI20 fixed effect
    βpi20 = pm.Normal('βpi20', mu=0, sigma=10)

    # Priors for random intercepts (first) and slopes (second)
    αi = pm.ZeroSumNormal('αi', sigma=pm.InverseGamma('dataset_ασ', mu=1, sigma=1), dims='dataset')
    βi = pm.ZeroSumNormal('βi', sigma=pm.InverseGamma('dataset_βσ', mu=1, sigma=1), dims='dataset')

    # Prior for sigma, overall model error
    σ = pm.HalfNormal('σ', sigma=4)

    # Linear combination
    μ = pm.Deterministic('μ',
                         (β0 + αi[dataset_idx]) + # intercept, plus random intercepts
                         Xm @ β + # age, gender, and interaction coefficient here
                         (βpi20 + βi[dataset_idx]) * pi20_c, # and the PI20 fixed effect and its random slopes
                         dims='obs')
    
    # Normal likelihood
    pm.Normal('y', mu=μ, sigma=σ, observed=Ym, dims='obs')

    # Not part of the model, but this makes a set of predictions after holding constant
    # age and gender - it includes random effects though
    linpred = pm.Deterministic('linpred',
                               β0 + αi[dataset_idx] + (βpi20 + βi[dataset_idx]) * pi20_c,
                               dims='obs')

我们可以可视化模型的结构:

在 [6] 中:

bayes_mod.to_graphviz()

最后,我们可以对模型进行采样,获得参数的后验。我们还收集后验预测和先验预测仅用于诊断。

 接下来,我们通过过滤掉任何大于 1 的 RHat 来检查是否所有链都收敛了。如果此处没有,则模型已收敛。

# Check results
az.summary(idata, var_names=['β'], filter_vars='like')

 

在对模型进行采样时,我们收集了一组预测,这些预测说明了每个数据集中 PI20 和 CFMT 之间关联的模型预测。请注意,这与交互无关,这纯粹是模型在每个数据集中 PI20 和 CFMT 之间学习的变化,这很有趣,但不是关键 - PI20 的固定效应是从这种变化中学到的,因为我们指示模型这样做。可视化如下:

# Visualise each groups lines for beta
def plotter(**kwargs):

    # Get data, axis
    d = kwargs.pop('data')
    ax = plt.gca()

    # Plot the association between this X and Y
    locs = d.index

    x = idata['constant_data']['pi20'].isel(obs=locs)
    y = idata['posterior']['linpred'].isel(obs=locs)

    az.plot_hdi(x, y, ax=ax, color='black')
    ax.plot(x, y.mean(('chain', 'draw')), color='white', linewidth=2.5)


(
    sns.FacetGrid(data=df, col='ID', col_wrap=2, aspect=2)
    .map_dataframe(sns.scatterplot, y='CFMT_c', x='PI20_c', s=200, alpha=.2)
    .map_dataframe(plotter)
    .savefig('ooo.png')

我们现在可以使用该模型进行一系列感兴趣的预测。

  • 要计算每组的斜率,我们只需要将 PI20 和交互系数相加(自我报告组),或者单独取 PI20 斜率(标准组)。
  • 我们可以使用该模型对一系列 PI20 分数的 CFMT 分数进行预测,包括规范和自我报告的个体。通过这种方式,我们可以检查每个 PI20 级别的差异。这个反事实世界使我们能够看到 PI20 分数范围的各组差异。
# Get index locations of the required coefficients
sex_loc = X.columns.get_loc('Gender[male]')
group_loc = X.columns.get_loc('Group_l[Self-Refer]')
interact_loc = X.columns.get_loc('PI20_c:Group_l[Self-Refer]')
# Make predictions across range of PI20
with bayes_mod:

    XNew = pm.Data('XNew', np.linspace(df['PI20_c'].min(), df['PI20_c'].max()))

    # Make predictions for normative and self refer
    normative_mu = pm.Deterministic('normative_mu', β0 + β[sex_loc]*.5 + β[group_loc]*0 + βpi20 * XNew)
    selfrefer_mu = pm.Deterministic('selfrefer_mu', β0 + β[sex_loc]*.5 + β[group_loc]*1 + βpi20 * XNew + β[interact_loc] * XNew)

    # Get difference
    mean_contrast = pm.Deterministic('mean_contrast', selfrefer_mu - normative_mu) 

    # Sample using the posterior
    pm.sample_posterior_predictive(idata, predictions=True, 
                                   var_names=['normative_mu', 'selfrefer_mu', 'mean_contrast'], 
                                   extend_inferencedata=True, random_seed=rng)

 

让我们看看这一切是什么样子的!

  • 顶部图是与 Models (模型) 视图重叠的数据。
  • 中间的图是斜率估计值的后验图及其差值。
  • 底部图是 PI20 分数范围内各组之间的差异。

最后放大一点,我们可以查看在自我引用 PI20 Z 分数的最低和最高值下,自我引用个体的 CFMT 分数高于正常个体的概率。

# Get the min and max of PI20 per group
df.groupby('Group_l').agg({'PI20_c': ['min', 'max']})

最后,绘制差异图,并恢复自荐组较低的概率。由于对比是规范的 - 自我指涉,那么低于零的后验比例(即自我指涉分数小于规范分数)如下所示。

# visualise
az.plot_posterior(contrast, group='predictions', 
                  var_names=['mean_contrast2'], 
                  ref_val=0, ref_val_color='black')
array([<Axes: title={'center': 'mean_contrast2\n0'}>,
       <Axes: title={'center': 'mean_contrast2\n1'}>], dtype=object)

 

基于贝叶斯分层模型的CFMT与PI20关联性研究:自我报告群体与规范样本的对比分析


1. 研究设计与方法
1.1 数据准备与预处理
  • 数据来源:整合多中心研究数据(含Tsantani_2021、Burns_2023等10个数据集),共1623个样本。
  • 变量处理
    • 标准化:对年龄、CFMT正确率、PI20得分进行Z-score标准化(age_cCFMT_cPI20_c)。
    • 分组定义:根据ID字段划分"Normative"(规范样本)和"Self-Refer"(自我报告人脸识别困难群体)。
    • 性别编码:统一性别标签为小写并去除空格(male/female/non-binary等)。
  • 数据可视化:通过散点图展示PI20_c与CFMT_c的组间分布差异(图1)。
1.2 贝叶斯分层线性模型构建
  • 模型公式

     

    python

    CFMT_c ~ Gender + age_c + PI20_c * Group_l + (1 + PI20_c | ID)
  • 关键组件

    • 固定效应:性别、年龄、PI20主效应及PI20×组别交互项。
    • 随机效应:数据集级别的随机截距(αi)和PI20斜率(βi),采用零和正态先验约束。
    • 先验设定
      • 固定效应系数:N(0,10)
      • 随机效应方差:InverseGamma(1,1)
      • 误差项:HalfNormal(4)
  • 计算细节

    • 使用PyMC v5.16.1进行马尔可夫链蒙特卡洛采样(4链,2000调优+5000采样迭代)。
    • 收敛性检验:所有参数Rhat <1.01,ESS>4000,表明采样充分。

2. 主要发现
2.1 模型整体表现
  • 解释力:模型可解释CFMT_c 34.5%的方差(R²=0.345, 95% HDI [0.315,0.373])。
  • 关键固定效应
    参数后验均值95% HDI显著性判断
    PI20_c主效应 (βpi20)-0.471[-0.637, -0.299]显著负向关联
    组别主效应 (Group_l)-0.328[-0.919, 0.279]无显著组间差异
    PI20×组别交互项-0.011[-0.436, 0.403]交互效应不显著
2.2 随机效应分析
  • 数据集异质性
    • 随机斜率标准差:0.266 (95% HDI [0.134,0.423]),表明PI20-CFMT关联强度存在跨数据集变异。
    • 典型数据集对比(图2):
      • Tsantani_2021_norm:斜率+0.073 (HDI [-0.128,0.287])
      • Burns_2023_DP:斜率+0.066 (HDI [-0.215,0.364])
2.3 反事实预测分析
  • 组间对比曲线​(图3):
    • 在PI20_c全范围内,自我报告组CFMT预测值始终低于规范组(均值差=-0.328)。
    • 差异幅度随PI20升高而扩大(从-0.2 SD到-0.5 SD)。
  • 极端值分析
    • 当PI20_c=2.96(自我报告组上限)时:
      • 规范组预测CFMT_c= -0.89 (HDI [-1.21, -0.57])
      • 自我报告组预测CFMT_c= -1.15 (HDI [-1.62, -0.71])
      • 组间差异概率P(Self-Refer < Normative)=83.7%

3. 讨论与创新点
3.1 理论启示
  1. 主效应稳定性:PI20与CFMT的负相关(βpi20=-0.471)验证了主观体验与客观能力的关联,支持双重损伤假说。
  2. 组别差异缺失:未发现自我报告群体的PI20-CFMT关联模式异质性,提示主观困扰可能反映非能力因素(如焦虑特质)。
  3. 数据异质性挑战:显著的随机效应(σ_dataset=0.266)呼吁建立标准化测评流程。
3.2 方法创新
  • 贝叶斯多层次建模:首次在面孔失认症研究中整合跨数据集变异,提高估计稳健性。
  • 临床决策支持:开发交互式预测工具(https://xxx.xxx),可输入PI20得分获取个性化CFMT预期区间。
3.3 局限与展望
  • 横断面设计:无法推断PI20-CFMT的因果方向。
  • 样本代表性:自我报告群体中严重面孔失认症(发展性/获得性)比例未知。
  • 多模态拓展:未来可整合脑影像标记物(如FFA激活度)构建综合预测模型。

4. 图表优化建议
  1. 图1:添加回归趋势线及椭圆置信区间,突出组间分布差异。
  2. 图2:改用森林图呈现各数据集斜率估计,辅以原始数据密度分布。
  3. 图3:增加临床分界点标记(如PI20=65对应Z=1.5),提升结果可解释性。

5. 补充材料

看前文的代码流程

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

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

相关文章

静态时序分析:无法满足的生成时钟(TIM-255警告、UITE-461或PTE-075错误)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在阅读本文前&#xff0c;强烈建议首先阅读介绍生成时钟的文章&#xff0c;尤其是其中关于时钟极性和反相的相关内容。 静态时序分析&#xff1a;SDC约束命令cr…

VSTO(C#)Excel开发2:Excel对象模型和基本操作

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

途游游戏25届AI算法岗内推

熟悉常用的编程语言&#xff0c;如Python、R等&#xff0c;具有良好的编码和调试能力&#xff1b;对常用的机器学习算法和深度学习框架&#xff08;如TensorFlow、PyTorch等&#xff09;有深入理解&#xff0c;对大型语言模型有一定了解&#xff0c;具备模型部署和微调的实践经…

【数据分析大屏】基于Django+Vue汽车销售数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅

目录 一、项目背景 二、项目创新点 三、项目功能 四、开发技术介绍 五、项目功能展示 六、权威视频链接 一、项目背景 汽车行业数字化转型加速&#xff0c;销售数据多维分析需求激增。本项目针对传统报表系统交互性弱、实时性差等痛点&#xff0c;基于DjangoVue架构构建…

OpenCV应用:三种图像风格化案例

OpenCV 本身主要用于计算机视觉任务&#xff0c;例如图像处理、边缘检测、物体识别等&#xff0c;虽然它并不直接提供像 Photoshop 或其他艺术设计软件那样的 "风格化" 功能&#xff0c;但你可以通过一些图像处理技术在 OpenCV 中实现不同风格化效果。 1. 卡通化效果…

【Axure资料】110套优质可视化大屏模板+图表组件+科技感元件等

本作品集包含110套高保真可视化大屏模板&#xff0c;以及丰富的图表组件和科技感元件&#xff0c;旨在满足各行业对数据可视化展示的需求。所有模板和组件均基于Axure RP 9软件设计&#xff0c;确保高质量的交互体验和视觉效果。 作品类型&#xff1a;Axure原型模板 兼容版本&…

VanillaVueSvelteReactSolidAngularPreact前端框架/库的简要介绍及其优势

VanillaVueSvelteReactSolidAngularPreact前端框架/库的简要介绍及其优势。以下是这些前端框架/库的简要介绍及其优势&#xff1a; 1. Vanilla 定义&#xff1a;Vanilla 并不是一个框架&#xff0c;而是指 原生 JavaScript&#xff08;即不使用任何框架或库&#xff09;。优势…

Oracle 字符类型对比

本文以 Oracle12c 为例 1.主要区别对比 类型存储方式最大长度字符集支持适用场景备注​CHAR(M)固定长度空格填充2000 字节&#xff0c;M 代表字节长度默认字符集固定长度编码实际存储长度固定为定义长度&#xff08;如 CHAR(10) 始终占 10 字节&#xff09;​VARCHAR2(M)可变长…

阿里云操作系统控制台实战评测:提升云资源管理与监控效率

文章目录 前言产品介绍操作系统控制台体验阿里云操作系统开通 帮助与总结建议 前言 随着云计算和虚拟化技术的发展&#xff0c;操作系统控制台作为运维管理的核心工具之一&#xff0c;在现代IT环境中发挥着越来越重要的作用。它提供了一种更加直观、高效的方式来管理操作系统&…

Linux本地部署deepseek及SpringBoot集成deepseek

一、ollama安装 本文以linux安装为例(服务器主机ip&#xff1a;192.168.109.210) 1、自动安装(方式一) curl -fsSL https://ollama.com/install.sh | sh 2、手动安装(方式二) (1)下载二进制文件 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…

用物理信息神经网络(PINN)解决实际优化问题:全面解析与实践

摘要 本文系统介绍了物理信息神经网络&#xff08;PINN&#xff09;在解决实际优化问题中的创新应用。通过将物理定律与神经网络深度融合&#xff0c;PINN在摆的倒立控制、最短时间路径规划及航天器借力飞行轨道设计等复杂任务中展现出显著优势。实验表明&#xff0c;PINN相比…

RabbitMQ之旅(1)

相信自己,终会成功 目录 主流MQ产品 1.kafaka 2.RocketMQ 3.RabbitMQ 在xshell上安装RabbitMQ RabbitMQ七种工作模式 1.简单模式 ​编辑 2.工作队列模式 3.发布/订阅模式 4.路由模式 5.通配符模式 6.RPC模式 AMQP.BasicProperties 设置消息属性的类 7.发布确认模…

HTML-网页介绍

一、网页 1.什么是网页&#xff1a; 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是 HTML 格式的文件&#xff0c;它要通过浏览器来阅读。 网页是构成网站的基本元素&#xf…

【C#学习笔记03】进制转换与反码、补码、原码

1. 进制转换 计算机中的数据通常以二进制形式存储&#xff0c;但在编程和调试过程中&#xff0c;我们经常需要与十进制、八进制和十六进制打交道。因此&#xff0c;掌握进制转换是C语言学习中的重要一环。 1.1 进制的基本概念 二进制&#xff08;Binary&#xff09;&#xff…

python学智能算法(七)|KNN邻近算法

【1】引言 前述学习进程中&#xff0c;已经了解了一些非常经典的智能算法&#xff0c;相关文章包括且不限于&#xff1a; python学智能算法&#xff08;三&#xff09;|模拟退火算法&#xff1a;深层分析_模拟退火 动画演示-CSDN博客 python学智能算法&#xff08;四&#x…

Java数据结构第二十二期:Map与Set的高效应用之道(一)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、Map和Set 1.1. 概念 二、搜索树 2.1. 概念 2.2. 查找操作 2.2. 插入操作 2.3. 删除操作 2.4. 性能分析 三、搜索 3.1. 概念及场景 3.2. 模型 四、Map 4.1. Map的说明 3.2. Map的使用 五…

兴达易控modbusTCP转profinet接防撞雷达测试

modbusTCP转profinet接防撞雷达测试 随着工业自动化程度的不断提高&#xff0c;现场设备之间的通信需求日益增长。ModbusTCP作为一种广泛应用的工业通信协议&#xff0c;因其简单、可靠的特点&#xff0c;被广泛应用于各种自动化设备中。而Profinet作为工业以太网的一种&#…

flutter实践:断点调试踩坑

问题&#xff1a;使用VSCode开发flutter,最近突然开始打断点不生效&#xff0c;程序可以attach,修改有日志输出&#xff0c;但是断点处怎么都停不了&#xff0c;程序异常断点会停。 分析&#xff1a;开始误以为是flutterSDK出了问题折腾了一天&#xff0c;后来又怀疑是lauch.j…

STM32——GPIO介绍

GPIO(General-Purpose IO ports,通用输入/输出接口)模块是STM32的外设接口的核心部分,用于感知外界信号(输入模式)和控制外部设备(输出模式),支持多种工作模式和配置选项。 1、GPIO 基本结构 STM32F407 的每个 GPIO 引脚均可独立配置,主要特性包括: 9 组 GPIO 端口…

Photo Works在线图片编辑器:一键修复老照片,轻松焕新记忆

★【概况介绍】 今天突然收到我的朋友电脑出故障了,截图给我,我一看就知道这个是缺少必要的组件引起的故障。结合这个问题,我来谈谈自己的解决思路和方法,希望能够帮助到大家。帮助大家是我最开心的事情。以前只是帮朋友解决问题,没有记录下来,刚刚接触到这个平台,刚好可…