Alejandro Ayala
2013-Mar-14 06:12 UTC
[R-es] funciones (findInterval, which) y simulación discreta
Tengo 2 grandes inquietudes: Necesito aplicar la función findInterval a una lista donde su componentes son matrices(32x32), cuyos intervalos se conformaron de la siguiente manera: 1er paso. # a todas las matrices se las dividió en matrices superiores e inferiores d_sup <- lapply(Matriz,function(x){data.matrix(upper.tri(x)*x)}) d_inf <- lapply(Matriz,function(x){data.matrix(lower.tri(x)*x)}) 2do paso. # a cada fila se tomo su proporción respecto al total de la suma de la fila de cada matriz mat_sup1<-lapply(d_sup,function(x) { res<-prop.table(x,1) ifelse(is.na(res),0,res) }) mat_inf1<-lapply(d_inf,function(x) { res<-prop.table(x,1) ifelse(is.na(res),0,res) }) 3er paso. Lo que requiero es que cada fila de cada matriz se forme un vector como si se tratara de una función de distribución acumulada paro lo cual utilizo lo siguiente: z1<-lapply(mat_sup1,function(x) { for(i in seq_len(dim(x)[1])) {x[i,] <- cumsum(x[i,])} return(x) }) Aquí es donde solicito su ayuda ya que al momento de aplicar el paso 3 los valores que anteriormente estaban en cero cambiaron al valor de la suma acumulada en la fila de la matriz que es componente de la lista. Necesito que los valores que estaban en cero vuelvan a ser ceros en esta nueva lista, para lo cual cree la siguiente función que me permite transformar valores de determinadas posiciones a cero siendo en este caso vectores i y j que representan las filas y columnas respectivamente; pero cuando los valores de los indices se repiten el resultado es erroneo zerofunc <- function(M,i,j,val=0){ # (1) M[i,j] <- val return(M) } donde los valores de i y j serian vectores que se los obtuvo mediante: k<-lapply(mat_sup1,function(x){ (2) which(x==0,arr.ind=TRUE) }) la siguiente función realiza la suma acumulada para cada fila z1<-lapply(mat_sup1,function(x) { for(i in seq_len(dim(x)[1])) {x[i,] <- cumsum(x[i,])} return(x) }) Mi pregunta es como puedo aplicar estas funciones (1) y (2) a todas las matrices (componentes) de la lista ya que es utilizar 2 listas distintas para obtener una tercera con dichos resultados Un resumen de lo todo lo anterior es lo siguiente con una lista de 2 matrices Matriz<-list(m1=matrix(c(3,2,0,5,1,4,7,8,0,5,7,1,7,2,4,8),4),m2=matrix(c(0,5,8,4,3,2,7,5,9,1,7,8,3,0,7,5),4)) d_sup <- lapply(Matriz,function(x){data.matrix(upper.tri(x)*x)}) mat_sup1<-lapply(d_sup,function(x) { res<-prop.table(x,1) ifelse(is.na(res),0,res) }) k<-lapply(mat_sup1,function(x){ which(x==0,arr.ind=TRUE) }) z1<-lapply(mat_sup1,function(x) { for(i in seq_len(dim(x)[1])) {x[i,] <- cumsum(x[i,])} return(x) }) #Aplicando (1) a una componente de la lista ejemplo msup1$m1 zerofunc(mat_sup1$m1,k$m1[,1],k$m2[,2]) # el resultado es erroneo toda la matriz se llena de ceros, como se podria resolver este error ya que el verdadero objetivo es realizar una simulación "n" de valores entre 0 y 1, donde cada valor simulado caería dentro de los intervalos formados entre los valores de las filas que conforman las matrices de la lista, valores que serán sustituidos por el indice del intervalo en que se encuentran, es aqui donde deseo hacer uso de la función findInterval. Adjunto un ejemplo en un archivo excel de lo que deseo hacer espero su gran y valiosa ayuda ya que aplicar esto a nivel de lista me resulta un poco complejo. Talvez algún manual bueno de R en español Gracias Alejandro ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20130314/0b5c1068/attachment.html> ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: Simulacion.xlsx Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet Size: 12656 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20130314/0b5c1068/attachment.bin>