如何计算Pearson';Python中的sr?
在Python中,我知道如何使用如何计算Pearson';Python中的sr?,python,statistics,scipy,pearson,Python,Statistics,Scipy,Pearson,在Python中,我知道如何使用scipy.stats.pearsonr计算r和相关的p值,但我找不到计算r的置信区间的方法。这是怎么做到的?感谢您的帮助:)使用rpy2和心理测量学库(您需要先安装R并在R中运行install.packages(“心理测量学”) 其中0.9是相关性,n是样本量,0.95是置信水平,根据[1],直接用Pearson r计算置信区间是复杂的,因为它不是正态分布。需要采取以下步骤: 将r转换为z' 计算z'置信区间。z'的采样分布近似为正态分布,标准误差为1/sqrt
scipy.stats.pearsonr
计算r和相关的p值,但我找不到计算r的置信区间的方法。这是怎么做到的?感谢您的帮助:)使用rpy2和心理测量学库(您需要先安装R并在R中运行install.packages(“心理测量学”)
其中0.9是相关性,n是样本量,0.95是置信水平,根据[1],直接用Pearson r计算置信区间是复杂的,因为它不是正态分布。需要采取以下步骤:
def r_to_z(r):
return math.log((1 + r) / (1 - r)) / 2.0
def z_to_r(z):
e = math.exp(2 * z)
return((e - 1) / (e + 1))
def r_confidence_interval(r, alpha, n):
z = r_to_z(r)
se = 1.0 / math.sqrt(n - 3)
z_crit = stats.norm.ppf(1 - alpha/2) # 2-tailed z critical value
lo = z - z_crit * se
hi = z + z_crit * se
# Return a sequence
return (z_to_r(lo), z_to_r(hi))
参考:
bennylp给出的答案基本正确,但是,在计算第三个函数中的临界值时有一个小错误 它应该是:
def r_confidence_interval(r, alpha, n):
z = r_to_z(r)
se = 1.0 / math.sqrt(n - 3)
z_crit = stats.norm.ppf((1 + alpha)/2) # 2-tailed z critical value
lo = z - z_crit * se
hi = z + z_crit * se
# Return a sequence
return (z_to_r(lo), z_to_r(hi))
这里有另一篇文章供参考:这里有一个解决方案,它使用自举来计算置信区间,而不是Fisher变换(假设二元正态性等),借鉴了:
@bennylp答案的可能重复是正确的,它只是假设您正在将alpha值传递给
alpha
,而您的假设您正在传递1-alpha。i、 e.对于95%的置信区间,他的函数α=0.05和你的函数α=0.95给出了相同的答案。
def r_confidence_interval(r, alpha, n):
z = r_to_z(r)
se = 1.0 / math.sqrt(n - 3)
z_crit = stats.norm.ppf((1 + alpha)/2) # 2-tailed z critical value
lo = z - z_crit * se
hi = z + z_crit * se
# Return a sequence
return (z_to_r(lo), z_to_r(hi))
import numpy as np
def pearsonr_ci(x, y, ci=95, n_boots=10000):
x = np.asarray(x)
y = np.asarray(y)
# (n_boots, n_observations) paired arrays
rand_ixs = np.random.randint(0, x.shape[0], size=(n_boots, x.shape[0]))
x_boots = x[rand_ixs]
y_boots = y[rand_ixs]
# differences from mean
x_mdiffs = x_boots - x_boots.mean(axis=1)[:, None]
y_mdiffs = y_boots - y_boots.mean(axis=1)[:, None]
# sums of squares
x_ss = np.einsum('ij, ij -> i', x_mdiffs, x_mdiffs)
y_ss = np.einsum('ij, ij -> i', y_mdiffs, y_mdiffs)
# pearson correlations
r_boots = np.einsum('ij, ij -> i', x_mdiffs, y_mdiffs) / np.sqrt(x_ss * y_ss)
# upper and lower bounds for confidence interval
ci_low = np.percentile(r_boots, (100 - ci) / 2)
ci_high = np.percentile(r_boots, (ci + 100) / 2)
return ci_low, ci_high