2015-08-13 4 views
1

Мне нужна матрица с коэффициентами корреляции, которые больше 0,2. Я придумал следующее решение.cor() с отсутствующими значениями

mts.data <- ts(data.frame(a=arima.sim(model=list(1,0,0), n=10), 
     b=arima.sim(model=list(1,0,1), n=10), c=arima.sim(model=list(1,0,0), 
     n=10), d=arima.sim(model=list(1,0,2), n=10), 
     e=arima.sim(model=list(2,0,1), n=10)), start=c(2007,1), frequency=12) 

critcor <- function(x) { 
    crit.mat <- matrix(0, nrow=ncol(x), ncol=ncol(x)) 
    for(j in 1:ncol(x)) { 
    for(i in 1:ncol(x)) { 
     if(abs(cor(x[,i], x[,j])) > 0.2) { 
     crit.mat[i,j] <- cor(x[,i], x[,j]) 
     } 
    } 
    } 
    return(crit.mat) 
} 

Это прекрасно работает. К сожалению, мой набор данных содержит отсутствующие значения.

mts.data[1:3, 4] <- NA 
mts.data[9:10, 5] <- NA 

Когда я запускаю свою функцию, у меня есть ошибка.

critcor(mts.data) 
# Error in if (abs(cor(x[, i], x[, j])) > 0.2) { : 
# missing value where TRUE/FALSE needed 

Я просматриваю Интернет в течение нескольких часов, и у меня нет абсолютно никакой идеи, как я могу это исправить. Если корреляция невозможна из-за недостающих значений, я хочу, чтобы моя функция просто напечатала 0.

+2

См. Аргумент 'use' функции' cor'. Вы должны использовать либо 'complete.obs', либо' pairwise.complete.obs' (возможно, последний). –

+3

Действительно .. (как @mts) также (через '' p "') ниже. @nelakell: Это поможет вам привыкнуть читать страницы справки R, в данном случае '' cor'. Он прямо сказал бы вам, что пропущенные значения могут быть обработаны очень хорошо. –

+0

спасибо @ MartinMächler. Это хороший совет. Я был так в решении проблемы моей функции, что я не думал об этом в первую очередь. – nelakell

ответ

4

Вы можете значительно упростить код, как это:

cm = cor(mts.data, use = "p") 
cm[abs(cm) <= 0.2] = 0 

, который дает:

> cm 
      a   b   c   d   e 
a 1.0000000 0.0000000 -0.4667718 -0.5241904 -0.6864418 
b 0.0000000 1.0000000 0.0000000 -0.3270387 0.0000000 
c -0.4667718 0.0000000 1.0000000 0.4708803 0.5222566 
d -0.5241904 -0.3270387 0.4708803 1.0000000 0.0000000 
e -0.6864418 0.0000000 0.5222566 0.0000000 1.0000000 

Сниппает use = "p" коротко для «попарно полных наблюдений», т.е. NA s будет опущен, когда это необходимо , Для получения дополнительных опций и подробностей см. ?cor.

Ошибка, которую вы получили, была когда у вас было значение, которое было NA. Тогда и сравнение NA > 0.2 будет NA, а if не принимает NA в качестве своего входа, таким образом, ошибку.