2014-10-26 5 views
3

Мне нравится использовать график корреляции с использованием функции corrplot с коэффициентами корреляции, напечатанными в ячейках (с использованием addCoef.col и addCoefasPercent = TRUE). Я также хотел бы удалить незначительные корреляции с графиком (используя insig = "blank"). Проблема в том, что это работает только для цвета фона, но не для самого коэффициента, поэтому сам коэффициент все еще печатается! См:corrplot показывает незначительные коэффициенты корреляции, даже если установлен insig = «blank»

set.seed(123) 
par(cex=0.8) # trick for cor. coef font size, see http://stackoverflow.com/q/26574054/684229 
col1 <-rainbow(100, s = 1, v = 1, start = 0, end = 0.9, alpha = 1) 
test <- matrix(data=rnorm(400),nrow=20,ncol=20) 


cor.mtest <- function(mat, conf.level = 0.95){ 
    mat <- as.matrix(mat) 
    n <- ncol(mat) 
    p.mat <- lowCI.mat <- uppCI.mat <- matrix(NA, n, n) 
    diag(p.mat) <- 0 
    diag(lowCI.mat) <- diag(uppCI.mat) <- 1 
    for(i in 1:(n-1)){ 
     for(j in (i+1):n){ 
      tmp <- cor.test(mat[,i], mat[,j], conf.level = conf.level) 
      p.mat[i,j] <- p.mat[j,i] <- tmp$p.value 
      lowCI.mat[i,j] <- lowCI.mat[j,i] <- tmp$conf.int[1] 
      uppCI.mat[i,j] <- uppCI.mat[j,i] <- tmp$conf.int[2] 
     } 
    } 
    return(list(p.mat, lowCI.mat, uppCI.mat)) 
} 

cor1 <- cor.mtest(test, 0.95) 

corrplot(cor(test), p.mat = cor1[[1]], insig = "blank", method = "color", addCoef.col="grey", 
    order = "AOE", tl.cex = 1/par("cex"), 
    cl.cex = 1/par("cex"), addCoefasPercent = TRUE) 

Теперь вы можете увидеть, что коэффициенты печатаются также для ничтожных клеток:

enter image description here

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

corrplot(cor(test), p.mat = cor1[[1]], insig = "pch", method = "color", addCoef.col="grey", 
    order = "AOE", tl.cex = 1/par("cex"), 
    cl.cex = 1/par("cex"), addCoefasPercent = TRUE) 

Возможно, это ошибка пакета corrplot?

Как я могу избавиться от печати коэффициента в незначительных ячейках?

+0

Вы можете начать с помещения вызова библиотеки для загрузки пакета с помощью функции. –

ответ

3

Для этого вам нужно немного поработать. Вы должны определить вектор цвета вручную для р-значений, который передается addCoef.col

Если вы заказывали по алфавиту, это прямо вперед

mycol <- ifelse(c(cor1[[1]] < 0.05), "black", "white") 

corrplot(cor(test), p.mat = cor1[[1]] , insig = "blank", method = "color", 
     addCoef.col=mycol , 
     order = "original", tl.cex = 1/par("cex"), 
     cl.cex = 1/par("cex"), addCoefasPercent = TRUE) 

Но, как вы хотите сделать заказ по собственным значениям вам нужно вычислить порядок за пределами corrplot функции

ord <- corrMatOrder(cor(test), order="AOE") 
M <- cor(test)[ord, ord] 

pval <- psych::corr.test(data.frame(test), adjust="none")$p[ord, ord] 
mycol <- ifelse(c(pval < 0.05), "black", "white") 


corrplot(M, p.mat = pval , insig = "blank", method = "color", addCoef.col=mycol , 
     order = "original", tl.cex = 1/par("cex"), 
     cl.cex = 1/par("cex"), addCoefasPercent = TRUE) 

enter image description here


EDIT повторно @ комментарии Мази в

Чтобы обновить ограничения на colourbar установить пределы с cl.lim

corrplot(cor(test), p.mat = cor1[[1]] , insig = "blank", method = "color", 
     addCoef.col=mycol , addCoefasPercent=TRUE, 
     order = "original", cl.lim = c(-100, 100)) 
+1

Спасибо, это отличный ответ! Очень глупо, что в случае 'order =" AOE "порядок должен вычисляться вне функции corrplot, как вы говорите! Это недостаток функции 'corrplot'. 'AddCoef.col' должен принимать матрицу, которая будет иметь тот же порядок и формат, что и корреляционная матрица. – TMS

+1

Я нашел лучший метод! Просто выполните cl.lim = c (-100,100) ', он автоматически масштабирует значения матрицы до [-100, 100], поэтому вам не нужно ничего умножать и даже не менять цветную панель, просто используйте значение по умолчанию. –

+1

cheers @Masi; хорошее найти/обновить – user20650

0

Если вы не слишком придирчивы, вы можете также оставить фон набор для белый и сделайте свой addCoef.col = "white" вместо "grey", как и у вас. Это устранит необходимость в инструкциях для заказа и ifelse.