Как найти значимые корреляции в большом наборе данных
Я с помощью Р. Мой набор данных имеет около 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), вы можете использовать следующие.
-
используя те же демо-данные от @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)))
-
Установить Hmisc
install.packages("Hmisc")
-
импортировать библиотеку и найти корреляции (@Carlos)
library(Hmisc) correlations <- rcorr(as.matrix(the_data))
-
цикл над значениями печати значимых корреляций
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)
который произведет:
Если вы пытаетесь предсказать y, используя только одну переменную, вы должны взять ту, которая в основном коррелирует с y.
Для этого просто используйте команду which.max(abs(cor(x,y)))
. Если вы хотите использовать более одной переменной в своей модели, вам нужно рассмотреть что-то вроде оценки лассо