关于程序员:R-中的探索性相关分析

43次阅读

共计 3790 个字符,预计需要花费 10 分钟才能阅读完成。

动动发财的小手,点个赞吧!

本文

相干剖析是摸索两个或多个变量之间关系的最根本和最根底的办法之一。您可能曾经在某个时候应用 R 执行过相干剖析,它可能看起来像这样:

cor_results <- cor.test(my_data$x, my_data$y,
                        method = "pearson")

cor_results

输入看起来像:

这是为您预先选择的两个变量运行简略关联的根本 R 办法。

然而,如果您真的不晓得本人在寻找什么怎么办?如果您只是处于进行一些探索性数据分析的阶段,您可能不晓得您对哪些变量感兴趣,或者您可能想在哪里寻找关联。在这种状况下可能有用的是可能抉择一个感兴趣的变量,而后查看具备多个甚至数百个变量的数据集,以便为进一步剖析找出一个好的终点。感激 kassambara 开发的 rstatix 包,有一种疾速且绝对轻松的办法能够做到这一点。

获取数据

例如,我将应用来自世界银行的世界倒退指标 (WDI) 数据集的数据——一个对于寰球倒退指标的凋谢拜访数据存储库。咱们能够从下面链接的网站拜访 WDI,但也有一个 R 包

install.packages("WDI")
library(WDI)

能够应用 WDI() 函数从 WDI 导入特定的数据系列,然而因为咱们对涵盖大量变量之间可能关系的探索性剖析感兴趣,所以我将批量下载整个数据库……

bulk <- WDIbulk(timeout = 600)

假如咱们有趣味尝试找出哪些其余国家特色可能与贸易更多的国家相干,绝对于其经济规模,咱们也对 2020 年的数据感兴趣。

一旦咱们确定了正确的变量(这里我将应用贸易占 GDP 的百分比),咱们须要略微清理一下数据。咱们将创立一个咱们能够过滤的年度系列列表,而后利用另一个过滤步骤以确保咱们只应用具备大量察看值的变量用于剖析(任意,n> 100 在上面的示例中)。

# Create a filtered set with only annual variables
filtered <- bulk$Series %>% filter(Periodicity == "Annual")

# Create a list of variables to correlate against trade levels
bulk$Data %>% 
  filter(Indicator.Code %in% c(filtered$Series.Code)) %>% 
  filter(year == 2020) %>% 
  group_by(Indicator.Code) %>%
  filter(!is.na(value)) %>% 
  count() %>% 
  arrange(n) %>% 
  filter(n>100) -> vars_list

剖析

所以当初咱们有一个变量列表要运行——大概 790 个——看看哪些可能与咱们的贸易程度变量相干。这将永远须要手动运行,或者从 base R 循环运行 cor.test()。这是 rstatix 中的 cor_test() 函数闪耀的中央——它运行得十分快,相干剖析的输入被转储到一个小标题中格局(使执行额定的操作和剖析变得容易),并且函数是管道敌对的,这意味着咱们能够将过滤、变异和执行步骤组合到一个管道框架中,咱们还能够将变量输出分组以进行分组输入来自 rstatix(咱们稍后会看一些例子)。

因而,要运行剖析:

# Because WDI contains regional data as well, we'll create a list that only has country codes, and filter our input based on that list
countries <- bulk$Country %>% filter(!Region == "") %>% as_tibble()

bulk$Data %>% 
  filter(Indicator.Code %in% c(vars_list$Indicator.Code)) %>%
  filter(year == 2020) %>%
  filter(Country.Code %in% c(countries$Country.Code)) %>% 
  select(-Indicator.Name) %>% 
  pivot_wider(names_from = Indicator.Code,
              values_from = value) %>% 
  cor_test(NE.TRD.GNFS.ZS, 
           method = "pearson",
           use = "complete.obs") -> results

results

这会应用变量配对、相关系数 (r)、t 统计量、置信水平 (p) 以及低置信度和高置信度预计来填充参差的小标题。对于下面运行的示例,它看起来像:

因为输入是一个 tibble,所以咱们能够依据须要对其进行排序和合成。让咱们用变量名称和形容创立一个键,将其连贯到咱们的输入数据中,仅过滤在 p > 0.05 程度上显着的变量对,并查看哪些变量具备最高的 r 值:

