Luis Alberto Lopez Gonzalez
2010-May-06 22:56 UTC
[R-es] matriz de distancias chi Cuadrado
Hola a todos... saludos cordiales.... Quiero hacer una función que me calcule la matriz de distancias chi cuadrado, pero obtengo este mensaje de error: Error en d.chiCol[i, j] = 0 : objeto de tipo ''closure'' no es subconjunto d.chiCol<- function(A) { m <- dim(A)[2] n <- dim(A)[1] B <- prop.table(A,2) C <- prop.table(A) pesos <- apply(C,1,sum) dchi.Col <- matrix(,m,m) for (i in 1:m) { for(j in 1:m) { if(i==j) d.chiCol[i,j]=0 else x <- (B[,i]-B[,j])^2 val <- x/pesos dchi.Col[i,j]=sqrt(sum(val)) } } dchi.Col } Alguien me puede colaborar, gracias. -- Luis Alberto López González [[alternative HTML version deleted]]
Buenas noches Luis Alberto, Cual es la diferencia entre d.chiCol y dchi.Col en el for para j? He aqui una nueva version de tu programa: # calcula la distancia chi^2 para una matrix A # -- nombres es un argumento logico que controla si A tiene # nombres en las columnas. Por defecto es TRUE dist.chi <- function(A, nombres = TRUE){ m <- dim(A)[2] n <- dim(A)[1] B <- prop.table(A, 2) C <- prop.table(A) pesos <- apply(C,1,sum) res <- matrix(NA, m, m) for (i in 1:m) for(j in 1:m){ if(i == j) res[i, j] <- 0 else{ x <- (B[,i]-B[,j])^2 val <- sqrt(sum(x/pesos)) res[i, j] <- val } } if(nombres) colnames(res) <- rownames(res) <- colnames(A) res } # --------- # Ejemplo # --------- # datos set.seed(123) X <- matrix(rpois(100, 10), ncol = 10) colnames(X) <- paste(''x'', 1:10, sep = "") X # resultado res <- dist.chi(X) res # removiendo los nombres de X # y ejecutando el programa de nuevo colnames(X) <- rownames(X) <- NULL res <- dist.chi(X) res Saludos, Jorge Ivan Velez On Thu, May 6, 2010 at 6:56 PM, Luis Alberto Lopez Gonzalez <> wrote:> Hola a todos... saludos cordiales.... > Quiero hacer una función que me calcule la matriz de distancias chi > cuadrado, pero obtengo este mensaje de error: > > Error en d.chiCol[i, j] = 0 : objeto de tipo ''closure'' no es subconjunto > > > d.chiCol<- function(A) > { > m <- dim(A)[2] > n <- dim(A)[1] > B <- prop.table(A,2) > C <- prop.table(A) > pesos <- apply(C,1,sum) > dchi.Col <- matrix(,m,m) > for (i in 1:m) > { > for(j in 1:m) > { > if(i==j) > d.chiCol[i,j]=0 > else > x <- (B[,i]-B[,j])^2 > val <- x/pesos > dchi.Col[i,j]=sqrt(sum(val)) > } > } > dchi.Col > } > Alguien me puede colaborar, gracias. > > > -- > Luis Alberto López González > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]
Lo siento, la ultima parte deberia haber sido: # removiendo los nombres de X # y ejecutando el programa de nuevo colnames(X) <- rownames(X) <- NULL res <- dist.chi(X, FALSE) # aqui estaba TRUE :) res --JIV 2010/5/6 Jorge Ivan Velez <>> Buenas noches Luis Alberto, > > Cual es la diferencia entre d.chiCol y dchi.Col en el for para j? > > He aqui una nueva version de tu programa: > > # calcula la distancia chi^2 para una matrix A > # -- nombres es un argumento logico que controla si A tiene > # nombres en las columnas. Por defecto es TRUE > dist.chi <- function(A, nombres = TRUE){ > m <- dim(A)[2] > n <- dim(A)[1] > B <- prop.table(A, 2) > C <- prop.table(A) > pesos <- apply(C,1,sum) > res <- matrix(NA, m, m) > for (i in 1:m) for(j in 1:m){ > if(i == j) res[i, j] <- 0 > else{ > x <- (B[,i]-B[,j])^2 > val <- sqrt(sum(x/pesos)) > res[i, j] <- val > } > } > if(nombres) colnames(res) <- rownames(res) <- colnames(A) > res > } > > # --------- > # Ejemplo > # --------- > # datos > set.seed(123) > X <- matrix(rpois(100, 10), ncol = 10) > colnames(X) <- paste(''x'', 1:10, sep = "") > X > > # resultado > res <- dist.chi(X) > res > > # removiendo los nombres de X > # y ejecutando el programa de nuevo > colnames(X) <- rownames(X) <- NULL > res <- dist.chi(X) > res > > Saludos, > Jorge Ivan Velez > > > On Thu, May 6, 2010 at 6:56 PM, Luis Alberto Lopez Gonzalez <> wrote: > >> Hola a todos... saludos cordiales.... >> Quiero hacer una función que me calcule la matriz de distancias chi >> cuadrado, pero obtengo este mensaje de error: >> >> Error en d.chiCol[i, j] = 0 : objeto de tipo ''closure'' no es subconjunto >> >> >> d.chiCol<- function(A) >> { >> m <- dim(A)[2] >> n <- dim(A)[1] >> B <- prop.table(A,2) >> C <- prop.table(A) >> pesos <- apply(C,1,sum) >> dchi.Col <- matrix(,m,m) >> for (i in 1:m) >> { >> for(j in 1:m) >> { >> if(i==j) >> d.chiCol[i,j]=0 >> else >> x <- (B[,i]-B[,j])^2 >> val <- x/pesos >> dchi.Col[i,j]=sqrt(sum(val)) >> } >> } >> dchi.Col >> } >> Alguien me puede colaborar, gracias. >> >> >> -- >> Luis Alberto López González >> >> [[alternative HTML version deleted]] >> >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es@r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> >[[alternative HTML version deleted]]
> Hola a todos... saludos cordiales.... > Quiero hacer una función que me calcule la matriz de distancias chi > cuadrado, pero obtengo este mensaje de error: > > Error en d.chiCol[i, j] = 0 : objeto de tipo 'closure' no es subconjunto > > > d.chiCol<- function(A) > { > m <- dim(A)[2] > n <- dim(A)[1] > B <- prop.table(A,2) > C <- prop.table(A) > pesos <- apply(C,1,sum) > dchi.Col <- matrix(,m,m)Ya alguien parece haberlo resuelto antes que lo lea, te hago una sugerencia (que tal vez no te sirva, pero va igual), cuando haces un par de bucles sobre una matriz cuadrada puedes hacerlo mas rápido así: en lugar de : for (i in 1:m){ for(j in 1:m) { if(i==j) ... hacer: for(i in 1:(m-1)){ d.chiCol[i,i] = 0 for(j in (i+1):m) dhci.Col[i,j] = ... dhci.Col[j,i] = ... } } dhci.Col[m,m]=... de esa manera ganas mucho tiempo en matrices grandes (o en muchas iteraciones)> d.chiCol[i,j]=0 > else > x <- (B[,i]-B[,j])^2 > val <- x/pesos > dchi.Col[i,j]=sqrt(sum(val)) > } > } > dchi.Col > } > Alguien me puede colaborar, gracias. >__________________________________________________ Correo Yahoo! Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
> Hola a todos... saludos cordiales.... > Quiero hacer una función que me calcule la matriz de distancias chi > cuadrado, pero obtengo este mensaje de error: > > Error en d.chiCol[i, j] = 0 : objeto de tipo 'closure' no es subconjunto > > > d.chiCol<- function(A) > { > m <- dim(A)[2] > n <- dim(A)[1] > B <- prop.table(A,2) > C <- prop.table(A) > pesos <- apply(C,1,sum) > dchi.Col <- matrix(,m,m)Ya alguien parece haberlo resuelto antes que lo lea, te hago una sugerencia (que tal vez no te sirva, pero va igual), cuando haces un par de bucles sobre una matriz cuadrada puedes hacerlo mas rápido así: en lugar de : for (i in 1:m){ for(j in 1:m) { if(i==j) ... hacer: for(i in 1:(m-1)){ d.chiCol[i,i] = 0 for(j in (i+1):m) dhci.Col[i,j] = ... dhci.Col[j,i] = ... } } dhci.Col[m,m]=... de esa manera ganas mucho tiempo en matrices grandes (o en muchas iteraciones)> d.chiCol[i,j]=0 > else > x <- (B[,i]-B[,j])^2 > val <- x/pesos > dchi.Col[i,j]=sqrt(sum(val)) > } > } > dchi.Col > } > Alguien me puede colaborar, gracias. >__________________________________________________ Correo Yahoo! Espacio para todos tus mensajes, antivirus y antispam ¡gratis!