2016-08-25 2 views
0

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

Чтобы справиться с пропущенными значениями, я использую

cor(matrix,use="complete") 

Это дает матрицу без каких-либо значений NA, как хотелось бы. Тем не менее, если я попарное корреляцию между двумя из столбцов А и В

cor(matrix[,A],matrix[,B],use="complete") 

я получить другой результат, чем тот, в [A, B] записи в матрице.

Рассматривая график между двумя переменными, кажется, что второй результат более разумен.

Откуда могло возникнуть это несоответствие?

+0

Добро пожаловать в SO. Чтобы помочь людям дать ответы, обычно предполагается добавить ваши данные в вопрос, чтобы сделать воспроизводимый пример. прочитайте http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – dww

ответ

0

Вы задаете разницу между "complete.obs" и "pairwise.complete.obs".

## example matrix 
set.seed(0);X <- matrix(rnorm(10*3),ncol=3) 
X[1:2,1] <- NA 
X[3:4,2] <- NA 
X[5:6,3] <- NA 

#    [,1]  [,2]  [,3] 
# [1,]   NA 0.7635935 -0.22426789 
# [2,]   NA -0.7990092 0.37739565 
# [3,] 1.329799263   NA 0.13333636 
# [4,] 1.272429321   NA 0.80418951 
# [5,] 0.414641434 -0.2992151   NA 
# [6,] -1.539950042 -0.4115108   NA 
# [7,] -0.928567035 0.2522234 1.08576936 
# [8,] -0.294720447 -0.8919211 -0.69095384 
# [9,] -0.005767173 0.4356833 -1.28459935 
#[10,] 2.404653389 -1.2375384 0.04672617 

## complete 
cor(X, use = "complete.obs") 
#   [,1]  [,2]  [,3] 
#[1,] 1.00000000 -0.69629279 -0.09773585 
#[2,] -0.69629279 1.00000000 -0.01228196 
#[3,] -0.09773585 -0.01228196 1.00000000 

## pairwise 
cor(X, use = "pairwise.complete.obs") 
#   [,1]  [,2]  [,3] 
#[1,] 1.00000000 -0.5531396 0.08229729 
#[2,] -0.55313958 1.0000000 -0.10786401 
#[3,] 0.08229729 -0.1078640 1.00000000 

Для use = "complete.obs", все строки, по меньшей мере, один NA будет отброшен. Так что по существу делает

X1 <- X[7:10, ] ## only the last 4 rows have no `NA` 
cor(X1) 
#   [,1]  [,2]  [,3] 
#[1,] 1.00000000 -0.69629279 -0.09773585 
#[2,] -0.69629279 1.00000000 -0.01228196 
#[3,] -0.09773585 -0.01228196 1.00000000 

Здесь (1,2) или (2,1) запись -0.69629279 вычисляется только 4 данных. Однако, если вы делаете попарно, его можно вычислить с помощью 6 данных:

cor(X[5:10, 1], X[5:10, 2]) 
# [1] -0.5531396 
Смежные вопросы