Произведите графы в R для определенных корреляций в матрице

I want to generate graphs between variables (columns) that have a correlation above and below a certain point as well as having a pvalue < 0.01. The graphs would be ggplot2 (line or bar) graphs plotting the two columns (variables) that correlate.

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

# Create some dummy data
df <- data.frame(sample(1:50), sample(1:50), sample(1:50), sample(1:50))
colnames(df) <- c("var1", "var2", "var3", "var4")

# Find correlations in the dummy data
df.cor <- cor(df)

# Make up some random pvalues for this example
x <- 0:1000
df.cor.pvals <- data.frame(sample(x/1000, 4), sample(x/1000, 4), sample(x/1000, 4), sample(x/1000,4))
colnames(df.cor.pvals) <- c("var1", "var2", "var3", "var4")

# Find the significant correlations
df.cor.extreme <- ((df.cor < -0.01 | df.cor > 0.01) & df.cor.pvals < 0.5)

# Ready data to for plotting
df$rownames <- rownames(df)
df.melt <- melt(df, id="rownames")

# I want to plot the combinations of variables that have a TRUE value
# in the df.cor.extreme matrix 

Ниже hardcoded пример, если у var1 и var2 была ценность ИСТИННЫХ. Я предполагаю, что это - то, где мне нужна своего рода петля, чтобы произвести многократные сюжеты, где вара и varB коррелируются.

ggplot(df.melt[(df.melt$variable=="var1" | df.melt$variable=="var2"),], aes(x=rownames, y=value, group=variable, colour=variable)) +
  geom_line()

Example plot

