偏相関係数に関する色々――残差同士の単純相関、時間あたりのPTSとASの単純相関との比較
はじめに
こんにちは、らんそうるいです。この記事では、Rを用いて、出場時間をパーシャルアウトした得点とアシストの偏相関係数と、出場時間で得点とアシストをそれぞれ単回帰した残差同士の単純相関係数が一致することを紹介します。そして時間あたりの得点・アシストの相関係数と偏相関係数の違いについても考察します。
この記事を書くモチベーションですが、ずばりRMarkdownの練習です。なので、偏相関係数を使って出場時間の影響を取り除いたスタッツ同士の関係を調べるという記事以上の情報はありません。
どうして偏相関係数と残差の単純相関係数が一致するのか?
以下の説明は南風原(2002)『心理統計学の基礎』を参考にしています。
回帰直線の式は$\hat{y}=a+bx$で、$\hat{y}$は予測値、$b$は回帰係数、$a$は切片と呼ばれます。$b$と$a$は最小二乗法で求めます。
残差は$$e=y-\hat{y}$$で定義されます。理論的に重要なこと(らしい)こととして、独立変数$x$と残差$e$の相関$r_{xe}$については、$$r_{xe}=0$$が成り立ちます。
残差の単純相関では、独立変数$x$と全く相関しない成分同士$e$の相関をとっていることになるので偏相関係数と一致する(のだと思います)。
実際にRを実行して確かめてみましょう。
#必要なライブラリとデータのインポート
library(tidyverse)
stats=read_csv("data/stats_202021.csv")
## ## ─ Column specification ──────────────────────────── ## cols( ## Player = col_character(), ## MIN = col_double(), ## PTS = col_double(), ## AS = col_double() ## )
#出場時間で得点を単回帰
model_pts_min=stats %>% lm(PTS~MIN,data=.)
#残差をresに格納
res=residuals(model_pts_min)
#resをstatsに追加
stats=stats %>% mutate(res_pts_min=res)
#残差と出場時間の相関係数を計算
cor(stats$res_pts_min,stats$MIN)
## [1] 2.875777e-16
#残差と出場時間の散布図を描く
stats %>% ggplot(.,aes(x=res_pts_min,y=MIN))+
geom_point()+
ylab("出場時間")+
xlab("出場時間で得点を単回帰した時の残差")+
ggtitle("出場時間と「出場時間で得点を単回帰した時の残差」の関係")
残差の単純相関係数と偏相関係数が一致することを確かめる
以下のRの実行結果を見ると、得点・アシストを出場時間で単回帰した時の残差の単純相関係数と、出場時間をパーシャルアウトした偏相関係数が一致していることが分かります。
#残差同士の単純相関を求める
#出場時間でアシストを単回帰
model_as_min=stats %>% lm(AS~MIN,data=.)
#残差をresに格納
res=residuals(model_as_min)
#resをスタッツに追加
stats=stats %>% mutate(res_as_min=res)
#残差同士の相関係数を算出
cor(stats$res_pts_min,stats$res_as_min)
## [1] -0.02470183
#偏相関係数を求める
library(ppcor)
pcor=stats %>% dplyr::select(MIN,PTS,AS) %>% pcor(.)
pcor$estimate
## MIN PTS AS ## MIN 1.0000000 0.80786519 0.43628975 ## PTS 0.8078652 1.00000000 -0.02470183 ## AS 0.4362898 -0.02470183 1.00000000
時間あたりの得点・アシストの相関係数と偏相関係数を比較する
出場時間の影響を取り除く方法として、時間あたりの得点・アシストの相関係数を調べるという方法があります。計算してみると、
#時間あたりの得点・アシストを計算して、statsに追加
stats=stats %>% mutate(pts_per_min=PTS/MIN,
as_per_min=AS/MIN)
#時間あたりの得点とアシストの相関係数を算出。欠損値はペアごと除外する
cor(stats$pts_per_min,stats$as_per_min,use="pairwise.complete.obs")
## [1] 0.1031961
#散布図の可視化
stats %>% ggplot(.,aes(x=pts_per_min,y=as_per_min))+
geom_point()+
xlab("時間あたりの得点")+
ylab("時間あたりのアシスト")+
ggtitle("時間あたりの得点とアシストの関係")
## Warning: Removed 2 rows containing missing values (geom_point).
まず、普通に得点とアシストの相関係数を算出した時と比べて、時間あたりの得点とアシストの相関係数は、絶対値が小さくなることが分かりました。
また、出場時間をパーシャルアウトした偏相関係数と比べて、時間あたりの得点・アシストの単純相関係数は絶対値が大きいことが分かりました。
ただ、第三の変数(出場時間)の影響がある時は、一般にこの関係が成り立つのかどうか分かりません。有識者様の助言をいただきたいところです。
終わりに
以上、RMarkdownの練習でした。練習のついでに、残差同士の単純相関係数が偏相関係数と一致することを確かめました。また、時間あたりの得点・アシストの単純相関係数と偏相関係数の比較も行いました。どのような状況で、時間あたりのスタッツどうしの相関を使うべきなのか、出場時間をパーシャルアウトした偏相関係数を使うべきなのか、という新しい謎が生まれましたが、それはそれで練習してみてよかったです。