質問は、変数間の「基礎となる[線形]関係の識別」について尋ねます。
すばやく簡単な方法 関係検出するは、お気に入りのソフトウェアを使用して、これらの変数に対して他の変数を回帰することです(定数を使用することもできます)。優れた回帰手順は、共線性を検出および診断します。(回帰結果を見ることに煩わされることさえありません。単に、回帰行列を設定して分析することの有用な副作用に頼っているだけです。)
しかし、共線性が検出されたと仮定すると、次は何ですか? 主成分分析(PCA)はまさに必要なものです。その最小成分はほぼ線形の関係に対応します。これらの関係は、元の変数の線形結合である「負荷」から直接読み取ることができます。小さな負荷(つまり、小さな固有値に関連付けられた負荷)は、ほぼ共線性に対応します。固有値は、完全な線形関係に対応します。最大値よりもはるかに小さいわずかに大きい固有値は、近似線形関係に対応します。0
(「小さな」負荷が何であるかを特定することに関連した技術と非常に多くの文献があります。サイズ-従属変数が重要な役割を果たします。この観点から、「小さい」とは、そのようなコンポーネントよりもはるかに小さいことを意味します。
いくつかの例を見てみましょう。 (これらR
の計算とプロットの使用。)PCAを実行し、小さなコンポーネントを探し、それらをプロットし、それらの間の線形関係を返す関数から始めます。
pca <- function(x, threshold, ...) {
fit <- princomp(x)
#
# Compute the relations among "small" components.
#
if(missing(threshold)) threshold <- max(fit$sdev) / ncol(x)
i <- which(fit$sdev < threshold)
relations <- fit$loadings[, i, drop=FALSE]
relations <- round(t(t(relations) / apply(relations, 2, max)), digits=2)
#
# Plot the loadings, highlighting those for the small components.
#
matplot(x, pch=1, cex=.8, col="Gray", xlab="Observation", ylab="Value", ...)
suppressWarnings(matplot(x %*% relations, pch=19, col="#e0404080", add=TRUE))
return(t(relations))
}
これをランダムデータに適用してみましょう。これらは4つの変数(質問のおよびE)に基づいています。他の線形結合としてAを計算する小さな関数を次に示します。次に、5つの変数すべてにiid Normal-Distributed値を追加します(多重共線性が近似のみで正確ではない場合の手順のパフォーマンスを確認するため)。B,C,D,EA
process <- function(z, beta, sd, ...) {
x <- z %*% beta; colnames(x) <- "A"
pca(cbind(x, z + rnorm(length(x), sd=sd)), ...)
}
B,…,EA=B+C+D+EA=B+(C+D)/2+Esweep
n.obs <- 80 # Number of cases
n.vars <- 4 # Number of independent variables
set.seed(17)
z <- matrix(rnorm(n.obs*(n.vars)), ncol=n.vars)
z.mean <- apply(z, 2, mean)
z <- sweep(z, 2, z.mean)
colnames(z) <- c("B","C","D","E") # Optional; modify to match `n.vars` in length
B,…,EA
左上のパネルに関連付けられた出力は
A B C D E
Comp.5 1 -1 -1 -1 -1
00≈A−B−C−D−E
上部中央パネルの出力は
A B C D E
Comp.5 1 -0.95 -1.03 -0.98 -1.02
(A,B,C,D,E)
A B C D E
Comp.5 1 -1.33 -0.77 -0.74 -1.07
それらはかなり変化しましたが、基本的な基礎となる関係依然として反映していますA′=B′+C′+D′+E′ます。
1,1/2,1/2,1。
実際には、1つの変数が他の変数の明らかな組み合わせとして選ばれることはよくありません。すべての係数は、同等のサイズであり、符号が異なる場合があります。さらに、リレーションのディメンションが複数ある場合、それらを指定する独自の方法はありません。それらのリレーションの有用な基盤を特定するには、さらなる分析(行の削減など)が必要です。これが世界の仕組みです。PCAが出力するこれらの特定の組み合わせは、データの変動がほとんどないことに対応できるというだけです。 これに対処するため、一部の人々は、最大の(「主」)コンポーネントを、それがどのような形式であっても、回帰または後続の分析の独立変数として直接使用します。これを行う場合、最初に変数セットから従属変数を削除し、PCAをやり直すことを忘れないでください!
この図を再現するコードは次のとおりです。
par(mfrow=c(2,3))
beta <- c(1,1,1,1) # Also can be a matrix with `n.obs` rows: try it!
process(z, beta, sd=0, main="A=B+C+D+E; No error")
process(z, beta, sd=1/10, main="A=B+C+D+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+C+D+E; Large error")
beta <- c(1,1/2,1/2,1)
process(z, beta, sd=0, main="A=B+(C+D)/2+E; No error")
process(z, beta, sd=1/10, main="A=B+(C+D)/2+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+(C+D)/2+E; Large error")
(1つのコンポーネントのみを表示するために、大きなエラーの場合はしきい値をいじる必要がありました。それが、この値をパラメーターとしてに提供する理由ですprocess
。)
ユーザーttnphnsは、密接に関連するスレッドに注意を向けてくれました。 その答えの1つ(JMによる)は、ここで説明するアプローチを示唆しています。