Я часто использовал для диагностики своих многомерных данных с использованием PCA (опускаются данные с сотнями тысяч переменных и десятками или сотнями выборок). Данные часто приходят из экспериментов с несколькими категориальными независимыми переменными, определяющими некоторые группы, и мне часто приходится проходить через несколько компонентов, прежде чем я смогу найти те, которые показывают разделение между интересующими группами. Я придумала довольно примитивный способ поиска таких различающих компонентов, и мне интересно,
- в какой степени это разумно / оправданно, и
- есть ли лучшие способы достижения того же.
Обратите внимание, что это ознакомительный. Прежде чем убедить кого-либо еще, я хочу убедить себя. Если я вижу, что есть компоненты, которые четко различают группы, представляющие интерес (например, контроль и лечение), даже если они несут ответственность за незначительную часть дисперсии ответов, я доверяю этому больше, чем результат, скажем, от контролируемой машины учусь.
Вот мой подход. Я буду использовать пример данных metabo из pca3d в R.
Идея состоит в том, чтобы оценить, насколько дисперсия каждого компонента может быть объяснена независимой переменной. Для этого я вычисляю простую модель для каждого компонента и использую в качестве метрики, чтобы упорядочить компоненты от «наиболее интересных» до «наименее интересных».
require( pca3d )
# data on metabolic profiles of TB patients and controls
data( metabo )
# first column is the independent variable
pca <- prcomp( metabo[,-1], scale.= T )
# create a model for each component
lm.m <- lm( pca$x ~ metabo[,1] )
lm.s <- summary( lm.m )
lm.r2 <- sapply( lm.s, function( x ) x$r.squared )
plot( lm.r2, type= "l" )
text( 1:length( lm.r2 ), lm.r2, 1:length( lm.r2 ), pos= 3 )
Вот результат. График показывает процент дисперсии каждого компонента, объясняемый независимой переменной в metabo[,1]
.
Мы можем отсортировать компоненты по чтобы узнать, какие из них отображать ; первые три компонента - 2, 1 и 7.order( lm.r2, decreasing= TRUE )
pca3d( pca, components= c( 1, 2, 7 ), group= metabo[,1] )
Вот сюжет:
(Красные и зеленые категории представляют собой две группы субъектов, которые не являются пациентами, и следует ожидать, что их невозможно различить.)
Чтобы переформулировать мои вопросы,
- Имеет ли этот подход смысл для вас? Моя проблема в том, что это слишком похоже на выемку данных. Кроме того, интуитивно я думаю, что, возможно, мне следует повернуть таблицу и спросить, какая часть дисперсии в независимой переменной объясняется каждой переменной? Наконец, я (почти) уверен, что плохо изобретаю колесо, поэтому мой второй вопрос
- есть что-нибудь получше?
Обратите внимание, что я не хочу переключаться на частичные наименьшие квадраты или что-то подобное на этом этапе; Я просто хочу диагностировать PCA в контексте моей классификации.
to find out what share of the overall variance in the data matrix is explained by a given classification
Если вы хотите знать это, вам не нужен PCA. Просто вычислите отношение суммы квадратов между группами к общей сумме квадратов: (SStotal-SSwithin)/SStotal
где SSwithin - это объединенная сумма квадратов внутри группы.
Is there anything better?
.