脑影像分析|数据分析——单个变量或多个变量与y的皮尔逊相关,同时返回r与p值(python)

article/2025/8/14 13:25:26

在这里插入图片描述

| 图源

  皮尔逊相关是计算两个变量之间线性相关关系,或者两个向量共线程度的常用指标,应返回衡量相关程度的r值,和相关显著程度的p值。我们熟知的工具包,如pandas,numpy和scipy等,只能计算单个变量x与变量y之间的相关值,或者多个变量两两相关的相关矩阵。当我们想要分别计算多个变量X与y之间的相关关系时,就需要自己手撕代码。如果觉得手撕代码太费头发,或者对代码不怎么精通,那么就往下看吧。笔者废了好大一把头发,基于numpy和scipy撕三个函数方法,帮你快速实现多个变量与y之间的相关关系,并同时返回r和p值。

copyright© 意疏:https://blog.csdn.net/sinat_35907936/article/details/123805702


单个变量与y的皮尔逊相关


  简单描述一下我们常用的求皮尔逊相关方法的使用。如果目标是求两个变量之间相关关系,并且需要返回p值,用scipy。如果是求多个变量两两相关的相关矩阵,用numpy和pandas,具体用什么,取决于输入是DataFrame还是numpy数组。

  假设我们有以下数据,变量x和变量y都具有100个观测值。

import numpy as npnp.random.seed(3)
x= 2 + np.random.random(100)
y = 1 + np.random.random(100)

  输入x,y,都是一维向量,其返回向量x与向量y的r和p值。对上述模拟数据求相关,如下。

import numpy as np
from scipy.stats import pearsonrnp.random.seed(3)
x= 2 + np.random.randn(100)
y = 1 + np.random.randn(100)
r, p = pearsonr(x, y)print(r, p)
#-0.25690193664486277 0.009874914626309943

  输入就是DataFrame本身,函数计算表格中任意两列两两之间的相关值(注意一个变量的所有观测值放一列),最后返回一个相关矩阵,不包含p值。注意到该函数不包含y,要求x与y的相关关系,需要把x和y拼接在一起,再调用该方法。对上述模拟数据求相关,如下。

import numpy as np
import pandas as pdnp.random.seed(3)
x= 2 + np.random.randn(100)
y = 1 + np.random.randn(100)# 拼接
xy = np.vstack((x, y)).T
pd_xy = pd.DataFrame(xy)r_mat = pd_xy.corr()
print(r_mat)
#          0         1
# 0  1.000000 -0.256902
# 1 -0.256902  1.000000r = np.array(r_mat.iloc[0,1].squeeze())
print(r)
# -0.25690193664486294

  该方法自由度比较高,输入X可以是向量或矩阵,输入y也可以是向量或者矩阵且不是必要参数,返回一个相关矩阵,不包含p值。当输入只有x时,效果与上述pandas相同(注意一个变量的所有观测值默认放一行,设置rowvar=False,一个变量的所有观测值将放一列),当x与y都存在时,函数会自动拼接x和y,形成xy,再求相关矩阵,相当于省去了pandas里拼接的步骤。对上述模拟数据求相关,如下。

import numpy as npnp.random.seed(3)
x= 2 + np.random.randn(100)
y = 1 + np.random.randn(100)# 自动拼接
r_mat = np.corrcoef(x,y, rowvar=False)
print(r_mat)
# [[ 1.         -0.25690194]
# [-0.25690194  1.        ]]r = r_mat[0,1].squeeze()
print(r)#-0.2569019366448628

copyright© 意疏:https://blog.csdn.net/sinat_35907936/article/details/123805702


多个变量与y的皮尔逊相关


  假设我们有以下数据,X包含10个变量,每个变量1000个观测值,变量y包含1000个观测值。现在需要求X中每一个变量与y的皮尔逊相关,然后分别返回r和p。

import numpy as npnp.random.seed(3)X = 2 + np.random.randn(1000,10)
y = 1 + np.random.randn(1000)
  • 循环单变量法——不推荐

  循环遍历所有的变量,这是最容易想到,最简单,却非常低效的方法。在变量很多的时候,这种方法的效率将远远低于后面两种方法。

