检验两积差相关系数之间是否有显著性差异
检验两积差相关系数之间是否有显著性差异
一、两积差相关系数由两组彼此独立的被试得到
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,说明两个积差相关系数之间具有显著性差异。
双侧检验同理。
最近遇到需要比较两个相关系数之间的差异性是否显著的问题,找了各种地方,找到了一些方法,譬如:
方法一并不准确;
方法二、三没弄明白(可能是我才疏学浅吧
);
方法四:还有种软件medcalc可以做这个操作,但是只提供了独立样本情况下(即本文第一种情况)的运算操作,有需要的具体看文章末尾链接(但是电脑空间有限哇,下个软件实在没必要);
方法五:张迎阳老师提供了一个方便的界面,但是需要事先把相关系数和样本容量算出来,但是只提供了独立样本情况下(即本文第一种情况)的相关系数的比较,有需要的具体看文章末尾链接;
既然这样,干脆就自己写个代码。
1.两积差相关系数由两组彼此独立的被试得到
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pyreadstat
import 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-z1
SE = (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 pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import 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-R1
b = (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值也不同,具体的暂时还不能在代码中呈现,因此要注意使用条件!