scipy 如何计算与Pandas群体的Pearsonr(和相关显著性)?

dba5bblo  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(163)

我想用Pandas和皮尔逊做一个分组相关。
目前我有:

df = pd.DataFrame(np.random.randint(0,10,size=(1000, 4)), columns=list('ABCD'))

df.groupby(['A','B'])[['C','D']].corr().unstack().iloc[:,1]

然而,我想使用pearsonr(scipy包)计算相关性显著性,如下所示:

from scipy.stats import pearsonr
corr,pval= pearsonr(df['C'],df['D'])

我如何将groupby和pearsonr结合起来,就像这样:

corr,val=df.groupby(['A','B']).agg(pearsonr(['C','D']))
waxmsbnn

waxmsbnn1#

如果我理解的话,你需要对CD之间的任何AB组合进行皮尔森检验。
要执行此任务,您需要像之前一样执行groupby(['A','B'])。(每个A,B组合对应一个 Dataframe ),因此您可以通过apply方法将stats.pearsonr应用于这些 Dataframe 中的任何一个。(r,相关指数),对于p值,您还可以将pearsonr的输出包含在pd.Series中。

from scipy import stats

df.groupby(['A','B']).apply(lambda d:pd.Series(stats.pearsonr(d.C, d.D), index=["corr", "pval"]))

输出为:

corr      pval
A B                    
0 0 -0.318048  0.404239
  1  0.750380  0.007804
  2 -0.536679  0.109723
  3 -0.160420  0.567917
  4 -0.479591  0.229140
..        ...       ...
9 5  0.218743  0.602752
  6 -0.114155  0.662654
  7  0.053370  0.883586
  8 -0.436360  0.091069
  9 -0.047767  0.882804

[100 rows x 2 columns]

在朱庇特:

我可以给予你的另一个建议是调整p值以避免假阳性,因为你要重复实验几次:

corr_df["qval"] = p_adjust_bh(corr_df.pval)

我使用了here中的p_adjust_bh函数(答案来自@Eric Talevich)

相关问题