Определение значений P после использования функции cor для проверки значимости в R - PullRequest
0 голосов
/ 22 октября 2018

Я новичок в R и использую функцию cor (и, в частности, Spearman), чтобы определить, существует ли значительная корреляция между течением времени (указано в столбце 1) и увеличением частоты переменных в других 100,001 столбцах.в моем кадре данных.Другими словами, я проверяю, есть ли корреляция между столбцом 1 и столбцом 2-100,001 по очереди.

Итак, в настоящее время я импортирую файл CSV в R, и он преобразуется в набор данных (test_data_fix).В настоящее время я использую следующий код, и он возвращает фрейм данных со всеми метками моих столбцов вместе со всеми соответствующими значениями корреляции Спирмена:

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 голосов
/ 22 октября 2018

Вам нужно повторить.Этот метод, например, дает вам матрицу значений 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 будет связано с другими значениями в этой первой строке, определенно не так.

0 голосов
/ 22 октября 2018

Без данных следующее не проверено, но я верю, что оно делает то, что вы хотите.

Используется 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)
0 голосов
/ 22 октября 2018

cor.test() действительно может предоставить вам p-значение (хотя это может быть проблематично для связей).

Тем не менее, на более высоком уровне подумайте, не имеет ли смысл сгруппировать 100 000 столбцовв один образец.Вполне возможно, что они не только представляют отдельные выборки, но и могут также выбирать разные группы населения (хотя трудно сказать, не зная данных).

Кроме того, если вы решите пойти с одноразовым- при одном сравнении ваши результаты будут в значительной степени не интерпретируемыми, если вы не примените несколько вариантов настройки нескольких тестов (что будет стоить вашей способности обнаруживать истинные положительные результаты).

...