indicator_explanation <- bulk$Series %>% select(Series.Code, Indicator.Name, Short.definition) %>% as_tibble()

results %>% 
  left_join(indicator_explanation, c("var2" = "Series.Code")) %>% 
  arrange(desc(cor)) %>%
  filter(p<0.05) %>% 
  View()

一些具备最高相关性的变量并不令人诧异——例如,总体贸易在服务贸易和商品贸易的国家之间呈高水平正相干。其余状况可能更出其不意——比方贸易程度与一个国家收到的官网倒退支援(支援资金)数额之间的中等高度正相干 (r = 0.43)(上图中最上面一行)。

分组剖析

那么,如果咱们想更多地钻研这种关系呢?例如——如果咱们看看 2020 年以外的其余年份,这种关系是否依然牢固?这是 cor_test() 的管道敌对个性再次派上用场的中央。

让咱们过滤咱们的初始数据以仅包含咱们感兴趣的两个指标,而后按年份对数据进行分组,而后再将其传输到 cor_test() 这一次:

bulk$Data %>% 
  filter(Indicator.Code %in% c("NE.TRD.GNFS.ZS", "DT.ODA.ODAT.GI.ZS")) %>% 
  filter(Country.Code %in% c(countries$Country.Code)) %>% 
  select(-Indicator.Name) %>% 
  filter(year<2021) %>% 
  pivot_wider(names_from = Indicator.Code,
              values_from = value) %>%
  group_by(year) %>%
  cor_test(NE.TRD.GNFS.ZS, DT.ODA.ODAT.GI.ZS,
           method = "pearson",
           use = "complete.obs") -> results_time

这将为咱们提供对于两个变量之间相关性的输入,每年都有察看后果(我将数据过滤到 2021 年之前的年份,因为 ODA 数据只运行到 2020 年)。而且因为相干数据以参差的形式存储,咱们能够轻松地运行额定的代码来可视化咱们的后果:

results_time %>% 
  mutate(`Significant?` = if_else(p<0.05, "Yes", "No")) %>% 
  ggplot(aes(x = year, y = cor)) +
  geom_hline(yintercept = 0, 
             linetype = "dashed") +
  geom_line() + 
  ylab("cor (r)") +
  geom_point(aes(color = `Significant?`)) +
  theme_minimal()

在这里咱们能够看到,从历史上看,这两个变量之间基本没有太大的关系(除了偶然呈现了弱负相关的几年),但在过来几年中,相关性趋于显着和正:

那么这是什么意思?对于贸易与支援之间关系的任何潜在问题——咱们必须做更多的钻研。相关性毕竟并不意味着因果关系,但这是一个很好的假如生成器——受援国是否越来越以贸易为导向?还是支援交付模式正在转向有利于贸易更多的国家?这些都是咱们摸索的新途径。这些类型的疾速相干剖析对于趋势剖析或信号发现之类的事件来说可能是一个十分有用的工具——并且采纳一种对 tidyverse 敌对的形式来做它真的能够防止潜在的麻烦。

就咱们疾速轻松地进行一些有用的探索性剖析的能力而言,咱们能够看到 rstatix 是一个有用的配套包。然而,rstatix 中的 cor_test() 有一些毛病

  1. 例如,与“相干”包中的许多其余办法相比,您仅限于 Pearson (r)、Spearman (ρ) 和 Kendall (τ) 相干办法。然而,这些对于长期用户来说是最常见的,对于根本剖析来说应该入不敷出。
  2. 置信区间仅在 Pearson r 的输入中报告。这意味着如果 Spearman 的 rho 或 Kendall 的 tau 须要置信区间,则须要额定的代码。
  3. 例如,不报告样本大小和自由度,如果用户的指标是依据不同的分组段开发多个输入报告,这可能会很烦人。

但这些通常不适用于长期用户。此外,除了 cor_test() 之外,rstatix 还具备用于各种其余统计测试和过程的大量其余函数,下次您须要进行一些探索性统计分析时,这些相对值得钻研——因而请向开发人员大声疾呼一。

本文由 mdnice 多平台公布

正文完
 0