繁体   English   中英

在 R 中计算多年内所有国家/地区对的相关性

[英]Calculate correlation for all country pairs over multiple years in R

我目前面临以下问题:根据我之前的问题我需要计算多个国家的国家(Value.x 和 Value.y)之间的相关性多年 实现这一目标的最佳方法是什么?

预期输出应该是这样的(对于所有国家/地区和所有年份)。 因此,所有相关结果都存储在表/数据框中。


correlation country_x     country_y       Time

0.787812    Germany     United States   2000

我的数据集的前 100 行如下所示:



structure(list(LOCATION.x = c("AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "AUS", "AUS", "AUS"), Country.x = c("Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Australia"), IPC = c("A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", "A01B", 
"A01B", "A01B", "A01B"), Time = c(2000L, 2000L, 2000L, 2000L, 
2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 
2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 
2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 
2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 
2000L, 2000L, 2000L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 2001L, 
2001L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L, 
2002L, 2002L, 2002L, 2002L, 2002L, 2002L), Value.x = c(3.3333, 
3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 
3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 
3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 
3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 
3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 3.3333, 
3.3333, 3.3333, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 
4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 
4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 
4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 
4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 
4.2143, 4.2143, 4.2143, 4.2143, 4.2143, 1.1944, 1.1944, 1.1944, 
1.1944, 1.1944, 1.1944, 1.1944, 1.1944, 1.1944, 1.1944, 1.1944, 
1.1944, 1.1944, 1.1944), LOCATION.y = c("AUS", "AUT", "BEL", 
"CAN", "CZE", "DNK", "FIN", "FRA", "DEU", "GRC", "HUN", "ISL", 
"IRL", "ITA", "JPN", "KOR", "LUX", "MEX", "NLD", "NZL", "NOR", 
"POL", "PRT", "SVK", "ESP", "SWE", "CHE", "TUR", "GBR", "USA", 
"BRA", "CHL", "CHN", "COL", "CRI", "EST", "IND", "IDN", "ISR", 
"LVA", "LTU", "SVN", "ZAF", "AUS", "AUT", "BEL", "CAN", "CZE", 
"DNK", "FIN", "FRA", "DEU", "GRC", "HUN", "ISL", "IRL", "ITA", 
"JPN", "KOR", "LUX", "MEX", "NLD", "NZL", "NOR", "POL", "PRT", 
"SVK", "ESP", "SWE", "CHE", "TUR", "GBR", "USA", "BRA", "CHL", 
"CHN", "COL", "CRI", "EST", "IND", "IDN", "ISR", "LVA", "LTU", 
"SVN", "ZAF", "AUS", "AUT", "BEL", "CAN", "CZE", "DNK", "FIN", 
"FRA", "DEU", "GRC", "HUN", "ISL", "IRL", "ITA"), Country.y = c("Australia", 
"Austria", "Belgium", "Canada", "Czech Republic", "Denmark", 
"Finland", "France", "Germany", "Greece", "Hungary", "Iceland", 
"Ireland", "Italy", "Japan", "Korea", "Luxembourg", "Mexico", 
"Netherlands", "New Zealand", "Norway", "Poland", "Portugal", 
"Slovak Republic", "Spain", "Sweden", "Switzerland", "Turkey", 
"United Kingdom", "United States", "Brazil", "Chile", "China", 
"Colombia", "Costa Rica", "Estonia", "India", "Indonesia", "Israel", 
"Latvia", "Lithuania", "Slovenia", "South Africa", "Australia", 
"Austria", "Belgium", "Canada", "Czech Republic", "Denmark", 
"Finland", "France", "Germany", "Greece", "Hungary", "Iceland", 
"Ireland", "Italy", "Japan", "Korea", "Luxembourg", "Mexico", 
"Netherlands", "New Zealand", "Norway", "Poland", "Portugal", 
"Slovak Republic", "Spain", "Sweden", "Switzerland", "Turkey", 
"United Kingdom", "United States", "Brazil", "Chile", "China", 
"Colombia", "Costa Rica", "Estonia", "India", "Indonesia", "Israel", 
"Latvia", "Lithuania", "Slovenia", "South Africa", "Australia", 
"Austria", "Belgium", "Canada", "Czech Republic", "Denmark", 
"Finland", "France", "Germany", "Greece", "Hungary", "Iceland", 
"Ireland", "Italy"), Value.y = c(3.3333, 0, 0, 0.6667, 0, 1.1429, 
0.7333, 7.0667, 3.29, 0, 0, 0, 0, 1, 0.2, 1, 0, 0, 0.4762, 0, 
3, 0, 0, 0, 0, 3, 0, 0, 2.5, 13.2, 0, 0, 0, 0, 0, 0, 0.5, 0, 
0, 0, 0, 0, 1, 4.2143, 0.3333, 0, 0, 0, 3, 1, 2.5, 5.0833, 0, 
0, 0, 0, 1.4167, 0.5667, 0, 0, 0.5, 1.6278, 0.5, 1, 0, 0, 0, 
0, 0, 0, 0, 2.45, 9.1742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0.1, 1.1944, 0.5, 0.5, 2.3409, 0.0909, 0, 0.6, 8, 6.0286, 0, 
0, 0, 0, 1.5)), row.names = c(NA, -100L), groups = structure(list(
    IPC = "A01B", .rows = structure(list(1:100), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

为了回应评论,我添加了这个示例数据集用于教学目的。 它应该与@r2evans 提供的代码一起工作。 (假设所列国家在 2000 年和 2001 年只有两个子维度 A01B 和 A01C。)


structure(list(LOCATION.x = c("AUS", "AUS", "USA", "USA", "AUS", 
"AUS", "USA", "USA"), Country.x = c("Australia", "Australia", 
"United States", "United States", "Australia", "Australia", "United States", 
"United States"), IPC = c("A01B", "A01C", "A01B", "A01C", "A01B", 
"A01C", "A01B", "A01C"), Time = c(2000, 2000, 2000, 2000, 2001, 
2001, 2001, 2001), Value.x = c(7, 42, 92, 1, 70, 87, 88, 3), 
    LOCATION.y = c("DEU", "DEU", "DEU", "DEU", "DEU", "DEU", 
    "DEU", "DEU"), Country.y = c("Germany", "Germany", "Germany", 
    "Germany", "Germany", "Germany", "Germany", "Germany"), Value.y = c(97, 
    85, 25, 14, 15, 97, 97, 52)), row.names = c(NA, -8L), class = c("tbl_df", 
"tbl", "data.frame"))


提前谢谢了!

我想你可以做一个简单的summarize

dat %>%
  group_by(Country.x, Country.y) %>%
  summarize(corr = cor(Value.x, Value.y)) %>%
  filter(complete.cases(.))
# Warning in cor(Value.x, Value.y) : the standard deviation is zero
##### repeated 21 times
# # A tibble: 21 x 3
# # Groups:   Country.x [1]
#    Country.x Country.y        corr
#    <chr>     <chr>           <dbl>
#  1 Australia Australia       1    
#  2 Australia Austria        -0.539
#  3 Australia Belgium        -0.959
#  4 Australia Canada         -1.00 
#  5 Australia Czech Republic -0.959
#  6 Australia Denmark         0.931
#  7 Australia Finland         0.911
#  8 Australia France         -0.825
#  9 Australia Germany        -0.550
# 10 Australia India          -1    
# # ... with 11 more rows

有更多数据并希望将Time添加到您的分组中,然后使用

dat %>%
  group_by(Time, Country.x, Country.y) %>%
  summarize(corr = cor(Value.x, Value.y))

由于样本小,这在这里不起作用,但应该适用于您的较大数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM