R での探索的相関分析

小さな手を動かして大金を稼いで、親指を立ててください!

この記事[1]

相関分析は、2 つ以上の変数間の関係を調査するための最も基本的かつ基本的な方法の 1 つです。おそらく、ある時点で R を使用して相関分析を実行したことがあると思います。おそらく次のようになりました。

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

cor_results

出力は次のようになります。

代替

ここでは、事前選択の 2 つの変数に対して単純な関連付けを実行する基本的な R メソッドを示します。

しかし、何を探しているのか本当にわからない場合はどうすればよいでしょうか? 探索的なデータ分析を行っている段階では、どの変数に興味があるのか​​、またはどこに関連性を調べればよいのかがわからないかもしれません。この場合に役立つのは、関心のある変数を選択し、多数または数百の変数を含むデータセットを調べて、さらなる分析のための適切な開始点を見つける機能です。kassambara によって開発された rstatix パッケージのおかげで、これを迅速かつ比較的簡単に行う方法があります。

データを取得する

たとえば、世界銀行の世界開発指標 (WDI) データセット (世界の開発指標に関するオープン アクセス データ リポジトリ) のデータを使用します。上記リンクの Web サイトから 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 还具有用于各种其他统计测试和过程的大量其他函数,下次您需要进行一些探索性统计分析时,这些绝对值得研究——因此请向开发人员大声疾呼一。

Reference

[1]

Source: https://towardsdatascience.com/exploratory-correlational-analysis-in-r-c99449b2e3f8

この記事はmdniceマルチプラットフォームによって公開されています

おすすめ

転載: blog.csdn.net/swindler_ice/article/details/130611078