2012-09-13 9 views
5

Soy un nuevo usuario de R y de bucle. Estoy tratando de tomar muestras de datos y verificar si hay una columna colineal. Quiero registrar en esa iteración que existe la columna colineal y registrarla en el vector (baditr). Además, me gustaría imprimir una línea que indique que "la colinealidad está en la iteración i". Entonces me gustaría que el código salte a la segunda iteración y continúe ejecutándose. Para cada iteración, me gustaría que el código guarde la suma de las columnas en la fila correspondiente de la matriz.Seleccionar filas sin valores faltantes en R

Mi problema es que obtengo una NA para las iteraciones incorrectas. Mi intención es que las iteraciones malas no se incluyan en mi matriz. Aquí está mi código:

a0=rep(1,40) 
a=rep(0:1,20) 
b=c(rep(1,20),rep(0,20)) 
c0=c(rep(0,12),rep(1,28)) 
c1=c(rep(1,5),rep(0,35)) 
c2=c(rep(1,8),rep(0,32)) 
c3=c(rep(1,23),rep(0,17)) 
da=matrix(cbind(a0,a,b,c0,c1,c2,c3),nrow=40,ncol=7) 
sing <- function(nrw){ 
    sm <- matrix(NA,nrow=nrw,ncol=ncol(da)) 
    baditr <- NULL 
    for(i in 1:nrw){ 
    ind <- sample(1:nrow(da), nrow(da),replace =TRUE) 
    smdat <- da[ind,] 
    evals <- eigen(crossprod(smdat))$values 
    if(any(abs(evals) < 1e-7)){ 
     baditr <- c(baditr,i) 
     cat("singularity occurs at", paste(i),"\n") 
     next 
    } 
    sm[i,] <- apply(smdat,2,sum) 
    } 
    return(sm) 
} 
sing(20) 

voy a tener el siguiente resultado:

singularity occurs at 9 
singularity occurs at 13 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] 40 23 22 25 5 8 26 
[2,] 40 20 18 30 4 7 22 
[3,] 40 19 24 28 6 7 25 
[4,] 40 19 22 30 6 9 26 
[5,] 40 12 26 26 8 13 30 
[6,] 40 17 16 27 7 10 19 
[7,] 40 20 17 33 3 5 19 
[8,] 40 22 19 28 4 9 23 
[9,] NA NA NA NA NA NA NA 
[10,] 40 21 24 28 3 6 27 
[11,] 40 21 16 31 2 4 22 
[12,] 40 21 21 26 3 6 23 
[13,] NA NA NA NA NA NA NA 
[14,] 40 18 16 29 2 7 22 
[15,] 40 24 18 30 6 9 21 
[16,] 40 23 18 29 4 8 21 
[17,] 40 17 25 25 3 8 29 
[18,] 40 22 28 23 9 14 30 
[19,] 40 25 23 25 7 11 30 
[20,] 40 20 23 27 7 10 26 

Me gustaría que mi matriz para tener este aspecto:

singularity occurs at 9 
singularity occurs at 13 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] 40 23 22 25 5 8 26 
[2,] 40 20 18 30 4 7 22 
[3,] 40 19 24 28 6 7 25 
[4,] 40 19 22 30 6 9 26 
[5,] 40 12 26 26 8 13 30 
[6,] 40 17 16 27 7 10 19 
[7,] 40 20 17 33 3 5 19 
[8,] 40 22 19 28 4 9 23 
[10,] 40 21 24 28 3 6 27 
[11,] 40 21 16 31 2 4 22 
[12,] 40 21 21 26 3 6 23 
[14,] 40 18 16 29 2 7 22 
[15,] 40 24 18 30 6 9 21 
[16,] 40 23 18 29 4 8 21 
[17,] 40 17 25 25 3 8 29 
[18,] 40 22 28 23 9 14 30 
[19,] 40 25 23 25 7 11 30 
[20,] 40 20 23 27 7 10 26 

