Я часто використовував для діагностування своїх багатоваріантних даних за допомогою PCA (дані omics із сотнями тисяч змінних і десятки чи сотні зразків). Дані часто походять від експериментів з декількома категоричними незалежними змінними, що визначають деякі групи, і мені часто доводиться пройти кілька компонентів, перш ніж я зможу знайти ті, які показують поділ між зацікавленими групами. Я придумав досить примітивний спосіб пошуку таких дискримінаційних компонентів, і мені цікаво
- наскільки це розумно / виправдано, та
- чи є кращі способи досягнення того ж.
Зауважте, що це розвідувальна робота. Перш ніж переконати когось іншого, я хочу переконати себе. Якщо я бачу, що є компоненти, які чітко розрізняють групи інтересів (наприклад, контроль над лікуванням), навіть якщо вони несуть відповідальність за незначну частину дисперсії відповідей, я вірю це більше, ніж результату, скажімо, контрольованої машини навчання.
Ось мій підхід. Я буду використовувати приклад "metabo" набору даних з pca3d в Р.
Ідея полягає в тому, щоб оцінити, скільки дисперсії кожного компонента можна пояснити незалежною змінною. Для цього я обчислюю просту модель для кожного компонента і використовую як метрику, щоб упорядкувати компоненти від «найцікавішого» до «найменш цікавого».
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?
.