向量化代码计算spearman两两相关系数与显著性,加快微生物网络构建。

        利用spearman相关性分析是构建微生物共现网络常用的方法,需要计算每一对OTU的相关系数r和显著性p值,并对r和p值进行筛选来构建微生物网络。但由于OTU table往往有成千上万行,用R自带的corr.test()函数计算非常费时,严重制约我们的分析速度。笔者在计算4000多行的OTU table时,往往需要数小时。我在之前的一篇博客中利用并行的方法对spearman相关系数的计算进行了并行化加速,极大地提高了计算的速度,可参考R语言并行计算spearman相关系数_道阻且长1994的博客-CSDN博客_r语言计算spearman。但我的思路其实是被corr.test()函数的计算方法给带偏了。PCA(主成分分析)在计算协方差矩阵时根本没有像corr.test()那样对OTU进行两两成对(pair-wise)地去计算(相当于套了两成for循环),而是充分利用R语言向量化计算的特性,以矩阵为单位进行求解。受此启发,我对快速计算spearman相关系数及其显著性(fdr方法矫正)进行了重写,可以在一分钟内算出4000多个OTU间的相关系数及其fdr矫正过的p值。

#otu_niche为行为sample,列为OTU的OTU table
fast_spearman_fdr <- function(otu_niche){
  r <- cor(otu_niche,method="spearman")
  n = nrow(otu_niche)
  t <- (r * sqrt(n - 2))/sqrt(1 - r^2)
  p <- -2 * expm1(pt(abs(t), (n - 2), log.p = TRUE))
  p[upper.tri(p, diag = FALSE)] <- p.adjust(p[upper.tri(p,diag = FALSE)], "fdr")
  p[lower.tri(p, diag = FALSE)] = t(p)[lower.tri(p, diag = FALSE)]
  return(list(r=r,p=p))
}

        感触真的很深,这还只是一个简单的spearman相关系数和p值的计算,不知道原理的话,用corr.test()计算要等数小时,知道原理后则能更灵活地修改和应用。以后在使用R语言的一些函数时不能简单地把它当一个黑箱,而是要充分了解背后计算的原理和方法。

 测试数据和代码可参考:

 R语言向量化计算spearman相关系数及RMT确定阈值-专业指导文档类资源-CSDN下载资源内容:R语言向量化计算spearman相关系数及RMT确定阈值;学习目标:通过向量化R代码加快更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_43367441/82724288

Spearman等级相关系数是一种非参数统计方法,用于衡量个变量之间的相对顺序是否一致。在Python中,我们可以使用`scipy.stats.spearmanr()`函数来进行Spearman相关系数计算,并通过`statsmodels`库做假设检验来检查其显著性。 首先,你需要安装`scipy`和`statsmodels`库,如果还没安装可以使用pip安装: ```bash pip install scipy statsmodels ``` 然后,你可以编写如下Python代码计算并检验Spearman相关系数显著性: ```python import numpy as np from scipy import stats import statsmodels.api as sm # 假设你有个列表,x和y,代表你要分析的数据 x = [your_data_for_x] y = [your_data_for_y] # 计算Spearman相关系数 correlation, p_value = stats.spearmanr(x, y) print("Spearman's Rank Correlation Coefficient:", correlation) print("P-value (Significance):", p_value) # 如果p值小于通常设置的阈值(比如0.05),则认为相关性是显著的 if p_value < 0.05: print("The correlation is statistically significant.") else: print("The correlation is not statistically significant.") # 使用statsmodels进行更详细的显著性测试 model = sm.OLS(np.array(y).reshape(-1, 1), sm.add_constant(np.array(x))) result = model.fit() print(result.summary()) ``` 这里,`np.array(x)`和`np.array(y)`将列表转换为NumPy数组,便于处理。`sm.add_constant()`是为了添加截距项,因为OLS模型需要它。`summary()`会提供完整的回归结果,包括Spearman系数、t-statistic和p-value等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长1994

您的鼓励有助于我创作更多高质量

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值