12
nl ja de
@themartinmcfly я обновляю свой ответ после вашего разъяснения. Надеюсь, что это отвечает на ваш вопрос.
добавлено автор agstudy, источник
@themartinmcfly я обновляю свой ответ после вашего разъяснения. Надеюсь, что это отвечает на ваш вопрос.
добавлено автор agstudy, источник
@themartinmcfly я обновляю свой ответ после вашего разъяснения. Надеюсь, что это отвечает на ваш вопрос.
добавлено автор agstudy, источник
@themartinmcfly я все еще перепутал о вашем заключительном сюжете. Вы хотите подготовить исходные значения, когда определенное условие удовлетворено. если конусовидный (v1, v2) в порядке, сюжет (что?) сюжет (v1)? сюжет (v1 против v2)??
добавлено автор agstudy, источник
@themartinmcfly я все еще перепутал о вашем заключительном сюжете. Вы хотите подготовить исходные значения, когда определенное условие удовлетворено. если конусовидный (v1, v2) в порядке, сюжет (что?) сюжет (v1)? сюжет (v1 против v2)??
добавлено автор agstudy, источник
@themartinmcfly я все еще перепутал о вашем заключительном сюжете. Вы хотите подготовить исходные значения, когда определенное условие удовлетворено. если конусовидный (v1, v2) в порядке, сюжет (что?) сюжет (v1)? сюжет (v1 против v2)??
добавлено автор agstudy, источник
Я don' t понимают, почему у вашего тела данных p-ценностей, df.cor.pvals , есть 50 рядов - shouldn' t это быть той же самой формой как df.cor ?
добавлено автор Drew Steen, источник
Я don' t понимают, почему у вашего тела данных p-ценностей, df.cor.pvals , есть 50 рядов - shouldn' t это быть той же самой формой как df.cor ?
добавлено автор Drew Steen, источник
Можно получить матрицу корреляций you' поиск ре использования df.cor.extreme <-df.cor <-0.01 | df.cor> 0.01
добавлено автор Drew Steen, источник
Можно получить матрицу корреляций you' поиск ре использования df.cor.extreme <-df.cor <-0.01 | df.cor> 0.01
добавлено автор Drew Steen, источник
Можно получить матрицу корреляций you' поиск ре использования df.cor.extreme <-df.cor <-0.01 | df.cor> 0.01
добавлено автор Drew Steen, источник
@agstudy я добавил изображение сюжета только для визуализации.
добавлено автор themartinmcfly, источник
@agstudy я добавил изображение сюжета только для визуализации.
добавлено автор themartinmcfly, источник
@agstudy я добавил изображение сюжета только для визуализации.
добавлено автор themartinmcfly, источник
@agstudy Мой заключительный заговор - просто пример, если var1 и var2, оказалось, коррелировали. Я хочу подготовить каждую корреляцию, которая является значительной. Многократными сюжетами я имею в виду отдельный сюжет, который сравнивает две переменные корреляции. Матрица df.cor.extreme (или df.core.sig в вашем примере) содержит данные, говорящие, какие корреляции значительные, но я застреваю о том, как передать эти данные в код, который произведет сюжеты для всех корреляций (набор данных, я смотрю, по желанию имеют 150 + сюжеты).
добавлено автор themartinmcfly, источник
@agstudy Мой заключительный заговор - просто пример, если var1 и var2, оказалось, коррелировали. Я хочу подготовить каждую корреляцию, которая является значительной. Многократными сюжетами я имею в виду отдельный сюжет, который сравнивает две переменные корреляции. Матрица df.cor.extreme (или df.core.sig в вашем примере) содержит данные, говорящие, какие корреляции значительные, но я застреваю о том, как передать эти данные в код, который произведет сюжеты для всех корреляций (набор данных, я смотрю, по желанию имеют 150 + сюжеты).
добавлено автор themartinmcfly, источник
@agstudy Мой заключительный заговор - просто пример, если var1 и var2, оказалось, коррелировали. Я хочу подготовить каждую корреляцию, которая является значительной. Многократными сюжетами я имею в виду отдельный сюжет, который сравнивает две переменные корреляции. Матрица df.cor.extreme (или df.core.sig в вашем примере) содержит данные, говорящие, какие корреляции значительные, но я застреваю о том, как передать эти данные в код, который произведет сюжеты для всех корреляций (набор данных, я смотрю, по желанию имеют 150 + сюжеты).
добавлено автор themartinmcfly, источник
Зафиксированный мои фиктивные данные и включенный ваше предложение, используя единственные логические операторы. Также вставили первые шаги изображения в виде графика, просто can' t автоматизируют графы для тех Истинных значений в df.cor.extreme матрице.
добавлено автор themartinmcfly, источник
Зафиксированный мои фиктивные данные и включенный ваше предложение, используя единственные логические операторы. Также вставили первые шаги изображения в виде графика, просто can' t автоматизируют графы для тех Истинных значений в df.cor.extreme матрице.
добавлено автор themartinmcfly, источник
Зафиксированный мои фиктивные данные и включенный ваше предложение, используя единственные логические операторы. Также вставили первые шаги изображения в виде графика, просто can' t автоматизируют графы для тех Истинных значений в df.cor.extreme матрице.
добавлено автор themartinmcfly, источник

4 ответы

Как сказано в комментарии @DrewSteen, p-avlue должен быть той же самой формой боже мой.

Здесь я поставляю функцию, которые вычисляют матрицу p-стоимости (она должна существовать строить - в функции в пакете статистики),

pvalue.matrix <- function(x,...){
  ncx <- ncol(x)
  r <- matrix(0, nrow = ncx, ncol = ncx)
  for (i in seq_len(ncx)) {
    for (j in seq_len(i)) {
      x2 <- x[, i]
      y2 <- x[, j]
      r[i, j] <-  cor.test(x2,y2,...)$p.value
    }
  }
  r <- r + t(r) - diag(diag(r))
  rownames(r) <- colnames(x)
  colnames(r) <- colnames(x)
  r
}

Then you use the vectorize version of | and & like this

df.cor.sig <- (df.cor > 0.01 | df.cor < -0.01) & pvalue.matrix(df) < 0.5

