Как найти значимые корреляции в большом наборе данных

Я с помощью Р. Мой набор данных имеет около 40 различных переменных / векторов, и каждый из них имеет около 80 записей. Я пытаюсь найти значимые корреляции, это означает, что я хочу выбрать одну переменную и позволить R вычислить все корреляции этой переменной с другими 39 переменными.

Я попытался сделать это, используя линейную модель с одной объясняющей переменной, которая означает: Y=a*X+b. Затем команда lm () дает мне оценку для a и p-значения этой оценки для a. Тогда я бы продолжил и используйте одну из других переменных, которые у меня есть для X, и повторите попытку, пока я не найду p-значение, которое действительно мало.

Я уверен, что это общая проблема,есть ли какой-то пакет или функция, которая может попробовать все эти возможности (грубая сила), показать их, а затем, возможно, даже сортирует их по P-значению?

4 ответов


вот некоторые примеры данных для воспроизводимости.

m <- 40
n <- 80
the_data <- as.data.frame(replicate(m, runif(n), simplify = FALSE))
colnames(the_data) <- c("y", paste0("x", seq_len(m - 1)))

вы можете рассчитать корреляцию между двумя столбцами, используя cor. Этот код перебирает все столбцы кроме первого (который содержит наш ответ), и вычисляет корреляцию между столбца и первого столбца.

correlations <- vapply(
  the_data[, -1],
  function(x)
  {
    cor(the_data[, 1], x)
  },
  numeric(1)
)

вы можете найти столбец с наибольшей величиной корреляции с y использование:

correlations[which.max(abs(correlations))]

Итак, зная, какие переменные коррелируют какие другие переменные могут быть интересны, но, пожалуйста, не делайте больших выводов из этих знаний. Вам нужно правильно подумать о том, что вы пытаетесь понять, и какие методы вам нужно использовать. Народ в Cross Validated могу помочь.


для того чтобы напечатать список значимых корреляций (p > 0,05), вы можете использовать следующие.

  1. используя те же демо-данные от @Richie:

    m <- 40
    n <- 80
    the_data <- as.data.frame(replicate(m, runif(n), simplify = FALSE))
    colnames(the_data) <- c("y", paste0("x", seq_len(m - 1)))
    
  2. Установить Hmisc

    install.packages("Hmisc")
    
  3. импортировать библиотеку и найти корреляции (@Carlos)

    library(Hmisc)
    correlations <- rcorr(as.matrix(the_data))
    
  4. цикл над значениями печати значимых корреляций

    for (i in 1:m){
      for (j in 1:m){
        if ( !is.na(correlations$P[i,j])){
          if ( correlations$P[i,j] < 0.05 ) {
            print(paste(rownames(correlations$P)[i], "-" , colnames(correlations$P)[j], ": ", correlations$P[i,j]))
          }
        }
      }
    }
    

вы можете использовать функцию rcorr из пакета Hmisc.

используя те же демо-данные от Ричи:

m <- 40
n <- 80
the_data <- as.data.frame(replicate(m, runif(n), simplify = FALSE))
colnames(the_data) <- c("y", paste0("x", seq_len(m - 1)))

затем:

library(Hmisc)
correlations <- rcorr(as.matrix(the_data))

получить доступ к p-значения:

correlations$P

для визуализации вы можете использовать пакет corrgram

library(corrgram)
corrgram(the_data)

который произведет: enter image description here


Если вы пытаетесь предсказать y, используя только одну переменную, вы должны взять ту, которая в основном коррелирует с y. Для этого просто используйте команду which.max(abs(cor(x,y))). Если вы хотите использовать более одной переменной в своей модели, вам нужно рассмотреть что-то вроде оценки лассо