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.
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
@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. –