2012-09-08 33 views
9

Tengo una matriz de datos de tabla de contingencia con 6 columnas y 37 filas. Necesito aplicar una transformación Chi al cuadrado para darme Perfiles de fila y Perfiles de columna para un análisis de correspondencia.Transformación de datos que evita bucles anidados en R

Desafortunadamente, me han dicho que necesitaré usar bucles anidados para transformar los datos y llevar a cabo la CA (en lugar de hacerlo de las maneras más sensatas en R). Me dieron la estructura a utilizar para mi bucle anidado:

transformed.data=data0 

for (row.index in 1:nrow(data)) { 
    for (col.index in 1:ncol(data)) { 
    transfomed.data[row.index,col.index]= 
     "TRANSFORMATION"[row.index,col.index] 
    } 
} 

por lo que entiendo utilizando el bucle anidado se aplicará a mi "transformación" primero en las filas y luego a las columnas.

La transformación Quiero realizado sobre los datos para obtener los perfiles de fila es:

( X (ij)/suma (X (i)) )/sqrt (sum (X (j)))

Si bien la transformación Quiero realizado sobre los datos para obtener los perfiles de columna es:

( X (ij)/suma (X (j)) )/sqrt (suma (X (i )))

¿Qué iba a entrar como mi "TRANSFO RMATION " en la última línea del ciclo anidado para que muestre la transformación deseada para los perfiles. De lo contrario, si he omitido entender el punto de un ciclo anidado, por favor describe lo que me permitiría hacer.

Este es el código para un subconjunto de los datos de mi:

matrix(c(15366,2079,411,366,23223,2667,699,819,31632,2724,717,1473,49938,3111,1062,11964) 
,nrow=4,ncol=4,byrow=T) 

Así que usando este subconjunto solo yo esperaría que el perfil de fila de la primera fila sea:

0.002432689 0.0003291397 6.506803e-05 5.794379e-05 

y la columna perfil para la primera columna:

0.0009473414, 0.0132572344, 0.0572742202, 0.0132863528 
+0

se puede añadir algunos datos de ejemplo para hacer su pregunta [reproducible] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? Se necesitará un conjunto de datos de entrada y su resultado esperado. Además, ¿has buscado funciones integradas? El primer hit en google me dio [esto] (http://www.statmethods.net/advstats/ca.html). – Chase

+0

Gracias Chase, solo agregaré algunos datos de muestra a la primera publicación. Con respecto a su segunda pregunta para esta tarea, primero tengo que hacer el análisis de correspondencia paso a paso transformando los datos (el bit en el que estoy estancado) y haciendo un PCA sobre eso y luego hacerlo de la manera más sensata por corresp (datos originales) y ca (datos originales) – Confused

+0

¿Suena como tarea? Algunos consejos. 1) no necesita bucles for, 2) su fórmula puede hacerse mucho más fácil si usa 'colSums()' y 'rowSums()' 3) cuando todo lo demás falla, puede ver el código fuente de las funciones para ver cómo otros autores han resuelto este mismo problema. Para hacer esto, escriba el nombre de la función sin parens en la consola. Esta * puede * ser una función de una línea con las piezas de información anteriores. – Chase

Respuesta

1

Puede usar esto en este tipo de cálculos sin necesitando incluso un solo bucle.Vuelva a escribir su ecuación, y luego se obtiene:

XTrans [i, j] = X [i, j]/( suma (X [i,]) * sqrt (sum (X [, j])) )

Para obtener una matriz que representa el término - suma (X [i,]) * sqrt (sum (X [, j])) - se utiliza la función outer() o %o% así:

rowSums(X) %o% sqrt(colSums(X)) 

O, para la transformación de la columna:

sqrt(rowSums(X)) %o% colSums(X) 

Lo único que tiene que hacer, es dividir su matriz original por éste, por ejemplo, para la transformación col:

TEST <- matrix(
       c(15366,2079,411,366,23223,2667,699,819, 
       31632,2724,717,1473,49938,3111,1062,11964), 
       nrow=4,ncol=4,byrow=T) 

> TEST/(sqrt(rowSums(TEST)) %o% colSums(TEST)) 
      [,1]  [,2]  [,3]   [,4] 
[1,] 0.0009473414 0.001455559 0.001053892 0.0001854284 
[2,] 0.0011674098 0.001522501 0.001461474 0.0003383284 
[3,] 0.0013770523 0.001346668 0.001298230 0.0005269580 
[4,] 0.0016167998 0.001143812 0.001430074 0.0031831055 

De forma similar, puede calcular la transformación de fila.

Al hacer los cálculos a mano, puedo confirmar que mi solución es correcta, siempre que haya entendido correctamente su notación de índice (lo que significa que significa filas y j para las columnas). Los números que espera no son los que dice que espera. Para mostrar que:

> (TEST[1,2]/sum(TEST[,2]))/sqrt(sum(TEST[1,])) 
[1] 0.001455559 

La normalización de chi-cuadrado se habla, en realidad se pueden encontrar en la función decostand del paquete vegan. Tenga en cuenta que, de forma predeterminada, el método se ajusta multiplicando por la raíz cuadrada del total de la matriz. Esto tiene sentido en un análisis de correspondencia.

Si no desea utilizar esta corrección, entonces se puede obtener por ejemplo la transformación columna también de la siguiente manera:

> require(vegan) 
> decostand(TEST,method="chi.square",MARGIN=2)/sqrt(sum(TEST)) 
      [,1]   [,2]  [,3]  [,4] 
[1,] 0.0009473414 0.0011674098 0.001377052 0.001616800 
[2,] 0.0014555588 0.0015225011 0.001346668 0.001143812 
[3,] 0.0010538924 0.0014614736 0.001298230 0.001430074 
[4,] 0.0001854284 0.0003383284 0.000526958 0.003183106 
attr(,"decostand") 
[1] "chi.square" 
+0

Sé que esto es tarea, pero creo que ya pasamos la fecha de vencimiento para la tarea, por lo tanto, agregamos una solución que en realidad es como R –

Cuestiones relacionadas