Frecuentemente solía diagnosticar mis datos multivariados usando PCA (datos ómnicos con cientos de miles de variables y docenas o cientos de muestras). Los datos a menudo provienen de experimentos con varias variables categóricas independientes que definen algunos grupos, y a menudo tengo que pasar por algunos componentes antes de poder encontrar los que muestran una separación entre los grupos de interés. Se me ocurrió una forma bastante primitiva de encontrar componentes tan discriminatorios, y me pregunto
- hasta qué punto esto es razonable / justificable, y
- si hay mejores formas de lograr lo mismo.
Tenga en cuenta que esto es exploratorio. Antes de convencer a alguien más, quiero convencerme a mí mismo. Si veo que hay componentes que distinguen claramente los grupos de interés (por ejemplo, control versus tratamiento), incluso si son responsables de una porción menor de la variación de las respuestas, confío en ello más que un resultado de, por ejemplo, una máquina supervisada aprendizaje.
Aquí está mi enfoque. Usaré el conjunto de datos de ejemplo "metabo" de pca3d en R.
La idea es evaluar cuánta varianza de cada componente puede explicarse por la variable independiente. Para esto, calculo un modelo simple para cada componente y uso como una métrica para ordenar los componentes de "más interesante" a "menos interesante".
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 )
Aquí está el resultado. El gráfico muestra el porcentaje de varianza de cada componente explicado por la variable independiente en metabo[,1]
.
Podemos ordenar los componentes por para averiguar con cuáles mostrar ; Los primeros tres componentes son 2, 1 y 7.order( lm.r2, decreasing= TRUE )
pca3d( pca, components= c( 1, 2, 7 ), group= metabo[,1] )
Aquí está la trama:
(Las categorías roja y verde son dos grupos de sujetos que no son pacientes, y es de esperar que no se puedan distinguir).
Para reformular mis preguntas,
- ¿Este enfoque tiene sentido para usted? Mi problema es que se parece demasiado al dragado de datos. Además, intuitivamente, creo que tal vez debería cambiar la tabla y preguntar qué parte de la varianza en la variable independiente se explica por cada variable. Finalmente, estoy (casi) seguro de que estoy reinventando mal la rueda, así que mi segunda pregunta es
- ¿Hay algo mejor?
Tenga en cuenta que no quiero cambiar a mínimos cuadrados parciales o algo similar en esta etapa; Solo quiero diagnosticar el PCA en el contexto de mi clasificación.
to find out what share of the overall variance in the data matrix is explained by a given classification
Si quiere saber esto, no necesita PCA. Simplemente calcule la proporción de la suma de cuadrados entre grupos a la suma total de cuadrados: (SStotal-SSwithin)/SStotal
donde SSwithin es la suma de cuadrados agrupados dentro del grupo.
Is there anything better?
.