我是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列与所有后续列之间的相关性。
答案 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列分组为一个样本是否有意义。不仅有可能代表不同的样本,而且有可能对不同的种群进行抽样(尽管很难说不知道数据)。
此外,如果您确实决定进行一对一比较,那么如果您不进行某些种类的多次测试调整,则结果将几乎无法解释(这将以检测能力为代价)真实肯定)。