Rによるデータ分析

Rによる隠れ変数の分析

隠れ変数の探索 を、Rで進める時のレシピです。

因果推論 として 相関関係による仮説の探索 をやろうと思い、 Rによる変数の類似度の分析 をしたものの、注目している変数と他の変数の間には、何も相関が見つからないことがあります。

このページの方法は、そのような時に、あきらめずにさらにデータを探索するための方法になります。

主成分分析独立成分分析 の2つの方法がありますが、同じような結果になることもありますし、 どちらかの方が、良いこともあります。

主成分分析を使う方法の方が、パラメタの設定がないですし、計算時間も短いです。 主成分分析では、隠れ変数が見つからない時に、独立成分分析を試すようにするのが良いようです。

注目している変数が量的変数の場合

下記のコードが注目している変数が「Y」ということにしています。 他の変数については、名前の付け方に決まりはありません。

主成分分析を使う方法

library(dummies) # ライブラリを読み込み
library(ggplot2)
# ライブラリを読み込み
library(tidyr)
# ライブラリを読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T)
# データを読み込み
Data1 <- Data
# 加工用のデータを作る
Y <- Data1$Y
# Yの列を別に作っておく
Data1$Y <- NULL
# Yの列を消す
Data2 <- dummy.data.frame(Data1)
# 質的変数はダミー変換
pc <- prcomp(Data2, scale=TRUE)
# 主成分分析をして主成分を抽出
Data4 <- cbind(Y, Data2, pc$x)
# 加工したデータとYの列を合わせる
Data_long <- tidyr::gather(Data4, key="X", value = Xs, -Y)
# 縦型に変換(Yの列以外を積み上げる)
ggplot(Data_long, aes(x=Xs,y=Y)) + geom_point() + facet_wrap(~X,scales="free")
# 散布図を大量に描く
隠れ変数の分析

この結果を見ると、まず、Yと元のデータの他の変数(X01、X02、X03)には何も相関が見られないことがわかります。 次に、Yと主成分の関係を見ると、YとPC3には相関があることがわかります。 隠れ変数のようです。

この後ですが、隠れ変数が元の変数のどれに影響しているのかを調べます。

pc2 <- sweep(pc$rotation, MARGIN=2, pc$sdev, FUN="*") # 因子負荷量を計算
pc2
# 結果の数値の出力
library(heatmaply)
# ライブラリを読み込み
heatmaply(pc2)
# クラスター分析をしてからヒートマップを作成
グラフの例 グラフの例

この結果を見ると、X03とPC3は、因子負荷量の絶対値が0に近いことから、隠れ変数のPC3は、X03には影響していないらしいことがわかりました。 PC3は、X01とX02に少し影響しているような因子のようです。

独立成分分析を使う方法

library(fastICA) # ライブラリを読み込み
library(dummies)
# ライブラリを読み込み
library(ggplot2)
# ライブラリを読み込み
library(tidyr)
# ライブラリを読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T)
# データを読み込み
Data1 <- Data
# 加工用のデータを作る
Y <- Data1$Y
# Yの列を別に作っておく
Data1$Y <- NULL
# Yの列を消す
Data2 <- dummy.data.frame(Data1)
# 質的変数はダミー変換
summary(prcomp(Data2, scale=TRUE))
# 主成分分析
隠れ変数の分析

Data3 <- fastICA(Data2, 3)$S# 独立成分分析。成分は3つ抽出の場合
Data4 <- cbind(Y, Data2, Data3)
# 加工したデータとYの列を合わせる
Data_long <- tidyr::gather(Data4, key="X", value = Xs, -Y)
# 縦型に変換(Yの列以外を積み上げる)
ggplot(Data_long, aes(x=Xs,y=Y)) + geom_point() + facet_wrap(~X,scales="free")
# 散布図を大量に描く
隠れ変数の分析

Yと独立成分の関係を見ると、Yと1には相関があるようなので、隠れ変数があるようです。

この後ですが、隠れ変数が元の変数のどれに影響しているのかを調べたいのですが、 主成分分析の時のようなやり方を筆者がわからないです。 わかったらここに追記するつもりです。

注目している変数が質的変数の場合

主成分分析を使う方法

library(dummies) # ライブラリを読み込み
library(ggplot2)
# ライブラリを読み込み
library(tidyr)
# ライブラリを読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T)
# データを読み込み
Data1 <- Data
# 加工用のデータを作る
Y <- Data1$Y
# Yの列を別に作っておく
Data1$Y <- NULL
# Yの列を消す
Data2 <- dummy.data.frame(Data1)
# 質的変数はダミー変換
pc <- prcomp(Data2, scale=TRUE)
# 主成分分析をして主成分を抽出
Data4 <- cbind(Y, Data2, pc$x)
# 加工したデータとYの列を合わせる
Data_long <- tidyr::gather(Data4, key="X", value = Xs, -Y)
# 縦型に変換(Yの列以外を積み上げる)
ggplot(Data_long, aes(x=Y,y=Xs)) + geom_boxplot() + facet_wrap(~X,scales="free")
# 箱ひげ図
隠れ変数の分析

次に、Yと主成分の関係を見ると、PC3ではYがかなり明確に分離されます。 隠れ変数のようです。

隠れ変数が元の変数のどれに影響しているのかの調べ方は、注目している変数が量的変数の場合で主成分分析を使った時と同じです。

独立成分分析を使う方法

library(fastICA) # ライブラリを読み込み
library(dummies)
# ライブラリを読み込み
library(ggplot2)
# ライブラリを読み込み
library(tidyr)
# ライブラリを読み込み
setwd("C:/Rtest")
# 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T)
# データを読み込み
Data1 <- Data
# 加工用のデータを作る
Y <- Data1$Y
# Yの列を別に作っておく
Data1$Y <- NULL
# Yの列を消す
Data2 <- dummy.data.frame(Data1)
# 質的変数はダミー変換
summary(prcomp(Data2, scale=TRUE))
# 主成分分析
隠れ変数の分析

Data3 <- fastICA(Data2, 3)$S# 独立成分分析。成分は3つ抽出の場合
Data4 <- cbind(Y, Data2, Data3)
# 加工したデータとYの列を合わせる
Data_long <- tidyr::gather(Data4, key="X", value = Xs, -Y)
# 縦型に変換(Yの列以外を積み上げる)
ggplot(Data_long, aes(x=Y,y=Xs)) + geom_boxplot() + facet_wrap(~X,scales="free")
# 箱ひげ図
隠れ変数の分析

Yと独立成分の関係を見ると、Yと1には相関があるようなので、隠れ変数があるようです。



Tweet