R: корреляция Пирсона rcorr(x,y) [x=матрица, y=вектор] игнорирует y

У меня есть матрица x (30x2000) из 2000 экспрессий генов в разных клеточных линиях и вектор y (30x1) с непрерывным переменным результатом. Я хочу рассчитать корреляцию Пирсона между каждым геном и результатом, поэтому я ожидаю вектор r-значений 2000x1. Я использовал rcorr(x,y), но в результате получается матрица 2000x2000, поэтому я предполагаю, что она игнорирует y и вычисляет все гены против всех (в руководстве сказано:

x = числовая матрица, содержащая не менее 5 строк и не менее 2 столбцов (если y отсутствует)

Но могу ли я иметь более одного столбца и y тоже? Должен ли я использовать другую функцию?


person PGreen    schedule 25.09.2013    source источник


Ответы (2)


Вам нужно apply выполнить функцию cor по столбцам вашей матрицы x...

apply( x , 2 , cor , y = y )

Воспроизводимый пример

#  For reproducible data
set.seed(1)

#  3 x 4 matrix
x <- matrix( runif(12) , nrow = 3 )
#          [,1]      [,2]      [,3]       [,4]
#[1,] 0.2655087 0.9082078 0.9446753 0.06178627
#[2,] 0.3721239 0.2016819 0.6607978 0.20597457
#[3,] 0.5728534 0.8983897 0.6291140 0.17655675

# Length 3 vector
y <- runif(3)
#[1] 0.6870228 0.3841037 0.7698414

# Length 4 otuput vector
apply( x , 2 , cor , y = y )
#[1]  0.3712437  0.9764443  0.2249998 -0.4903723
person Simon O'Hanlon    schedule 25.09.2013
comment
Вам не нужно использовать apply здесь. Просто cor(x,y) подойдет, или если вы хотите, чтобы это был вектор, а не матрица array(cor(x,y)) - person mrip; 25.09.2013
comment
@mrip ты абсолютно прав. Почему бы вам не добавить это в качестве ответа? - person Simon O'Hanlon; 25.09.2013

Использование функции cor будет работать. В общем, если x равно MxN, а y равно MxP, то cor(x,y) будет матрицей NxP, где запись (i,j) представляет собой корреляцию между x[,i] и y[,j].

Основываясь на воспроизводимом примере SimonO101:

> set.seed(1)
> x <- matrix( runif(12) , nrow = 3 )
> y <- runif(3)
> cor(x,y)
           [,1]
[1,]  0.3712437
[2,]  0.9764443
[3,]  0.2249998
[4,] -0.4903723

Если вам нужен только вектор, а не матрица:

> array(cor(x,y))
[1]  0.3712437  0.9764443  0.2249998 -0.4903723
person mrip    schedule 25.09.2013
comment
Спасибо @mrip, @SimonO101. rcorr возвращает 3 матрицы (r, n, p). Может ли rcorr адаптироваться с использованием apply, чтобы вы также могли получить вектор p-значений? или какой-то вариант cor, который делает то же самое? - person PGreen; 25.09.2013
comment
Я не знаком с rcorr, но похоже что-то вроде apply(x,2,function(a,b){rcorr(a,b)$p},y) должно дать вам матрицу p. - person mrip; 25.09.2013