сюжет классический с geom_tile

library(reshape2) ## melt
library(plyr)     ## round_any
 library(ggplot2) 
dat <- expand.grid(var1=1:4, var2=1:4)
dat$value <- melt(df.cor.sig)$value
dat$labels <- paste(round_any(df.cor,0.01) ,'(', round_any(pvalue.matrix(df),0.01),')',sep='')
ggplot(dat, aes(x=var1,y=var2,label=labels))+ 
  geom_tile(aes(fill = value),colour='white')+
 geom_text()

enter image description here

Отредактируйте после разъяснения OP

plots <- apply(dat,1,function(x){
    plot.grob <- nullGrob()
    if(length(grep(pattern='TRUE',x[3])) >0 ){
      gg <- paste('var',c(x[1],x[2]),sep='')
      p <- ggplot(subset(df.melt,variable %in% gg ), 
            aes(x=rownames, y=value, group=variable, colour=variable)) +
            geom_line()
      plot.grob <- ggplotGrob(p)
    }
    plot.grob

})


library(gridExtra)
do.call(grid.arrange,  plots)

enter image description here

8
добавлено
Хороший ответ. Я не был знаком с ' round_any' функция. Так, я только добавил бы для других в одной лодке, что вы, кажется, используете ggplot2, reshape2 и plyr пакеты, чтобы создать сюжет.
добавлено автор Mark Miller, источник
@MarkMiller Спасибо! я использую эти 3 пакета! Я забываю добавлять его, потому что я использую его wasn' t вопрос о происхождении. Я добавляю текст только, чтобы проверить мой ответ. Я обновляю свой ответ.
добавлено автор agstudy, источник
@themartinmcfly вы предпочитаете получать данные не сюжет? можно ли приложить ответ с тем, что вы ожидаете как data.frame?
добавлено автор agstudy, источник
@themartinmcfly я обновляю свой код, который можно дать любому методу "pearson", "kendall", "копьеносцу", к функции p.value.
добавлено автор agstudy, источник
@RomanLuštrik Спасибо!, Но интересно, может ли кто-то сделать это с facet_gid выбором...
добавлено автор agstudy, источник
заметка на полях: вы don' t потребность ggplotGrob , если вы держите его как ggplot, вы обладаете дополнительным преимуществом ggsave совместимость.
добавлено автор baptiste, источник
@themartinmcfly, что вы говорите о, agstudy, должен был сделать это вручную.:) +1 для gridExtra и работы, которую инвестируют в это.
добавлено автор Roman Luštrik, источник
Престижность @agstudy сэр!
добавлено автор themartinmcfly, источник
@agstudy я добавил ответ как дополнение к вашему, поэтому если вы используете этот код, который вы создали сами, не стесняются добавлять мой.
добавлено автор themartinmcfly, источник
@RomanLuštrik я хотел использовать стол с критическими значениями и подрезким звуком ваша стоимость r в там. Или использование приближения. Agstudy' s решение намного лучше.
добавлено автор themartinmcfly, источник
@baptiste, спасибо я использую ggsave с этой функцией в данный момент. Работы хорошо. Это также работает хорошо, возвращая каждый сюжет к коллекции сюжетов так, чтобы можно было вызвать любого сюжетами [x].
добавлено автор themartinmcfly, источник
@agstudy, я ищу многократные сюжеты, один для каждой значительной корреляции между переменными. Я предполагал, что структура данных с теми данными могла быть следующим шагом
добавлено автор themartinmcfly, источник
Это так близко к тому, что я ищу, я собираюсь экспериментировать в expand.grid больше. Я думаю, мог ли бы я получить структуру данных как variable1, variable2, значительный; var1, var2, ВЕРНЫЙ; var1, var3, ЛОЖНЫЙ у меня был бы список, которых корреляций к графу и просто должен образовать петли или подобный
добавлено автор themartinmcfly, источник
@agstudy я изменил форматирование вопроса так, чтобы у этого были мультисюжеты, написанные более ясно. Я также хочу поблагодарить Вас за демонстрацию pvalue код, я изменил свое собственное, поскольку это не использовало cor.test и только делало Pearson' s.
добавлено автор themartinmcfly, источник
Очень хороший @agstudy! Намного лучше, чем наличие вычислений, сделанных вручную:)
добавлено автор themartinmcfly, источник

