如何计算Pearson';Python中的sr?

如何计算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

在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(n-3)
  • 将置信区间转换回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