Это объясняется полезной подсказкой, предоставленной в комментарии @ttnphns.
Смешение почти коррелированных переменных увеличивает вклад их общего базового фактора в PCA. Мы можем видеть это геометрически. Рассмотрим эти данные в плоскости XY, представленной в виде облака точек:
Существует небольшая корреляция, приблизительно одинаковая ковариация, и данные центрированы: PCA (независимо от того, как проводится) сообщит о двух приблизительно равных компонентах.
Давайте теперь добавим третью переменную равную плюс небольшое количество случайных ошибок. Корреляционная матрица показывает это с небольшими недиагональными коэффициентами, за исключением между вторыми и третьими строками и столбцами ( и ):Y ( X , Y , Z ) Y ZZY( X, Y, Z)YZ
⎛⎝⎜1.−0.0344018−0.046076−0.03440181.0.941829−0.0460760.9418291.⎞⎠⎟
Геометрически мы сместили все исходные точки почти вертикально, подняв предыдущее изображение прямо из плоскости страницы. Это псевдо-трехмерное облако точек пытается проиллюстрировать подъем с помощью вида сбоку в перспективе (на основе другого набора данных, хотя и сгенерированного так же, как и раньше):
Точки изначально лежат в синей плоскости и поднимаются до красных точек. Исходная ось указывает на право. В результате наклона также растягивает точки вдоль направлений YZ, тем самым удвоив свой вклад в дисперсию. Следовательно, СПС этих новых данных будет по-прежнему идентифицировать два основных главных компонента, но теперь один из них будет иметь двойную дисперсию другого.Y
Это геометрическое ожидание подтверждается некоторыми моделями в R
. Для этого я повторил процедуру «подъема», создав почти коллинеарные копии второй переменной во второй, третий, четвертый и пятый раз, назвав их от до . Вот матрица рассеяния, показывающая, как эти последние четыре переменные хорошо коррелируют:X 5X2X5
PCA выполняется с использованием корреляций (хотя для этих данных это не имеет значения), с использованием первых двух переменных, затем трех, ... и, наконец, пяти. Я показываю результаты, используя графики вклада основных компонентов в общую дисперсию.
Первоначально, с двумя почти некоррелированными переменными, вклады почти равны (верхний левый угол). После добавления одной переменной, соотнесенной со второй - точно так же, как на геометрической иллюстрации, - все еще остается только два основных компонента, один теперь в два раза больше другого. (Третий компонент отражает отсутствие идеальной корреляции; он измеряет «толщину» облака на трехмерной диаграмме рассеяния.) После добавления другой коррелированной переменной ( ) первый компонент теперь составляет около трех четвертей от общего числа. ; после добавления пятой части первый компонент составляет почти четыре пятых от общего числа. Во всех четырех случаях компоненты после второго, вероятно, будут считаться несущественными для большинства диагностических процедур PCA; в последнем случае этоX4один главный компонент стоит рассмотреть.
Теперь мы можем видеть, что может быть полезно отбросить переменные, которые, как считается, измеряют один и тот же базовый (но «скрытый») аспект набора переменных , потому что включение почти избыточных переменных может привести к тому, что СПС переоценит их вклад. В такой процедуре нет ничего математически правильного (или неправильного); это суждение, основанное на аналитических целях и знаниях данных. Но должно быть совершенно ясно, что откладывание переменных, о которых известно, что они сильно коррелируют с другими, может оказать существенное влияние на результаты PCA.
Вот R
код
n.cases <- 240 # Number of points.
n.vars <- 4 # Number of mutually correlated variables.
set.seed(26) # Make these results reproducible.
eps <- rnorm(n.vars, 0, 1/4) # Make "1/4" smaller to *increase* the correlations.
x <- matrix(rnorm(n.cases * (n.vars+2)), nrow=n.cases)
beta <- rbind(c(1,rep(0, n.vars)), c(0,rep(1, n.vars)), cbind(rep(0,n.vars), diag(eps)))
y <- x%*%beta # The variables.
cor(y) # Verify their correlations are as intended.
plot(data.frame(y)) # Show the scatterplot matrix.
# Perform PCA on the first 2, 3, 4, ..., n.vars+1 variables.
p <- lapply(2:dim(beta)[2], function(k) prcomp(y[, 1:k], scale=TRUE))
# Print summaries and display plots.
tmp <- lapply(p, summary)
par(mfrow=c(2,2))
tmp <- lapply(p, plot)