# -*- coding: utf-8 -*-
"""
@author: CSDN 意疏
"""
import time
import numpy as np
from scipy.stats import pearsonrdef batch_pearsonr(X, y):X = np.array(X)y = np.array(y)cols = X.shape[1]p_list = []r_list = []for col in range(cols):r, p = pearsonr(X[:, col], y)p_list.append(p)r_list.append(r)return np.array(r_list), np.array(p_list)if '__name == __main__':np.random.seed(3)X = 2 + np.random.randn(1000,100)y = 1 + np.random.randn(1000)st = time.time()r, p = batch_pearsonr(X, y)print(time.time()-st)print(r)print(p)
0.007961273193359375
[-0.0227441   0.00720729  0.01410081  ... -0.028843    0.05403485  0.00350507]
[0.47249521 0.81993201 0.65605162 ... 0.36221919 0.08766555 0.91185276]
  • 公式法——推荐

  由皮尔逊相关的公式,推出多个变量与y相关的公式,然后实现。都是矩阵乘法,加上numpy高效率,这种方法效率会远高于上述循环单变量法。
r = 1 N ∑ i = 1 N ( x i − x ‾ ) ( y i − y ‾ ) σ x σ y (1) \tag 1 r = \cfrac {\cfrac 1 N \sum^N_{i=1}(x_i - \overline x)(y_i- \overline y)} {\sigma_{\bold x} \sigma_{\bold y}} r=σxσyN1i=1N(xix)(yiy)(1)

= ( x − x ‾ ) T ( y − y ‾ ) N ∗ σ x σ y (2) \tag 2 = \cfrac {(\bold x- \overline x)^T( y - \overline y)} {N*\sigma_{\bold x} \sigma_{\bold y} } =Nσxσy(xx)T(yy)(2)

r = ( X − X ‾ ) T ( y − y ‾ ) N ∗ σ X σ y (3) \tag 3 \bold r= \cfrac {(\bold X- \overline X)^T(\bold y - \overline y)} {N*\sigma_{\bold X} \sigma_{\bold y} } r=NσXσy(XX)T(yy)(3)

  求p值参考了scipy源码,通过btdtr函数来实现。

# -*- coding: utf-8 -*-
"""
@author: CSDN 意疏
"""import time
import numpy as np
from scipy.special import btdtrdef batch_pearsonr(X, y):X = np.array(X)y = np.array(y)N = X.shape[0]X_center = X - X.mean(axis=0)X_std = X.std(axis=0)y_center = y - y.mean()y_std = y.std()r = np.dot(y_center.T, X_center)/(N*X_std*y_std)r[r>1]=1r[r<-1]=-1ab = N/2 - 1p = 2*btdtr(ab, ab, 0.5*(1 - abs(np.float64(r))))return r, pif '__name == __main__':np.random.seed(3)X = 2 + np.random.randn(1000,100)y = 1 + np.random.randn(1000)st = time.time()r, p = batch_pearsonr(X, y)print(time.time()-st)print(r)print(p)

  在只有100个变量的情况下,公式法比循环单变量法效率也要高近一个数量级。

0.000997304916381836
[-0.0227441   0.00720729  0.01410081 ... -0.028843    0.05403485  0.00350507]
[0.47249521 0.81993201 0.65605162 ... 0.36221919 0.08766555 0.91185276]
  • 相关矩阵法——在较少变量时推荐

  一个变量与其他所有变量的相关值,是包含在变量间两两相关得到的相关矩阵中的,就像上述基于numpy和pandas的单变量相关。那么只要把X和y拼接起来,形成Xy,就可以通过算相关矩阵的方式,得到y与X中每一个变量的相关值。由于y拼在X后面,所以相关矩阵最后一行就是y与Xy中每个变量的相关值,去掉最后一个自相关值,就可以得到y与X中每一个变量的相关值了。为了代码简洁性,此处用numpy而非pandas。

  numpy本身不返回p值,所以求p值参考了scipy源码,通过btdtr函数来实现。

# -*- coding: utf-8 -*-
"""
@author: CSDN 意疏
"""
import time
import numpy as np
from scipy.special import btdtrdef batch_pearsonr(X, y):N = X.shape[0]r_mat = np.corrcoef(X,y, rowvar=False)r = r_mat[-1,:-1].squeeze()ab = N/2 - 1p = 2*btdtr(ab, ab, 0.5*(1 - abs(np.float64(r))))return r, pif '__name == __main__':np.random.seed(3)X = 2 + np.random.randn(1000,100)y = 1 + np.random.randn(1000)st = time.time()r, p = batch_pearsonr(X, y)print(time.time()-st)print(r)print(p)

  从模拟数据结果上看,虽然相关矩阵大量值都是白算的,但是它的效率却比循环单变量法高很多,与公式法相当,但赢在代码量少。不过当变量数目非常多的时候,这种方法效率可能比循环单变量法还低,因为涉及大量的不必要计算。

