Подтвердить что ты не робот

Уровень значимости добавлен к матричной корреляционной карте с использованием ggplot2

Интересно, как можно добавить еще один уровень важной и необходимой сложности в матричную корреляционную тепловую карту, например, как значение p после типа звезд уровня значимости в дополнение к значению R2 (от -1 до 1)?
В этом вопросе не было поставлено значение звезд уровня значимости или значений p в виде текста на каждом квадрате матрицы, но чтобы показать это в графическом готовом представлении уровня значимости на каждом квадрате матрицы. Я думаю, что только те, кто пользуется благословением ИННОВАЦИОННОГО мышления, могут выиграть аплодисменты, чтобы разгадать такое решение, чтобы иметь лучший способ представить эту добавленную составляющую сложности нашим "матрицам корреляции с половиной правды". Я много гугл, но никогда не видел должного, или я скажу "благоприятный для глаз" способ представить уровень значимости PLUS стандартных цветовых оттенков, которые отражают коэффициент R.
Воспроизводимый набор данных можно найти здесь:
http://learnr.wordpress.com/2010/01/26/ggplot2-quick-heatmap-plotting/
Код R приведен ниже:

library(ggplot2)
library(plyr) # might be not needed here anyway it is a must-have package I think in R 
library(reshape2) # to "melt" your dataset
library (scales) # it has a "rescale" function which is needed in heatmaps 
library(RColorBrewer) # for convenience of heatmap colors, it reflects your mood sometimes
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
nba <- as.data.frame(cor(nba[2:ncol(nba)])) # convert the matrix correlations to a dataframe 
nba <- data.frame(row=rownames(nba),nba) # create a column called "row"
rownames(nba) <- NULL #get rid of row names
nba <- melt(nba)
nba.m$value<-cut(nba.m$value,breaks=c(-1,-0.75,-0.5,-0.25,0,0.25,0.5,0.75,1),include.lowest=TRUE,label=c("(-0.75,-1)","(-0.5,-0.75)","(-0.25,-0.5)","(0,-0.25)","(0,0.25)","(0.25,0.5)","(0.5,0.75)","(0.75,1)")) # this can be customized to put the correlations in categories using the "cut" function with appropriate labels to show them in the legend, this column now would be discrete and not continuous
nba.m$row <- factor(nba.m$row, levels=rev(unique(as.character(nba.m$variable)))) # reorder the "row" column which would be used as the x axis in the plot after converting it to a factor and ordered now
po.nopanel <- list(opts(panel.background=theme_blank(),panel.grid.minor=theme_blank(),panel.grid.major=theme_blank())) # useful to get rid of grids of plot taken from https://gist.github.com/1035189/ac763cb4480c7b522483fa90ed0865d66593737c
#now plotting
ggplot(nba.m, aes(row, variable)) +
geom_tile(aes(fill=value),colour="black") +
scale_fill_brewer(palette = "RdYlGn",name="Correlation") + # here comes the RColorBrewer package, now if you ask me why did you choose this palette colour I would say look at your battery charge indicator of your mobile for example your shaver, won't be red when gets low? and back to green when charged? This was the inspiration to choose this colour set.
opts(axis.text.x=theme_text(angle=-90))+
po.nopanel

Матричная корреляционная карта должна выглядеть так:
enter image description here

Советы и идеи для улучшения решения:
- Этот код может быть полезен, чтобы иметь представление о звездах уровня значимости, взятых с этого сайта:
http://ohiodata.blogspot.de/2012/06/correlation-tables-in-r-flagged-with.html
R-код:

mystars <- ifelse(p < .001, "***", ifelse(p < .01, "** ", ifelse(p < .05, "* ", " "))) # so 4 categories  

- Уровень значимости может быть добавлен как интенсивность цвета для каждого квадрата, как альфа-эстетика, но я не думаю, что это будет легко интерпретировать и захватить - Еще одна идея состояла бы в том, чтобы иметь 4 разных размера квадратов, соответствующих звездам, конечно, давая наименьшее значение для несущественного и увеличиваясь до квадрата полного размера, если самые высокие звезды - Еще одна идея включить круг в эти значащие квадраты и толщину линии круга соответствует уровню значимости (3 оставшиеся категории), все из них одного цвета - То же, что и выше, но фиксируя толщину линии, давая 3 цвета для 3 оставшихся значимых уровней
- Может быть, вы придумали лучшие идеи, кто знает?

Большое спасибо и желаю вам всего наилучшего в этом endevour!

4b9b3361

Ответ 1

Это всего лишь попытка укрепить окончательное решение, я построил здесь звезды как индикатор решения, но, как я сказал, цель состоит в том, чтобы найти графическое решение, которое может говорить лучше, чем звезды. Я просто использовал geom_point и alpha, чтобы указать уровень значимости, но проблема, связанная с тем, что NA (включая и несущественные значения) будет отображаться как значение уровня трех звезд, как это исправить? Я думаю, что использование одного цвета может быть более приятным для глаз при использовании многих цветов и избегать обременения сюжета с множеством деталей для разрешения глаз. Спасибо заранее. Вот сюжет моей первой попытки:
enter image description here

или может быть лучше? enter image description here

Я думаю, что до сих пор лучше всего один ниже, пока вы не придумаете что-то лучше! enter image description here

