33 votos

Imputación de valores perdidos para PCA

Utilicé el prcomp() para realizar un PCA (análisis de componentes principales) en R. Sin embargo, hay un error en esa función tal que el na.action no funciona. He pedido ayuda en stackoverflow dos usuarios ofrecieron dos formas diferentes de tratar con NA valores. Sin embargo, el problema de ambas soluciones es que cuando hay un NA esa fila se elimina y no se tiene en cuenta en el análisis PCA. Mi conjunto de datos reales es una matriz de 100 x 100 y no quiero perder una fila entera sólo porque contiene un único NA valor.

El siguiente ejemplo muestra que el prcomp() no devuelve ningún componente principal para la fila 5, ya que contiene un NA valor.

d       <- data.frame(V1 = sample(1:100, 10), V2 = sample(1:100, 10), 
                      V3 = sample(1:100, 10))
result  <- prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x                                # $
d$V1[5] <- NA                           # $
result  <- prcomp(~V1+V2, data=d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x

Me preguntaba si se puede establecer el NA a un valor numérico específico cuando center y scale se establecen en TRUE para que el prcomp() funciona y no elimina las filas que contienen NA pero tampoco influye en el resultado del análisis PCA.

Pensé en reemplazar NA con el valor de la mediana en una sola columna, o con un valor muy cercano a 0. Sin embargo, no estoy seguro de cómo influye esto en el análisis PCA.

¿A alguien se le ocurre una buena manera de resolver este problema?

32voto

Jake Puntos 3853

De hecho, existe una forma bien documentada de tratar las matrices gappy: se puede descomponer una matriz de covarianza $\textbf{C}$ de sus datos $\textbf{X}$ , que se escala por el número de valores compartidos $n$ :
$$ \textbf{C}=\frac{1}{n} \textbf{X} ^ {\text{T}} \textbf{X},~~~~ C_{jl} = \overline{X_{.j}Y_{.l}} $$

y luego expandir los coeficientes principales mediante un ajuste de mínimos cuadrados (como menciona @user969113). He aquí un ejemplo .

Sin embargo, hay varios problemas con este método relacionados con el hecho de que la matriz de covarianza ya no es semipositiva definida y los valores propios/singulares tienden a inflarse. Se puede encontrar una buena revisión de estos problemas en Beckers y Rixen (2003) donde también proponen un método para interpolar de forma óptima los huecos que faltan - DINEOF (Data Interpolating Empirical Orthogonal Functions). Recientemente he escrito un que realiza la función DINEOF y realmente parece ser una forma mucho mejor de hacerlo. Puedes realizar DINEOF en tu conjunto de datos $\textbf{X}$ directamente, y luego utilizar el conjunto de datos interpolados como entrada en prcomp .

Actualización

Otra opción para llevar a cabo el PCA en un conjunto de datos gappy es "Recursively Subtracted Empirical Orthogonal Functions" (Taylor et al. 2013). También corrige algunos de los problemas del enfoque de mínimos cuadrados, y es computacionalmente mucho más rápido que DINEOF. Este puesto compara los tres enfoques en cuanto a la precisión de la reconstrucción de los datos utilizando los PC.

Referencias

Beckers, Jean-Marie, y M. Rixen. "Cálculos EOF y relleno de datos a partir de conjuntos de datos oceanográficos incompletos". Journal of Atmospheric and Oceanic Technology 20.12 (2003): 1839-1856.

Taylor, M., Losch, M., Wenzel, M., & Schröter, J. (2013). On the sensitivity of field reconstruction and prediction using Empirical Orthogonal Functions derived from gappy data. Journal of Climate, 26(22), 9194-9205.

15voto

kentaromiura Puntos 3361

Un documento reciente que revisa los enfoques para tratar los valores perdidos en los análisis PCA es "Análisis de componentes principales con valores perdidos: un estudio comparativo de métodos" de Dray & Josse (2015) . Dos de los métodos más conocidos de PCA que permiten los valores perdidos son el algoritmo NIPALS, implementado en el nipals función del ade4 y el PCA iterativo (Ipca o EM-PCA), implementado en el imputePCA función del missMDA paquete. El documento concluye que el método Ipca es el que mejor se comporta en la más amplia gama de condiciones.

Para su ejemplo la sintaxis es :

Para NIPALS :

library(ade4)
nipals(d[,c(1,2)])

Para Ipca :

library(missMDA)
imputePCA(d[,c(1,2)],method="EM",ncp=1)

8voto

Zizzencs Puntos 1358

Mi sugerencia depende de cuántos datos faltan y por qué faltan. Pero esto no tiene nada que ver con el ACP, en realidad. Si faltan muy pocos datos, entonces no importará mucho lo que haga. Reemplazar con la mediana no es lo ideal, pero si no faltan muchos datos, no será muy diferente de una solución mejor. Usted podría intentar hacer PCA con el reemplazo de la mediana y la eliminación de la lista y ver si hay grandes diferencias en los resultados.

A continuación, si faltan más datos, debe considerar si faltan completamente al azar, si faltan al azar o si no faltan al azar. Yo sugeriría la imputación múltiple en los dos primeros casos y algunas veces en el tercer caso - a menos que los datos estén muy distorsionados por su condición de NMAR, creo que la imputación múltiple será mejor que la eliminación de la lista (Joe Schafer de Penn State ha hecho mucho trabajo sobre los datos que faltan - recuerdo algunos trabajos suyos que muestran que la imputación múltiple funcionó bastante bien incluso en algunos casos de NMAR). Sin embargo, si los datos son MCAR o MAR, las propiedades de la imputación múltiple pueden ser probadas.

Si se decide por el MI, hay que tener cuidado porque los signos de los componentes en el PCA son arbitrarios, y un pequeño cambio en los datos puede cambiar un signo. Entonces, cuando se hace el PCA, se obtienen tonterías. Hace mucho tiempo encontré una solución en SAS - no es difícil, pero hay que tener cuidado.

2voto

Agahamoru Puntos 1

Puedes resolver el problema del valor que falta de otra manera. A continuación voy a ilustrarlas.

Debe utilizar la media de la variable que incluye los valores NA o imputar los valores que faltan con una regresión lineal.

Debe utilizar missMDA y luego FactoMineR o el pcaMethods . A continuación un ejemplo.

library(missMDA)
nPCs <- estim_ncpPCA(VIM::sleep)

Output 
nPCS$ncp
    3

completed_sleep <- imputePCA(VIM::sleep, ncp = nPCs$ncp, scale = TRUE)
PCA(completed_sleep$completeObs)

El otro ejemplo es:

library(pcaMethods)
sleep_pca_methods <- pca(sleep, nPcs=2, method="ppca", center = TRUE)
imp_air_pcamethods <- completeObs(sleep_pca_methods)

Si quiere profundizar en el PCA o el paquete factoMiner debe visitar su sitio web http://factominer.free.fr/

0voto

mat_geek Puntos 1367

No hay una solución correcta para el problema. Hay que especificar cada coordenada del vector para obtener el conjunto correcto de componentes principales. Si falta una coordenada y se sustituye por un valor imputado, se obtendrá un resultado, pero dependerá del valor imputado, por lo que si hay dos opciones razonables para el valor imputado, las distintas opciones darán respuestas diferentes.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X