0.0010364055633544922
[-0.0227441   0.00720729  0.01410081 ... -0.028843 0.05403485  0.00350507]
[0.47249521 0.81993201 0.65605162 ... 0.36221919 0.08766555 0.91185276]

copyright© 意疏:https://blog.csdn.net/sinat_35907936/article/details/123805702


参考


https://blog.csdn.net/sinat_35907936/article/details/115253078?spm=1001.2014.3001.5501
https://github.com/scipy/scipy/blob/v1.8.0/scipy/stats/_stats_py.py#L3900-L4117


http://chatgpt.dhexx.cn/article/oxr3RVt9.shtml

相关文章

SPSS处理多自变量多因变量分析以及描述平均值,在不同情况

SPSS处理工具&#xff1a;SPSS25.0 准备好数据 1.分析多自变量对某一个因变量的显著性 在分析里找到&#xff0c;General linear model,然后选择Univariate, 分别把两个自变量TIssue and Speed 输入到Fixed Factor&#xff0c;然后设置Option里的描述,如果需要其他的设置可以…

R语言实现双变量分析教程

双变量分析表示分析两个变量。 双变量分析是为了分析两个变量之间的关系&#xff0c;与单变量、多变量分析对应。主要有三种方式进行双变量分析。 散点图相关系数简单线性回归 下面使用测试数据作为示例来演示三种方法&#xff0c;供包括两个变量&#xff0c;HourStudied表示…

spss实战案例----分析多个变量与因变量之间是否存在关系,方差分析

本案例是IBM SPSS数据分析与挖掘实战案例精粹----第七章的学习记录 案例背景或目标&#xff1a;激素水平是否在对照组和实验组之间存在差异 分析方法&#xff1a;Bootstrap抽样&#xff0c;秩和检验&#xff0c;秩变换方法&#xff0c;cox回归 字段包括&#xff1a;性别&…

Python学习16 ----Seaborn多变量分析绘图

Seaborn多变量分析绘图 代码详见https://github.com/RenDong3/Python_Note 1 读取数据 2 分析绘图 parameters: x,y,hue 数据集变量 变量名data 数据集 数据集名row,col 更多分类变量进行平铺显示 变量名col_warp 每行的最高平铺数 整数estimator 在每个分类中进行矢量到标…

用SPSS进行多变量数据分析

用SPSS进行多变量数据分析 1.将所给的数据输入SPSS 22.0中文版。分别设置变量为温度&#xff0c;体重1、2、3、4&#xff1b;体重&#xff0c;温度5、10、15、20、30。 2.用SPSS进行作图&#xff08;过程略&#xff09;。 3.对数据进行多因素变量分析&#xff0c;具体操作如…

解读SPSS多元方差分析中的多因素多变量的相互影响

多元方差分析研究的是多个自变量与多个因变量的相互关系&#xff0c;也被称为多变量分析。在《怎么使用SPSS的多元方差分析法》一文中&#xff0c;我们已经详细学习了IBM SPSS Statistics多元方差分析的设置方法。 本文将会重点介绍如何解读多元方差分析的检验结果。由于多元方…

高维数据中特征筛选方法的思考总结——多变量分析筛选法

前言&#xff1a;之前的文章&#xff08;高维数据中特征筛选方法的思考总结——单变量分析筛选法&#xff09;中&#xff0c;对单变量分析筛选变量进行了初步考量&#xff0c;本文将进一步总结多变量分析筛选法。由于本文多处摘录网上的博客&#xff0c;只是进行了归纳整理&…

R语言实现单变量分析教程

单变量分析是理解单个变量的数值分布情况&#xff0c;与之相对的有双变量分析和多变量分析。 加载示例数据 因为csv文件中年收入字段有千分位分隔符&#xff0c;所以先定义转换函数。 setClass("num.with.commas") setAs("character", "num.with.co…

多变量分析绘图及分类属性绘图【知识整理】

多变量分析绘图及分类属性绘图 综述代码模块多指标离散图绘制盒图violin图条形图点图多层面板分类图factorplot()详细说明 小结 综述 学生党整理一些关于数据分析的知识&#xff1a;整理了多变量分析绘图及分类属性绘图的相关代码。主要包括了多指标离散图的绘制、盒图的绘制、…

