在使用 corrr 绘图之前指定相关强度

Posted

技术标签:

【中文标题】在使用 corrr 绘图之前指定相关强度【英文标题】:Specifying Correlation strength prior to plotting using corrr 【发布时间】:2017-03-26 16:01:42 【问题描述】:

我有一个相关性数据框,我试图只播种 10% 以上的相关性 然后我想使用corrr 包来绘制它

我获取我的数据集的相关性,然后过滤到绝对值 >.1 但它在网络图段上失败

UseMethod("network_plot") 中的错误: 没有适用于“network_plot”的方法应用于“c('tbl_df', 'tbl', 'data.frame')”类的对象

library(tidyverse)
library(corrr)

# Create the Dataframe
mydf <- data.frame(a=sample(rnorm(n = 100,sd = 15),replace=TRUE),
                   b=sample(rnorm(n = 100,sd = 15),replace=TRUE),
                   c=sample(rnorm(n = 100,sd = 15),replace=TRUE),
                   d=sample(rnorm(n = 100,sd = 15),replace=TRUE),
                   e=sample(rnorm(n = 100,sd = 15),replace=TRUE),
                   f=sample(rnorm(n = 100,sd = 15),replace=TRUE))


test <- mydf %>% 
  correlate(method = "spearman") %>% 
  gather("n", "corr", 2:7, na.rm = TRUE) %>% 
  filter(abs(corr) > 0.1) %>% 
  spread(rowname,corr) %>%
  network_plot(legend = TRUE)

我在 documentation 的包中看到,您可以指定您希望可视化的相关性,但是即使我要求不包含它们,它似乎仍然会打印标签,这就是为什么我去了聚集/传播路线

  network_plot(min_cor = .2, legend = TRUE)

感谢您的宝贵时间

【问题讨论】:

您在correlate 调用和network_plot 之间的某处丢失了cor_df 类。 test = mydf %&gt;% ... %&gt;% spread(rowname, corr) 也是如此,然后是 class(test) = c("cor_df", class(test)),然后是 network_plot(test, legend = TRUE) 你应该也可以强制调用network_plot.cor_df:test = mydf %&gt;% ... %&gt;% corrr:::network_plot.cor_df(legend = TRUE) 还可以考虑在corrr GitHub 页面上将其归档为issue,因为应该有一个network_plot.default 方法,但似乎没有。 另外,我认为您需要spread(n, corr) 而不是spread(rowname, corr) 才能使network_plot 正常工作。 嗨@epi,我改变了传播,但不幸的是它没有工作 【参考方案1】:

感谢您通过电子邮件提醒我注意此问题(我将在有更多时间时单独回复)。我现在就写一个快速的解决方案。

这是一个有趣的问题。据我所知,您希望完全排除与任何其他变量不相关的任何变量。

如您所述,指定 min_cor 将停止绘制路径,但不会阻止变量本身。

我可能会在 GitHub 页面上添加一个问题,并在未来尝试解决它。现在,这里有一个在 purrr 包的帮助下的变通方法。

library(corrr)
library(purrr)

mydf <- data.frame(a=sample(rnorm(n = 100,sd = 15),replace=TRUE),
                   b=sample(rnorm(n = 100,sd = 15),replace=TRUE),
                   c=sample(rnorm(n = 100,sd = 15),replace=TRUE),
                   d=sample(rnorm(n = 100,sd = 15),replace=TRUE),
                   e=sample(rnorm(n = 100,sd = 15),replace=TRUE),
                   f=sample(rnorm(n = 100,sd = 15),replace=TRUE))

# Create the correlation data frame
rdf <- mydf %>% correlate(method = "spearman")

# Identify which variables to keep
to_keep <- map_lgl(rdf, ~ !is.numeric(.) || any(abs(.) > .1))
to_keep <- names(to_keep)[!is.na(to_keep)]

# Create the network plot
rdf %>%
  focus_(.dots = to_keep, mirror = TRUE) %>% 
  network_plot(legend = TRUE, min_cor = .1)

如果这不起作用,您可能需要通过devtools::install_github("drsimonj/corrr") 安装最新开发版的 corrr

【讨论】:

嗨@Simon Jackson。感谢您的回复。当我运行此代码时,它会在图表上绘制行名 a-f,但它似乎并未绘制相关性本身 - 标签之间的线条表示关系 @JohnSmith 我认为这可能是两件事之一。 (1) 鉴于相关性接近于零 (.1),无论如何它们可能几乎看不到。 (2) 有时您需要缩放(即,如果使用 RStudio,请单击绘图面板上的缩放按钮)以显示路径。 嗨@Simon Jackson。很抱歉延迟回复您。这正是我想要完成的。你说的对。似乎相关性太低而无法在图表中看到。非常感谢您的宝贵时间

以上是关于在使用 corrr 绘图之前指定相关强度的主要内容,如果未能解决你的问题,请参考以下文章

使用 seaborn 绘图时,如何为色调参数指定多个变量?

实现图像等高线绘图的基本思路

matlab gui 怎样在指定的轴绘图

使用 dbplyr 和 corrr 的两个变量之间的分组相关性

OpenCV的基本绘图函数

如何在绘图中指定字体大小(用于 PDF 输出)?