[R-es] funciones (findInterval, which) y simulación discreta

Alejandro Ayala alejo.ayalab en gmail.com
Jue Mar 14 07:12:26 CET 2013


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>


Más información sobre la lista de distribución R-help-es