检验两积差相关系数之间是否有显著性差异

检验两积差相关系数之间是否有显著性差异

本篇目录

一、两积差相关系数由两组彼此独立的被试得到

1.公式

2.结果

二、两积差相关系数由同一组被试得到

1.公式

2.结果

三、python代码

1.两积差相关系数由两组彼此独立的被试得到

2.两积差相关系数由同一组被试得到

两积差相关系数由两组彼此独立的被试得到

公式:

假设A与C的积差相关系数为r1,B与C的积差相关系数为r2,r1与r2来自不同的独立样本。

将r1、r2分别进行费舍Zr转换(查转换表)。由于Zr分布近似正态,因此(Zr1-Zr2)的分布近似正态,故(Zr1-Zr2)分布的标准误是:

注:n1和n2分别为两个样本的容量。

进行Z检验:

结果:

根据单侧概率查单侧检验Z值表,Z0.05=1.645,若计算结果<1.645,则P>0.05,说明两个积差相关系数之间没有显著性差异;若计算结果>1.645,则P<0.05,说明两个积差相关系数之间具有显著性差异。

双侧检验同理。

转换表

两积差相关系数由同一组被试得到

公式:

假设A与C的积差相关系数为r1,B与C的积差相关系数为r2,r1与r2来自相同的样本。

此时,应先计算出三列变量的两两相关系数rAC,rBC,rAB,然后进行t检验。自由度=样本容量-3。

结果:

根据自由度和单侧概率查单侧检验t值表,若计算结果<t0.05,则P>0.05,说明两个积差相关系数之间没有显著性差异;若计算结果>t0.05,则P<0.05,说明两个积差相关系数之间具有显著性差异。

双侧检验同理。

python代码

最近遇到需要比较两个相关系数之间的差异性是否显著的问题,找了各种地方,找到了一些方法,譬如:

方法一并不准确;

方法二、三没弄明白(可能是我才疏学浅吧

);

方法四:还有种软件medcalc可以做这个操作,但是只提供了独立样本情况下(即本文第一种情况)的运算操作,有需要的具体看文章末尾链接(但是电脑空间有限哇,下个软件实在没必要);

方法五:张迎阳老师提供了一个方便的界面,但是需要事先把相关系数和样本容量算出来,但是只提供了独立样本情况下(即本文第一种情况)的相关系数的比较,有需要的具体看文章末尾链接;

既然这样,干脆就自己写个代码。

1.两积差相关系数由两组彼此独立的被试得到

import pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport numpy as npimport pyreadstatimport math

data1 = pd.read_csv(r'C:\Users\lenovo\Desktop\suicide11.csv')  # 导入数据n1 = data1.count()  # 获取个案数(series)print(n1[0]) # 获取个案数(int)a1 = np.around(data1.corr(method='pearson'), decimals=4)  # 选择皮尔逊相关,矩阵结果保留4位小数A = np.array(a1) # 转化为数组R1 = A[0, 1]z1 = (1/2)*math.log((1+R1)/(1-R1))  # 对R1进行费舍Z转换
data2 = pd.read_spss(r'C:\Users\lenovo\Desktop\suicide11.sav')  # 导入数据n2 = data1.count()print(n2[0])a2 = np.around(data2.corr(method='pearson'), decimals=4)  # 选择皮尔逊相关,矩阵结果保留4位小数B = np.array(a1)R2 = B[0, 1]z2 = (1/2)*math.log((1+R2)/(1-R2))
z1_z2 = z1-z2 if z1-z2 > 0 else z2-z1SE = (1/(n1[0]-3)+1/(n2[0]-3))**(1/2)Z = z1_z2/SE  # Z检验
t1 = float(1.96)t2 = float(2.576)t3 = float(3.291)if Z < t1: print('两相关系数不具有显著性差异')elif Z >= t1 & Z < t2: print('两相关系数在0.05具有显著性差异')elif Z >= t2 & Z < t3: print('两相关系数在0.01具有显著性差异')elif Z >= t3: print('两相关系数在0.001具有显著性差异')

2.两积差相关系数由同一组被试得到

import pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport numpy as npimport pyreadstat

data = pd.read_csv(r'C:\Users\lenovo\Desktop\suicide11.csv')  # 导入数据N = data.count()  # 获取个案数
a = np.around(data.corr(method='pearson'), decimals=4)  # 选择皮尔逊相关,矩阵结果保留4位小数
A = np.array(a)R1 = A[0, 2]R2 = A[1, 2]R3 = A[0, 1]
R1_R2 = R1-R2 if R1-R2 > 0 else R2-R1b = (N-3)**(1/2)*(1+R3)**(1/2)c = 2*(1-R1*R1-R2*R2-R3*R3+2*R1*R2*R3)t = R1_R2*b/c**(1/2)T = t.iloc[[0, 0]]print(T[0])t1 = float(1.96)t2 = float(2.576)t3 = float(3.291)if T[0] < t1: print('两相关系数不具有显著性差异')elif T[0] >= t1 & t < t2: print('两相关系数在0.05具有显著性差异')elif T[0] >= t2 & t < t3: print('两相关系数在0.01具有显著性差异')elif T[0] >= t3: print('两相关系数在0.001具有显著性差异')

注:

1.这两个代码只需要放入数据路径,并且数据只包含自变量和因变量,因变量在最后,就可以得出显著性结果以及显著性水平,可以满足绝大部分情况下比较两个相关系数的显著性差异的情况!

2.对于第二种相关系数由同一组被试得到的,样本容量要大于123才可以获得准确结果。因为自由度不同,对应的不同显著性水平下的t值也不同,具体的暂时还不能在代码中呈现,因此要注意使用条件!

(0)

相关推荐