Вопрос заключается в том, чтобы «определить лежащие в основе [линейные] отношения» среди переменных.
Быстрый и простой способ обнаружения взаимосвязей - это регрессировать любую другую переменную (использовать константу, даже) с этими переменными с помощью вашего любимого программного обеспечения: любая хорошая процедура регрессии обнаружит и диагностирует коллинеарность. (Вы даже не будете смотреть на результаты регрессии: мы просто полагаемся на полезный побочный эффект настройки и анализа матрицы регрессии.)
0
(Существует искусство и довольно много литературы, связанной с определением того, что такое «небольшая» загрузка. Для моделирования зависимой переменной я бы предложил включить ее в независимые переменные в PCA, чтобы идентифицировать компоненты - независимо от их размеры - в которых зависимая переменная играет важную роль. С этой точки зрения, «маленький» означает гораздо меньше, чем любой такой компонент.)
Давайте посмотрим на некоторые примеры. (Они используются 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))
}
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
На практике это часто не тот случай, когда одна переменная выделяется как очевидная комбинация других: все коэффициенты могут иметь сопоставимые размеры и различные знаки. Более того, когда существует более одного измерения отношений, не существует уникального способа их указать: требуется дополнительный анализ (например, сокращение строк), чтобы определить полезную основу для этих отношений. Вот как устроен мир: все, что вы можете сказать, это то, что эти конкретные комбинации, которые выводятся 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")
(Мне пришлось поиграться с пороговым значением в случаях с большой ошибкой, чтобы отобразить только один компонент: вот причина для того, чтобы передать это значение в качестве параметра process
.)
Пользователь ttnphns любезно направил наше внимание на тесно связанную тему. Один из его ответов (автор JM) предлагает подход, описанный здесь.