[英]Determining P values after using cor function to test significance in R
我是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列和所有后續列之間的相關性。
您需要進行迭代。 例如,此方法為您提供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
進行測試,而對第1列進行y
。
cor_test_results <- sapply(test_data_fix[-1], function(x)
cor.test(x, y = test_data_fix[[1]], method = "spearman")$p.value)
cor.test()
確實可以為您提供p值(盡管可能會給領帶帶來麻煩)。
也就是說,在更大的層次上,請考慮問問自己,將100,000列分組為一個樣本是否有意義。 它們不僅可能代表不同的樣本,而且還可能在對不同的種群進行抽樣(盡管很難說不知道數據)是完全有可能的。
另外,如果您決定進行一對一的比較,那么如果您不進行某種形式的多次測試調整,您的結果將幾乎無法解釋(這將以檢測真陽性的能力為代價) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.