【问题标题】:Problem with correlation matrix for large table in RR中大表的相关矩阵问题
【发布时间】:2019-04-13 06:30:30
【问题描述】:

我有一个如下所示的数据表。

data table1:

Cty  LR1998  LR1999....LR2018  SM1998  SM1999 ..... SM2018
1    0.1     2.5 ....  5.2     14.52   58.62  ..... 69.2  
7    0       50.2 ...  10.6    25.5    80.2   ..... 80.5 
.
.

我需要使用该时间段的 LR 和 SM 变量找到 1998 年至 2018 年期间每个“Cty”的相关性(皮尔逊)。

我还想创建一个漂亮的相关图。

有人可以指导我如何使用 R 执行此操作吗?我知道如何使用“cor”函数,但不知道如何将它用于大型数据表。

Example Output:

Cty  Cor   p-value
1    0.16  0.125
7    0.32  <0.05

非常感谢。

【问题讨论】:

  • 您想要Cty之间的相关性是否正确?即行之间的相关性?
  • 我想要 1998 年到 2018 年 LR 和 SM 变量之间每一行的相关性。我想我想要每个 Cty 的相关性。
  • 那个输出没有意义。第一行是国家 1 的相关性与谁
  • 输出是一个例子,但值不正确。输出表Cty 1关联应该与数据table1第一行数据从LR1998到LR2018,和SM1998到SM 2018关联。
  • 我知道这些值本身就是占位符。我的观点是,你不能只与一组相关。它可能需要包括Cty1Cty2,如下面我的回答。除非我完全误解了这个问题。

标签: r plot correlation


【解决方案1】:

对于相关图,你可以试试这个:转置数据框并使用'pairs'函数

对(t(table1[-1]))

【讨论】:

  • 您是否真的尝试用一个character 列和其余的numeric 转置data.frame?换位有效,但没有数字。我建议改为 t(table1[-1]) 删除第一(char)列,假设所有其他列都是数字,或者 t(table1[c(...)]) 其中 ... 是要保留的列号或名称的向量。
  • 是的,你是对的。我认为它只是一个标识符,不需要包含在相关计算中。我将编辑答案。谢谢。
【解决方案2】:

要获得国家之间的相关性,可能有助于重塑数据。虽然有一个基本的reshape 函数,但我一直觉得它很混乱,所以我经常使用tidyr(或data.table)进行整形操作。

首先,一些数据:

set.seed(2)
n <- 6
x <- cbind.data.frame(
  CTY = LETTERS[seq_len(n)],
  sapply(paste0("LR", 2000:2006), function(ign) runif(n)),
  stringsAsFactors=FALSE
)

重塑,使每个国家/地区在垂直方向上都是独一无二的(使用应该已经显而易见的 t 删除我不必要的复杂 tidyr 方法,感谢 pooja p):

y <- `colnames<-`(t(x[-1]), x[[1]])
cor(y)

(我现在删除的gather/spread 方法的最大区别在于,这仍然是matrix,如果需要,可以用as.data.frame 进行简单转换。这里应该没有必要。)

现在相关性相当直接。

cor(y)
#        A      B       C       D      E      F
# A  1.000 -0.435 -0.1443 -0.2010  0.736 -0.471
# B -0.435  1.000 -0.3825 -0.3493 -0.145  0.279
# C -0.144 -0.382  1.0000  0.0885 -0.426  0.447
# D -0.201 -0.349  0.0885  1.0000 -0.523 -0.128
# E  0.736 -0.145 -0.4261 -0.5232  1.000 -0.121
# F -0.471  0.279  0.4467 -0.1279 -0.121  1.000

有了这种格式的数据,适应cor.test的使用就多了一点工作。为此,我将更多地依赖tidyverse

# library(purrr)
crossing(a=x$CTY, b=x$CTY) %>%
  rowwise() %>%
  do(bind_cols(.,
               purrr::map2_dfc(.$a, .$b,
                               ~ as.data.frame(cor.test(y[,.x], y[,.y])[c("estimate", "p.value")]))
               )) %>%
  ungroup()
# # A tibble: 36 x 4
#    a     b     estimate p.value
#  * <chr> <chr>    <dbl>   <dbl>
#  1 A     A        1      0     
#  2 A     B       -0.435  0.329 
#  3 A     C       -0.144  0.757 
#  4 A     D       -0.201  0.666 
#  5 A     E        0.736  0.0591
#  6 A     F       -0.471  0.286 
#  7 B     A       -0.435  0.329 
#  8 B     B        1      0     
#  9 B     C       -0.382  0.397 
# 10 B     D       -0.349  0.443 
# # ... with 26 more rows

由于您的相关测试是关联测试(与 a,bb,a 相同),因此我们可以删除重复项并运行测试:

crossing(a=x$CTY, b=x$CTY) %>%
  transmute(a1 = pmin(a,b), b1 = pmax(a,b)) %>%
  distinct() %>%
  rowwise() %>%
  do(bind_cols(.,
               purrr::map2_dfc(.$a1, .$b1,
                               ~ as.data.frame(cor.test(y[,.x], y[,.y])[c("estimate", "p.value")]))
               )) %>%
  ungroup()
# # A tibble: 21 x 4 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2019-04-15
    • 2018-08-08
    • 1970-01-01
    相关资源
    最近更新 更多