Как сказано в комментарии @DrewSteen, p-avlue должен быть той же самой формой боже мой.

Здесь я поставляю функцию, которые вычисляют матрицу p-стоимости (она должна существовать строить - в функции в пакете статистики),

pvalue.matrix <- function(x,...){
  ncx <- ncol(x)
  r <- matrix(0, nrow = ncx, ncol = ncx)
  for (i in seq_len(ncx)) {
    for (j in seq_len(i)) {
      x2 <- x[, i]
      y2 <- x[, j]
      r[i, j] <-  cor.test(x2,y2,...)$p.value
    }
  }
  r <- r + t(r) - diag(diag(r))
  rownames(r) <- colnames(x)
  colnames(r) <- colnames(x)
  r
}

Then you use the vectorize version of | and & like this

df.cor.sig <- (df.cor > 0.01 | df.cor < -0.01) & pvalue.matrix(df) < 0.5

сюжет классический с geom_tile

library(reshape2) ## melt
library(plyr)     ## round_any
 library(ggplot2) 
dat <- expand.grid(var1=1:4, var2=1:4)
dat$value <- melt(df.cor.sig)$value
dat$labels <- paste(round_any(df.cor,0.01) ,'(', round_any(pvalue.matrix(df),0.01),')',sep='')
ggplot(dat, aes(x=var1,y=var2,label=labels))+ 
  geom_tile(aes(fill = value),colour='white')+
 geom_text()

enter image description here

Отредактируйте после разъяснения OP

plots <- apply(dat,1,function(x){
    plot.grob <- nullGrob()
    if(length(grep(pattern='TRUE',x[3])) >0 ){
      gg <- paste('var',c(x[1],x[2]),sep='')
      p <- ggplot(subset(df.melt,variable %in% gg ), 
            aes(x=rownames, y=value, group=variable, colour=variable)) +
            geom_line()
      plot.grob <- ggplotGrob(p)
    }
    plot.grob

})


library(gridExtra)
do.call(grid.arrange,  plots)

enter image description here

