簡體   English   中英

使用cor函數測試R中的顯着性后確定P值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM