使用 cor 函数测试 R 中的显着性后确定 P 值

Determining P values after using cor function to test significance in R

我是 R 的新手,我正在使用 cor 函数(特别是 Spearman)来确定时间的流逝(如第 1 列所示)与另一个变量的频率增加之间是否存在显着相关性我的数据框中有 100,001 列。也就是说,我是依次测试第1列和第2列是否有相关性-100001

因此,目前,我将 CSV 文件导入 R,并将其转换为数据集 (test_data_fix)。 目前,我使用以下代码,它 return 是一个数据框,其中包含我所有的列标签以及所有相关的 Spearman 相关值:

x <- test_data_fix[1:100001] y <- test_data_fix[1] corrs_test <- round(cor(x, y, method = "spearman", use="complete.obs"), 3)

但是,我还试图找到 P 值并将它们作为我的 returned 数据框中的列之一。我知道,如果我使用 cor.test,我可以一次检查单个相关性的 p 值,或者使用 corr.test returns 检查每个可能相关性的值。但是,有没有一种方法可以 return p 值来检验第 1 列和所有后续列之间的相关性。

cor.test() 确实可以为您提供一个 p 值(尽管它可能对关系有问题)。

也就是说,在更大的层面上,考虑问问自己将 100,000 列分组到一个样本中是否有意义。完全有可能它们不仅代表不同的样本,而且它们还可能对不同的人群进行抽样(尽管很难说不知道数据)。

此外,如果您决定进行一对一比较,如果您不应用某种多重测试调整(这将以您的能力为代价),您的结果将几乎无法解释检测真阳性)。

你需要迭代。例如,此方法为您提供 p 值矩阵,类似于 cor 为您提供每个列-列组合的相关值。

myfunc <- function(i,j) mapply(function(a,b) cor.test(mtcars[[a]], mtcars[[b]])$p.value, i, j)
mt <- mtcars[1:5]
outer(seq_len(ncol(mt)), seq_len(ncol(mt)), myfunc)
#              [,1]         [,2]         [,3]         [,4]         [,5]
# [1,] 0.000000e+00 6.112687e-10 9.380327e-10 1.787835e-07 1.776240e-05
# [2,] 6.112687e-10 0.000000e+00 1.802838e-12 3.477861e-09 8.244636e-06
# [3,] 9.380327e-10 1.802838e-12 0.000000e+00 7.142679e-08 5.282022e-06
# [4,] 1.787835e-07 3.477861e-09 7.142679e-08 0.000000e+00 9.988772e-03
# [5,] 1.776240e-05 8.244636e-06 5.282022e-06 9.988772e-03 0.000000e+00

甚至更好,有名字(感谢@RyanD):

outer(mt, mt, Vectorize(function(a, b) cor.test(a, b)$p.value)) 
#               mpg          cyl         disp           hp         drat
# mpg  0.000000e+00 6.112687e-10 9.380327e-10 1.787835e-07 1.776240e-05
# cyl  6.112687e-10 0.000000e+00 1.802838e-12 3.477861e-09 8.244636e-06
# disp 9.380327e-10 1.802838e-12 0.000000e+00 7.142679e-08 5.282022e-06
# hp   1.787835e-07 3.477861e-09 7.142679e-08 0.000000e+00 9.988772e-03
# drat 1.776240e-05 8.244636e-06 5.282022e-06 9.988772e-03 0.000000e+00

如果您只需要将一列与所有其他列进行比较,则:

outer(1, seq_len(ncol(mt)), myfunc)
#      [,1]         [,2]         [,3]         [,4]        [,5]
# [1,]    0 6.112687e-10 9.380327e-10 1.787835e-07 1.77624e-05
outer(mt[1], mt, Vectorize(function(a, b) cor.test(a, b)$p.value)) 
#     mpg          cyl         disp           hp        drat
# mpg   0 6.112687e-10 9.380327e-10 1.787835e-07 1.77624e-05

...但是将其作为 data.frame 中的一列应用是没有意义的:添加一列表明(比如说)第一个返回的 p 值将与中的其他值相关联第一行,绝对不是这样。

没有数据,以下内容未经测试,但我相信它可以满足您的要求。

它使用 sapply 到 运行 测试每列 2 到 100001 作为 x 和第一列作为 y

cor_test_results <- sapply(test_data_fix[-1], function(x)
  cor.test(x, y = test_data_fix[[1]], method = "spearman")$p.value)