首页 文章

R中面板数据中的相关矩阵

提问于
浏览
1

我有一个时间序列面板数据集,其结构如下:

df <- data.frame(
  year = c(2012L, 2013L, 2014L, 2012L, 2013L, 2014L),
  id = c(1L, 1L, 1L, 2L, 2L, 2L),
  c = c(11L, 13L, 13L, 16L, 15L, 15L)
)

#>   year id  c
#> 1 2012  1 11
#> 2 2013  1 13
#> 3 2014  1 13
#> 4 2012  2 16
#> 5 2013  2 15
#> 6 2014  2 15

我想在给定其ID号的C列中找到值之间的互相关 . 与此类似的东西:

#>     1  2
#> 1   1  0.8
#> 2   0.8  1

我一直在使用dplyr包来查找我的面板数据中两个变量之间的互相关,但出于某种原因,我不能在一个可靠的id分组中进行相互关联 .

2 回答

  • 1

    你是说像下面这样的东西?我使用reshape包根据你的id的值进行强制转换,然后使用baseR中的 cor() 函数 .

    > mydf <- data.frame(year=c("12","13","14","12","13","14"),id=c(1,1,1,2,2,2),c=c(11,13,13,16,15,156))
    > library(reshape2)
    > mydf
      year id   c
    1   12  1  11
    2   13  1  13
    3   14  1  13
    4   12  2  16
    5   13  2  15
    6   14  2 156
    > my_wide_data <- dcast(mydf, year~id,value.var="c")
    > cor(my_wide_data[,2:3])
              1         2
    1 1.0000000 0.4946525
    2 0.4946525 1.0000000
    

    所以@Henrik的评论更加简单和优雅,所以包括在这里 .

    > cor(unstack(mydf[ , -1], c ~ id))
              X1        X2
    X1 1.0000000 0.4946525
    X2 0.4946525 1.0000000
    
  • 1

    如果您已经在使用 tidyverse 工具,则应该尝试widyr .

    它的功能重新变宽,获得相关性,并再次给你一个整洁的数据框 .

    (注意我稍微改变了样本数据以匹配akaDrHouse's答案 .

    df <- data.frame(
      year = c(2012L, 2013L, 2014L, 2012L, 2013L, 2014L),
      id = c(1L, 1L, 1L, 2L, 2L, 2L),
      c = c(11L, 13L, 13L, 16L, 15L, 156L)
    )
    
    df
    #>   year id   c
    #> 1 2012  1  11
    #> 2 2013  1  13
    #> 3 2014  1  13
    #> 4 2012  2  16
    #> 5 2013  2  15
    #> 6 2014  2 156
    
    widyr::pairwise_cor(df, id, year, c)
    
    #> # A tibble: 2 x 3
    #>   item1 item2 correlation
    #>   <int> <int>       <dbl>
    #> 1     2     1   0.4946525
    #> 2     1     2   0.4946525
    
    widyr::pairwise_cor(df, id, year, c, upper = FALSE)
    
    #> # A tibble: 1 x 3
    #>   item1 item2 correlation
    #>   <int> <int>       <dbl>
    #> 1     1     2   0.4946525
    

相关问题