8
добавлено
Хороший ответ. Я не был знаком с ' round_any' функция. Так, я только добавил бы для других в одной лодке, что вы, кажется, используете ggplot2, reshape2 и plyr пакеты, чтобы создать сюжет.
добавлено автор Mark Miller, источник
@themartinmcfly вы предпочитаете получать данные не сюжет? можно ли приложить ответ с тем, что вы ожидаете как data.frame?
добавлено автор agstudy, источник
@MarkMiller Спасибо! я использую эти 3 пакета! Я забываю добавлять его, потому что я использую его wasn' t вопрос о происхождении. Я добавляю текст только, чтобы проверить мой ответ. Я обновляю свой ответ.
добавлено автор agstudy, источник
@themartinmcfly я обновляю свой код, который можно дать любому методу "pearson", "kendall", "копьеносцу", к функции p.value.
добавлено автор agstudy, источник
@RomanLuštrik Спасибо!, Но интересно, может ли кто-то сделать это с facet_gid выбором...
добавлено автор agstudy, источник
заметка на полях: вы don' t потребность ggplotGrob , если вы держите его как ggplot, вы обладаете дополнительным преимуществом ggsave совместимость.
добавлено автор baptiste, источник
@themartinmcfly, что вы говорите о, agstudy, должен был сделать это вручную.:) +1 для gridExtra и работы, которую инвестируют в это.
добавлено автор Roman Luštrik, источник
Престижность @agstudy сэр!
добавлено автор themartinmcfly, источник
Очень хороший @agstudy! Намного лучше, чем наличие вычислений, сделанных вручную:)
добавлено автор themartinmcfly, источник
@baptiste, спасибо я использую ggsave с этой функцией в данный момент. Работы хорошо. Это также работает хорошо, возвращая каждый сюжет к коллекции сюжетов так, чтобы можно было вызвать любого сюжетами [x].
добавлено автор themartinmcfly, источник
@RomanLuštrik я хотел использовать стол с критическими значениями и подрезким звуком ваша стоимость r в там. Или использование приближения. Agstudy' s решение намного лучше.
добавлено автор themartinmcfly, источник
@agstudy я добавил ответ как дополнение к вашему, поэтому если вы используете этот код, который вы создали сами, не стесняются добавлять мой.
добавлено автор themartinmcfly, источник
Это так близко к тому, что я ищу, я собираюсь экспериментировать в expand.grid больше. Я думаю, мог ли бы я получить структуру данных как variable1, variable2, значительный; var1, var2, ВЕРНЫЙ; var1, var3, ЛОЖНЫЙ у меня был бы список, которых корреляций к графу и просто должен образовать петли или подобный
добавлено автор themartinmcfly, источник
@agstudy, я ищу многократные сюжеты, один для каждой значительной корреляции между переменными. Я предполагал, что структура данных с теми данными могла быть следующим шагом
добавлено автор themartinmcfly, источник
@agstudy я изменил форматирование вопроса так, чтобы у этого были мультисюжеты, написанные более ясно. Я также хочу поблагодарить Вас за демонстрацию pvalue код, я изменил свое собственное, поскольку это не использовало cor.test и только делало Pearson' s.
добавлено автор themartinmcfly, источник

Как сказано в комментарии @DrewSteen, p-avlue должен быть той же самой формой боже мой.

Здесь я поставляю функцию, которые вычисляют матрицу p-стоимости (она должна существовать строить - в функции в пакете статистики),

pvalue.matrix <- function(x,...){
  ncx <- ncol(x)
  r <- matrix(0, nrow = ncx, ncol = ncx)
  for (i in seq_len(ncx)) {
    for (j in seq_len(i)) {
      x2 <- x[, i]
      y2 <- x[, j]
      r[i, j] <-  cor.test(x2,y2,...)$p.value
    }
  }
  r <- r + t(r) - diag(diag(r))
  rownames(r) <- colnames(x)
  colnames(r) <- colnames(x)
  r
}

Then you use the vectorize version of | and & like this

df.cor.sig <- (df.cor > 0.01 | df.cor < -0.01) & pvalue.matrix(df) < 0.5

сюжет классический с geom_tile

library(reshape2) ## melt
library(plyr)     ## round_any
 library(ggplot2) 
dat <- expand.grid(var1=1:4, var2=1:4)
dat$value <- melt(df.cor.sig)$value
dat$labels <- paste(round_any(df.cor,0.01) ,'(', round_any(pvalue.matrix(df),0.01),')',sep='')
ggplot(dat, aes(x=var1,y=var2,label=labels))+ 
  geom_tile(aes(fill = value),colour='white')+
 geom_text()

enter image description here

Отредактируйте после разъяснения OP

plots <- apply(dat,1,function(x){
    plot.grob <- nullGrob()
    if(length(grep(pattern='TRUE',x[3])) >0 ){
      gg <- paste('var',c(x[1],x[2]),sep='')
      p <- ggplot(subset(df.melt,variable %in% gg ), 
            aes(x=rownames, y=value, group=variable, colour=variable)) +
            geom_line()
      plot.grob <- ggplotGrob(p)
    }
    plot.grob

})


library(gridExtra)
do.call(grid.arrange,  plots)

enter image description here

