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

时间:2018-10-22 16:24:29

标签: r correlation

我是R的新手,并且正在使用cor函数(尤其是Spearman)确定时间的流逝(在第1列中指示)与其他100,001列中的变量频率增加之间是否存在显着相关性在我的数据框中。换句话说,我正在测试以查看第1列和第2-100,001列之间是否存在相关性。

因此,目前,我将CSV文件导入R,并将其转换为数据集(test_data_fix)。 当前,我使用以下代码,它返回一个数据框,其中包含我所有的列标签以及所有关联的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值并将它们作为返回的数据框中的列之一。我知道,如果使用cor.test,我可以一次检查单个相关性的p值,或者使用corr.test返回每个可能的相关性的值。但是,有一种方法可以让我只返回p值以测试仅第1列与所有后续列之间的相关性。

3 个答案:

答案 0 :(得分:3)

您需要进行迭代。例如,此方法为您提供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值将与该第一个p值相关联行,绝对不是这样。

答案 1 :(得分:1)

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

它使用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)

答案 2 :(得分:0)

cor.test()确实可以为您提供p值(尽管可能会影响联系)。

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

此外,如果您确实决定进行一对一比较,那么如果您不进行某些种类的多次测试调整,则结果将几乎无法解释(这将以检测能力为代价)真实肯定)。