В соответствии с запросом приведенный ниже код предназначен для последней тепловой карты:

# Function to get the probability into a whole matrix not half, here is Spearman you can change it to Kendall or Pearson
cor.prob.all <- function (X, dfr = nrow(X) - 2) {
R <- cor(X, use="pairwise.complete.obs",method="spearman")
r2 <- R^2
Fstat <- r2 * dfr/(1 - r2)
R<- 1 - pf(Fstat, 1, dfr)
R[row(R) == col(R)] <- NA
R
}
# Change matrices to dataframes
nbar<- as.data.frame(cor(nba[2:ncol(nba)]),method="spearman") # to a dataframe for r^2
nbap<- as.data.frame(cor.prob.all(nba[2:ncol(nba)])) # to a dataframe for p values
# Reset rownames
nbar <- data.frame(row=rownames(nbar),nbar) # create a column called "row" 
rownames(nbar) <- NULL
nbap <- data.frame(row=rownames(nbap),nbap) # create a column called "row" 
rownames(nbap) <- NULL
# Melt
nbar.m <- melt(nbar)
nbap.m <- melt(nbap)
# Classify (you can classify differently for nbar and for nbap also)         
nbar.m$value2<-cut(nbar.m$value,breaks=c(-1,-0.75,-0.5,-0.25,0,0.25,0.5,0.75,1),include.lowest=TRUE, label=c("(-0.75,-1)","(-0.5,-0.75)","(-0.25,-0.5)","(0,-0.25)","(0,0.25)","(0.25,0.5)","(0.5,0.75)","(0.75,1)")) # the label for the legend
nbap.m$value2<-cut(nbap.m$value,breaks=c(-Inf, 0.001, 0.01, 0.05),label=c("***", "** ", "*  ")) 
nbar.m<-cbind.data.frame(nbar.m,nbap.m$value,nbap.m$value2) # adding the p value and its cut to the first dataset of R coefficients
names(nbar.m)[5]<-paste("valuep") # change the column names of the dataframe 
names(nbar.m)[6]<-paste("signif.")
nbar.m$row <- factor(nbar.m$row, levels=rev(unique(as.character(nbar.m$variable)))) # reorder the variable factor
# Plotting the matrix correlation heatmap
# Set options for a blank panel
po.nopanel <-list(opts(panel.background=theme_blank(),panel.grid.minor=theme_blank(),panel.grid.major=theme_blank()))
pa<-ggplot(nbar.m, aes(row, variable)) +
geom_tile(aes(fill=value2),colour="white") +
scale_fill_brewer(palette = "RdYlGn",name="Correlation")+ # RColorBrewer package
opts(axis.text.x=theme_text(angle=-90))+
po.nopanel
pa # check the first plot
# Adding the significance level stars using geom_text 
pp<- pa +
geom_text(aes(label=signif.),size=2,na.rm=TRUE) # you can play with the size
# Workaround for the alpha aesthetics if it is good to represent significance level, the same workaround can be applied for size aesthetics in ggplot2 as well. Applying the alpha aesthetics to show significance is a little bit problematic, because we want the alpha to be low while the p value is high, and vice verse which can't be done without a workaround
nbar.m$signif.<-rescale(as.numeric(nbar.m$signif.),to=c(0.1,0.9)) # I tried to use to=c(0.1,0.9) argument as you might expect, but to avoid problems with the next step of reciprocal values when dividing over one, this is needed for the alpha aesthetics as a workaround
nbar.m$signif.<-as.factor(0.09/nbar.m$signif.) # the alpha now behaves as wanted  except for the NAs values stil show as if with three stars level, how to fix that?
# Adding the alpha aesthetics in geom_point in a shape of squares (you can improve here)
pp<- pa +
geom_point(data=nbar.m,aes(alpha=signif.),shape=22,size=5,colour="darkgreen",na.rm=TRUE,legend=FALSE) # you can remove this step, the result of this step is seen in one of the layers in the above green heatmap, the shape used is 22 which is again a square but the size you can play with it accordingly  

Я надеюсь, что это может быть шагом вперед, чтобы добраться туда! Обратите внимание:
- Некоторые предложили классифицировать или отрезать R ^ 2 по-другому, хорошо, мы можем это сделать, конечно, но все же мы хотим показать аудитории GRAPHICALLY уровень значимости вместо того, чтобы беспокоить глаз со звездными уровнями. Можем ли мы ДОСТИЖИТЬ, что в принципе или нет?
- Некоторые предложили поменять значения р по-разному. Хорошо, это может быть выбор после неудачного показа трех уровней значимости, не беспокоя глаз. Тогда было бы лучше показать значительную/несущественную без уровней
- Возможно, вам будет лучше, если вы придумаете вышеупомянутый обходной путь ggplot2 для эстетики альфа и размера, надеемся скоро услышать от вас!
- Вопрос еще не ответил, ожидая инновационного решения! - Интересно, пакет "corrplot" делает это! Я придумал этот график ниже этого пакета, PS: скрещенные квадраты не являются значимыми, уровень signif = 0,05. Но как мы можем перевести это на ggplot2, не так ли?

enter image description here

- Или вы можете делать круги и скрывать эти несущественные? как это сделать в ggplot2?!
enter image description here