python多变量相关性分析_多变量相关性分析(一个因变量与多个自变量)

目录:前言 偏相关或复相关 意义与用途 分析方法: 1、 样本相关系数矩阵、相关系数检验 2、 复相关分析 3、 决定系数 (RMSE的介绍) 小结 一、前言: 继上一篇文章,继续探讨相关性分析,这次不再是两个变量,而是3个或者以上的变量之间的相关关系分析。 没读过上…

一文了解11个常见的多变量分析方法!

在社会科学研究中&#xff0c;主要的多变量分析方法包括多变量方差分析&#xff08;Multivariate analysis of variance&#xff0c;MANOVA&#xff09;、主成分分析&#xff08;Principal component analysis&#xff09;、因子分析&#xff08;Factor analysis&#xff09;、…

多变量分析”——数据挖掘、数据分析

I。多重对应分析 多重对应分析在超过两个以上定类变量时有时候非常有效&#xff0c;当然首先我们要理解并思考&#xff0c;如果只有三个或有限的几个变量完全可以通过数据变换和交互表变量重组可以转换成两个定类变量&#xff0c;这时候就可以用简单对应分析了。 对应分析对数据…

点赞、收藏必读文章--数据分析的多变量分析

数据探索性分析(EDA)——多(双)变量分析 0 引言 上一篇文章震惊&#xff01;Python单变量分析竟然如此简单&#xff1f; 介绍了数据分析中的单变量分析&#xff0c;但是我们在实际场景中&#xff0c;遇到的数据大多数是具有多特征、多变量的&#xff0c;因此除了对单个变量进…

“多变量分析”——数据挖掘、数据分析

I。多重对应分析 多重对应分析在超过两个以上定类变量时有时候非常有效&#xff0c;当然首先我们要理解并思考&#xff0c;如果只有三个或有限的几个变量完全可以通过数据变换和交互表变量重组可以转换成两个定类变量&#xff0c;这时候就可以用简单对应分析了。 对应分析对数据…

Open source Python toolbox for seismology

Open source Python toolbox for seismology ObsPy: A Python Toolbox for Seismology https://www.iris.edu/hq/webinar/2015/05/obspy_a_python_toolbox_for_seismology https://github.com/obspy/obspy http://www.obspy.org → https://github.com/obspy/obspy/wiki 2.用p…

Xmy的Python----Numpy库

目录 例题10-1&#xff1a;创建数组并查看数组属性 构造复杂数组 生成随机数 例题10-2&#xff1a;绘制&#xff1a;随机生成10000数据&#xff0c;服从均值为0&#xff0c;方差为1的正态分布的直方图&#xff08;间隔个数&#xff1a;50&#xff09; 通过索引访问数组 数组的…

python3.8安装pysal库

python3.8 安装 pysal 库 我最后是在虚拟环境中测试成功的&#xff0c;在原来的环境中测试还是有问题&#xff0c;但是装这个库只是为了一个assignment&#xff0c;踩完坑来总结一下&#xff0c;先用上再说。 1. 创建虚拟环境 正常环境无论是conda install 还是 conda-forge …

YYlabelCopy

YYlabelCopy 前言 最近公司刷题项目重构,之前刷题是采用富文本渲染,性能极差,业界大神ibireme的YYKit想必大家都知道,YYText的好用之处我就不再赘述.一开始我们是把UIlabel换成YYTextView,为什么不直接换成YYlabel,YYlabel支持异步绘制,因为我们是做公考项目的,试题都要支持复…

Kong Customize Python Plugin

Kong Customize Python Plugin 前情提要&#xff1a;由于公司业务需求&#xff0c;需要针对 Kong 自定义插件&#xff0c;而 Kong 的插件主要是 Lua 语言&#xff0c;公司的技术栈是 Python&#xff0c;所以升级了 Kong 版本到 3.1。Kong3.1支持使用 Python 语言的插件&#xf…

ubuntu中pip install cython_bbox报错

pip install cython_bbox报错 问题记录 pip install cython_bbox报错如下 Collecting cython_bboxUsing cached cython_bbox-0.1.3.tar.gz (41 kB)Preparing metadata (setup.py) ... errorerror: subprocess-exited-with-error python setup.py egg_info did not run succe…