Como prueba de fallos, lo haría también aprecio cualquier información que pueda tener sobre cómo guardar un cierto número de iteraciones en un archivo (por ejemplo, 50 iteraciones), que puedo anular una vez que se produce el siguiente número de iteraciones. Es decir, guardo las primeras 50 iteraciones en un archivo y luego, una vez que se produce la segunda ronda de 50 iteraciones, anulan la primera ronda y, como resultado, mi archivo ahora tiene 100 iteraciones.

Perdón por la larga publicación. Pero gracias de antemano.

+0

Sin mirar a la mecánica de la función, si desea devolver 'sm' sin los valores' NA', luego 'return (na.omit (sm))' hará el truco – mnel

+0

@mnel gracias Me olvidé de este comando. porque mi principal problema es con el siguiente comando en mi código original. Compruebo si hay una colinealidad en los datos para ajustar o no a un modelo, "entonces la condición que estoy imponiendo es si hay colinealidad, hágamelo saber en qué iteración y no se ajusta al modelo y luego comienza la siguiente iteración ". también el problema con guardar para archivar en cierto número de iteraciones. –

Respuesta

6

Antes de devolver sm, puede filtrar las filas con los valores NA utilizando complete.cases(). Se vería como sm[complete.cases(sm),]. La función devuelve un vector lógico de valores TRUE/FALSE, lo que fuerza a R a no devolver esos valores con FALSE.

Además, parece que no está haciendo nada con baditers después de definirlo.Puedo comentar todas las líneas que se refieren a baditers y su función parece funcionar bien ... tal vez es un legado de una iteración anterior de tu código?

actualización

Ésta es tu función actualizada usando complete.cases(). Tenga en cuenta que también comenté todo lo relacionado con baditr para ilustrar que no está haciendo nada actualmente en su código.

sing <- function(nrw){ 
    sm <- matrix(NA,nrow=nrw,ncol=ncol(da)) 
    #baditr <- NULL 
    for(i in 1:nrw){ 
    ind <- sample(1:nrow(da), nrow(da),replace =TRUE) 
    smdat <- da[ind,] 
    evals <- eigen(crossprod(smdat))$values 
    if(any(abs(evals) < 1e-7)){ 
     #baditr <- c(baditr,i) 
     cat("singularity occurs at", paste(i),"\n") 
     next 
    } 
    sm[i,] <- apply(smdat,2,sum) 
    } 
    return(sm[complete.cases(sm),]) 
} 

Ahora vamos a ejecutar la función, yo estoy envolviendo dim() alrededor de la llamada a la función que nos dirá las #rows y #columns del objeto resultante:

> dim(sing(20)) 
singularity occurs at 6 
[1] 19 7 

Así que una singularidad y una matriz de 19 filas y 7 columnas, ¿me falta algo?

En cuanto a su otra pregunta sobre cómo escribir las cosas, ¿conoce el parámetro append para write.table() y sus amigos?La página de ayuda nos dice que If TRUE, the output is appended to the file. If FALSE, any existing file of the name is destroyed.

Actualización 2

Aquí hay un ejemplo usando append = TRUE en write.table()

#Matrix 1 definition and write to file 
x <- matrix(1:9, ncol = 3) 
write.table(x, "out.txt", sep = "\t", col.names = TRUE, row.names = FALSE) 
#Matrix 2 definition and write to same file with append = TRUE 
x2 <- matrix(10:18, ncol = 3) 
write.table(x2, "out.txt", sep = "\t", col.names = FALSE, row.names = FALSE, append = TRUE) 
#read consolidated data back in to check if it's right 
x3 <- read.table("out.txt", header = TRUE) 

Resultados en

V1 V2 V3 
1 1 4 7 
2 2 5 8 
3 3 6 9 
4 10 13 16 
5 11 14 17 
6 12 15 18 
+0

Intenté su método, pero no funcionó ninguna otra sugerencia. ¿Qué pasa con el guardado en el archivo en cierta cantidad de iteraciones? –

+0

@frespider - agregué cómo se vería tu función modificada, ¿me falta algo? – Chase

+0

¿Puede explicar más acerca de write.table y anexar –

Cuestiones relacionadas