使用 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)
我是 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)