Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Ajuste de una regresión ortogonal mediante el análisis de componentes principales

Este ejemplo muestra cómo utilizar el análisis de componentes principales (PCA) para ajustar una regresión lineal. PCA minimiza las distancias perpendiculares de los datos al modelo ajustado. Este es el caso lineal de lo que se conoce como regresión ortogonal o mínimos cuadrados totales, y es apropiado cuando no hay distinción natural entre las variables de predictor y de respuesta, o cuando todas las variables se miden con error. Esto contrasta con la suposición de regresión habitual de que las variables predictoras se miden exactamente, y solo la variable de respuesta tiene un componente de error.

Por ejemplo, dados dos vectores de datos x e y, puede ajustar una línea que minimiza las distancias perpendiculares de cada uno de los puntos (x (i), y (i)) a la línea. Más generalmente, con las variables observadas p, se puede ajustar un hiperplano r-dimensional en el espacio p-dimensional (r < p). La elección de r equivale a elegir el número de componentes que se conservarán en el PCA. Puede basarse en un error de predicción, o puede ser simplemente una opción pragmática para reducir los datos a un número manejable de dimensiones.

En este ejemplo, ajustamos un plano y una línea a través de algunos datos en tres variables observadas. Es fácil hacer lo mismo para cualquier número de variables, y para cualquier dimensión del modelo, aunque la visualización de un ajuste en dimensiones más altas obviamente no sería sencilla.

Ajuste de un plano a datos 3-D

En primer lugar, generamos algunos datos normales trivariados para el ejemplo. Dos de las variables están bastante fuertemente correlacionadas.

rng(5,'twister'); X = mvnrnd([0 0 0], [1 .2 .7; .2 1 0; .7 0 1],50); plot3(X(:,1),X(:,2),X(:,3),'bo'); grid on; maxlim = max(abs(X(:)))*1.1; axis([-maxlim maxlim -maxlim maxlim -maxlim maxlim]); axis square view(-9,12); 

A continuación, ajustamos un plano a los datos utilizando PCA. Los coeficientes de los dos primeros componentes principales definen vectores que forman una base para el plano. El tercer PC es ortogonal a los dos primeros, y sus coeficientes definen el vector normal del plano.

[coeff,score,roots] = pca(X); basis = coeff(:,1:2) 
 basis =      0.6774   -0.0790     0.2193    0.9707     0.7022   -0.2269  
normal = coeff(:,3) 
 normal =      0.7314    -0.0982    -0.6749  

Eso es todo lo que hay para el ajuste. Pero vamos a ver más de cerca los resultados, y trazar el ajuste junto con los datos.

Dado que los dos primeros componentes explican tanto la varianza en los datos como es posible con dos dimensiones, el plano es la mejor aproximación lineal 2-D a los datos. Equivalentemente, el tercer componente explica la menor cantidad de variación en los datos, y es el término de error en la regresión. Las raíces latentes (o eigenvalues) del PCA definen la cantidad de varianza explicada para cada componente.

pctExplained = roots' ./ sum(roots) 
 pctExplained =      0.6226    0.2976    0.0798  

Las dos primeras coordenadas de las puntuaciones del componente principal proporcionan la proyección de cada punto en el plano, en el sistema de coordenadas del plano. Para obtener las coordenadas de los puntos ajustados en términos del sistema de coordenadas original, multiplicamos cada vector de coeficiente de PC por la puntuación correspondiente, y agregamos de nuevo en la media de los datos. Los residuos son simplemente los datos originales menos los puntos ajustados.

[n,p] = size(X); meanX = mean(X,1); Xfit = repmat(meanX,n,1) + score(:,1:2)*coeff(:,1:2)'; residuals = X - Xfit; 

La ecuación del plano ajustado, satisfecha por cada uno de los puntos ajustados en, es.Xfit([x1 x2 x3] - meanX)*normal = 0 El plano pasa a través del punto, y su distancia perpendicular al origen es.meanXmeanX*normal La distancia perpendicular desde cada punto en el plano, es decir, la norma de los residuos, es el producto de punto de cada punto centrado con la normal al plano.X El plano ajustado minimiza la suma de los errores cuadrados.

