Con frecuencia solía diagnosticar mis datos multivariados utilizando PCA (datos ómicos con cientos de miles de variables y docenas o cientos de muestras). Los datos a menudo provienen de experimentos con varias variables independientes categóricas que definen algunos grupos, y a menudo tengo que pasar por unos cuantos componentes antes de encontrar los que muestran una separación entre los grupos de interés. Se me ha ocurrido una forma bastante primitiva de encontrar esos componentes discriminantes, y me pregunto
- hasta qué punto 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 frente a tratamiento), aunque sean responsables de una parte menor de la varianza de las respuestas, me fío más que de un resultado de, por ejemplo, aprendizaje automático supervisado.
Este es mi enfoque. Utilizaré el conjunto de datos de ejemplo "metabo" de pca3d en R.
La idea es evaluar cuánta varianza de cada uno de los componentes puede ser explicada por la variable independiente. Para ello, calculo un modelo simple para cada componente y utilizo $R^2$ como 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 $r^2$ para saber cuáles mostrar con order( lm.r2, decreasing= TRUE )
los tres primeros componentes son 2, 1 y 7.
pca3d( pca, components= c( 1, 2, 7 ), group= metabo[,1] )
Esta es 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,
- ¿Le parece que este enfoque tiene sentido? Mi problema es que se parece demasiado al dragado de datos. Además, intuitivamente creo que quizás debería darle la vuelta a la tortilla y preguntar qué parte de la varianza de la variable independiente es explicada por cada variable? Por último, estoy (casi) seguro de que estoy reinventando la rueda, pobremente, así que mi segunda pregunta es
- ¿Hay algo mejor?
Tenga en cuenta que no quiero pasar a mínimos cuadrados parciales ni nada parecido en esta fase; sólo quiero diagnosticar el PCA en el contexto de mi clasificación.
2 votos
Me gustaría hacer sólo dos comentarios sobre su interesante pregunta. 1) Describa en palabras su enfoque además de mostrar su código (recuerde que la gente aquí utiliza varios programas, no necesariamente R). 2) El diagrama de dispersión no es muy convincente sin picos en su suelo. Además, si usted tiene cualquier específico dudas sobre su planteamiento, por favor, háblenlas para que la pregunta esté más centrada.
0 votos
@ttnphns Gracias, he intentado ahora mejorar mi pregunta.
1 votos
editado: Para aclarar, ¿primero estás realizando el ACP y luego tratando de aislar los componentes principales que mejor se explican por alguna variable en particular? ¿Estás validando de forma cruzada con un diagrama de dispersión? Podría ser el caso de que alguna x que elija de su conjunto de datos pasa a explicar una gran cantidad de la varianza en un componente principal, pero no estoy seguro de que significa nada si la varianza es muy baja a lo largo de ese componente principal.
1 votos
@ssdecontrol Bueno, estoy haciendo una pobre aleatorización para ver si el calculado $R^2$ está muy por encima del ruido de fondo. En cuanto a si significa algo la cuestión es que, en realidad, suele hacerlo. Desde que estoy haciendo todos los conjuntos de análisis clásicos y / o aprendizaje automático supervisado, siempre que veo que PCX se explica en una parte significativa por un clasificador, voy a (i) encontrar varias variables que difieren entre los grupos de este clasificador y (ii) que puedo entrenar con éxito un SML.
0 votos
Si se trata de discriminar entre grupos, ¿por qué no utilizar un algoritmo de clasificación (por ejemplo, bosques aleatorios)?
0 votos
@usuario12202013 porque no se trata de eso. No estoy tratando de discriminar; estoy tratando de averiguar qué parte de la varianza global de la matriz de datos se explica por una clasificación determinada. Como he mencionado en mi comentario anterior, utilizo el aprendizaje automático (incluida la RF). Además, me gusta el PCA: cuando veo que mis grupos forman clusters en los tres primeros componentes, estoy seguro de que el (digamos) tratamiento domina la varianza observada.
0 votos
@January - ¿Cuántos grupos diferentes estás considerando? ¿Esperas que la media de cada grupo sea representativa del conjunto? Es decir, ¿los grupos se asemejan a "nubes" o se retuercen?
2 votos
to find out what share of the overall variance in the data matrix is explained by a given classification
Si quieres saber sólo esto no necesitas PCA. Basta con calcular la proporción de la suma de cuadrados entre grupos con respecto a la suma total de cuadrados:(SStotal-SSwithin)/SStotal
donde SSwithin es la suma de cuadrados agrupada dentro del grupo.1 votos
No veo ningún problema en la forma de explotar el PCA, pero no entiendo por qué realmente lo necesitas. (¿Sólo porque te gusta tal vez?) Como no puedo ver tu objetivo preciso no puedo decir nada por tu
Is there anything better?
.