8
добавлено
Хороший ответ. Я не был знаком с ' round_any' функция. Так, я только добавил бы для других в одной лодке, что вы, кажется, используете ggplot2, reshape2 и plyr пакеты, чтобы создать сюжет.
добавлено автор Mark Miller, источник
@themartinmcfly вы предпочитаете получать данные не сюжет? можно ли приложить ответ с тем, что вы ожидаете как data.frame?
добавлено автор agstudy, источник
@MarkMiller Спасибо! я использую эти 3 пакета! Я забываю добавлять его, потому что я использую его wasn' t вопрос о происхождении. Я добавляю текст только, чтобы проверить мой ответ. Я обновляю свой ответ.
добавлено автор agstudy, источник
@themartinmcfly я обновляю свой код, который можно дать любому методу "pearson", "kendall", "копьеносцу", к функции p.value.
добавлено автор agstudy, источник
@RomanLuštrik Спасибо!, Но интересно, может ли кто-то сделать это с facet_gid выбором...
добавлено автор agstudy, источник
заметка на полях: вы don' t потребность ggplotGrob , если вы держите его как ggplot, вы обладаете дополнительным преимуществом ggsave совместимость.
добавлено автор baptiste, источник
@themartinmcfly, что вы говорите о, agstudy, должен был сделать это вручную.:) +1 для gridExtra и работы, которую инвестируют в это.
добавлено автор Roman Luštrik, источник
@baptiste, спасибо я использую ggsave с этой функцией в данный момент. Работы хорошо. Это также работает хорошо, возвращая каждый сюжет к коллекции сюжетов так, чтобы можно было вызвать любого сюжетами [x].
добавлено автор themartinmcfly, источник
Престижность @agstudy сэр!
добавлено автор themartinmcfly, источник
@agstudy я добавил ответ как дополнение к вашему, поэтому если вы используете этот код, который вы создали сами, не стесняются добавлять мой.
добавлено автор themartinmcfly, источник
@RomanLuštrik я хотел использовать стол с критическими значениями и подрезким звуком ваша стоимость r в там. Или использование приближения. Agstudy' s решение намного лучше.
добавлено автор themartinmcfly, источник
Это так близко к тому, что я ищу, я собираюсь экспериментировать в expand.grid больше. Я думаю, мог ли бы я получить структуру данных как variable1, variable2, значительный; var1, var2, ВЕРНЫЙ; var1, var3, ЛОЖНЫЙ у меня был бы список, которых корреляций к графу и просто должен образовать петли или подобный
добавлено автор themartinmcfly, источник
Очень хороший @agstudy! Намного лучше, чем наличие вычислений, сделанных вручную:)
добавлено автор themartinmcfly, источник
@agstudy, я ищу многократные сюжеты, один для каждой значительной корреляции между переменными. Я предполагал, что структура данных с теми данными могла быть следующим шагом
добавлено автор themartinmcfly, источник
@agstudy я изменил форматирование вопроса так, чтобы у этого были мультисюжеты, написанные более ясно. Я также хочу поблагодарить Вас за демонстрацию pvalue код, я изменил свое собственное, поскольку это не использовало cor.test и только делало Pearson' s.
добавлено автор themartinmcfly, источник

Просто требуемый, чтобы добавить дополнение к ответу @agstudy, если вы делаете это сами.

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

dat <- expand.grid(var1=1:4, var2=1:4)

Также помните, что hardcoded 4's в линии выше являются длиной вашей (квадратной) сетки. Так или иначе можно проигнорировать поколение любых двойных графов, делая некоторый код как так:

# Find redunant pairs
dat <- data.frame(t(apply(dat, 1, function(x){
  if(x[1]-x[2] <= 0) {    # If > zero than pair has come before.
    -x                    # If = zero than pair is same 
  } else x
})))

# Remove redundant pairs
dat <- dat[dat$var1>0,]

Наслаждайтесь!

1
добавлено
+1 gladthat это помогает!
добавлено автор agstudy, источник