error = abs((X - repmat(meanX,n,1))*normal); sse = sum(error.^2) 
 sse =     15.5142  

Para visualizar el ajuste, podemos trazar el plano, los datos originales y su proyección al plano.

[xgrid,ygrid] = meshgrid(linspace(min(X(:,1)),max(X(:,1)),5), ...                          linspace(min(X(:,2)),max(X(:,2)),5)); zgrid = (1/normal(3)) .* (meanX*normal - (xgrid.*normal(1) + ygrid.*normal(2))); h = mesh(xgrid,ygrid,zgrid,'EdgeColor',[0 0 0],'FaceAlpha',0);  hold on above = (X-repmat(meanX,n,1))*normal < 0; below = ~above; nabove = sum(above); X1 = [X(above,1) Xfit(above,1) nan*ones(nabove,1)]; X2 = [X(above,2) Xfit(above,2) nan*ones(nabove,1)]; X3 = [X(above,3) Xfit(above,3) nan*ones(nabove,1)]; plot3(X1',X2',X3','-', X(above,1),X(above,2),X(above,3),'o', 'Color',[0 .7 0]); nbelow = sum(below); X1 = [X(below,1) Xfit(below,1) nan*ones(nbelow,1)]; X2 = [X(below,2) Xfit(below,2) nan*ones(nbelow,1)]; X3 = [X(below,3) Xfit(below,3) nan*ones(nbelow,1)]; plot3(X1',X2',X3','-', X(below,1),X(below,2),X(below,3),'o', 'Color',[1 0 0]);  hold off maxlim = max(abs(X(:)))*1.1; axis([-maxlim maxlim -maxlim maxlim -maxlim maxlim]); axis square view(-9,12); 

Los puntos verdes están por encima del plano, los puntos rojos están por debajo.

Ajuste de una línea a datos 3-D

Ajustar una línea recta a los datos es aún más simple, y debido a la propiedad de anidamiento de PCA, podemos usar los componentes que ya se han calculado. El vector de dirección que define la línea viene dado por los coeficientes para el primer componente principal. El segundo y tercer PCs son ortogonales a la primera, y sus coeficientes definen las direcciones que son perpendiculares a la línea. La ecuación más simple para describir la línea es, donde se parametriza la posición a lo largo de la línea.meanX + t*dirVectt

dirVect = coeff(:,1) 
 dirVect =      0.6774     0.2193     0.7022  

La primera coordenada de las puntuaciones del componente principal da la proyección de cada punto sobre la línea. Al igual que con el ajuste 2-D, los vectores de coeficiente de PC multiplicados por las puntuaciones dan los puntos ajustados en el sistema de coordenadas original.

Xfit1 = repmat(meanX,n,1) + score(:,1)*coeff(:,1)'; 

Trace la línea, los datos originales y su proyección en la línea.

t = [min(score(:,1))-.2, max(score(:,1))+.2]; endpts = [meanX + t(1)*dirVect'; meanX + t(2)*dirVect']; plot3(endpts(:,1),endpts(:,2),endpts(:,3),'k-');  X1 = [X(:,1) Xfit1(:,1) nan*ones(n,1)]; X2 = [X(:,2) Xfit1(:,2) nan*ones(n,1)]; X3 = [X(:,3) Xfit1(:,3) nan*ones(n,1)]; hold on plot3(X1',X2',X3','b-', X(:,1),X(:,2),X(:,3),'bo'); hold off maxlim = max(abs(X(:)))*1.1; axis([-maxlim maxlim -maxlim maxlim -maxlim maxlim]); axis square view(-9,12); grid on 

Si bien parece que muchas de las proyecciones en esta gráfica no son perpendiculares a la línea, eso es sólo porque estamos trazando datos 3D en dos dimensiones. En una ventana de figura en vivo, podría rotar la gráfica de forma interactiva a diferentes perspectivas para verificar que las proyecciones son de hecho perpendiculares y para obtener una mejor sensación de cómo la línea se ajusta a los datos.MATLAB®