1 #Author: Pierre Ratinaud
2 #Copyright (c) 2008-2009 Pierre Ratinaud
6 #fonction pour la double classification
7 #cette fonction doit etre splitter en 4 ou 5 fonctions
9 AssignClasseToUce <- function(listuce, chd) {
10 print('assigne classe -> uce')
14 fille<-function(classe,classeuce) {
15 listfm<-unique(unlist(classeuce[classeuce[,classe%/%2]==classe,]))
16 listf<-listfm[listfm>=classe]
22 croiseeff <- function(croise, classeuce1, classeuce2) {
25 for (i in 1:ncol(classeuce1)) {
30 for (j in 1:ncol(classeuce2)) {
33 croise[cl1 - 1, clj1 -1] <- length(which(classeuce1[,i] == cl1 & classeuce2[,j] == clj1))
34 croise[cl1 - 1, clj2 -1] <- length(which(classeuce1[,i] == cl1 & classeuce2[,j] == clj2))
35 croise[cl2 - 1, clj1 -1] <- length(which(classeuce1[,i] == cl2 & classeuce2[,j] == clj1))
36 croise[cl2 - 1, clj2 -1] <- length(which(classeuce1[,i] == cl2 & classeuce2[,j] == clj2))
42 addallfille <- function(lf) {
44 for (i in 1:length(lf)) {
45 if (! is.null(lf[[i]])) {
50 if (f1 > length(lf)) {
51 for (j in (length(lf) + 1):f2) {
62 getfille <- function(nlf, classe, pf) {
63 if (length(nlf[[classe]]) == 1) {
66 pf <- c(pf, nlf[[classe]])
67 c1 <- nlf[[classe]][1]
68 c2 <- nlf[[classe]][2]
69 pf <- getfille(nlf, c1, pf)
70 pf <- getfille(nlf, c2, pf)
75 getmere <- function(list_mere, classe) {
79 pf <- c(pf, list_mere[[i]])
85 getfillemere <- function(list_fille, list_mere, classe) {
86 return(c(getfille(list_fille, classe, NULL), getmere(list_mere, classe)))
89 #nbt nbcl = nbt+1 tcl=((nbt+1) *2) - 2 n1[,ncol(n1)], nchd1[,ncol(nchd1)]
90 Rchdtxt<-function(uceout, chd1, chd2 = NULL, mincl=0, classif_mode=0, nbt = 9) {
91 #FIXME: le nombre de classe peut etre inferieur
93 tcl <- ((nbt+1) * 2) - 2
94 #Assignation des classes
95 classeuce1<-AssignClasseToUce(listuce1,chd1$n1)
96 if (classif_mode==0) {
97 classeuce2<-AssignClasseToUce(listuce2,chd2$n1)
100 # classeuce2<-classeuce1
103 #calcul des poids (effectifs)
105 makepoids <- function(classeuce, poids) {
111 poids[cl1 - 1] <- length(which(classeuce[,i] == cl1))
112 poids[cl2 - 1] <- length(which(classeuce[,i] == cl2))
117 # makepoids<-function(classeuce,poids) {
118 # for (classes in 2:(tcl + 1)){
119 # for (i in 1:ncol(classeuce)) {
120 # if (poids[(classes-1)]<length(classeuce[,i][classeuce[,i]==classes])) {
121 # poids[(classes-1)]<-length(classeuce[,i][classeuce[,i]==classes])
128 poids1<-vector(mode='integer',length = tcl)
129 poids1<-makepoids(classeuce1,poids1)
130 if (classif_mode==0) {
131 poids2<-vector(mode='integer',length = tcl)
132 poids2<-makepoids(classeuce2,poids2)
137 print('croisement classif')
139 # croise=matrix(ncol=tcl,nrow=tcl)
141 # docroise <- function(croise, classeuce1, classeuce2) {
142 # #production du tableau de contingence
143 # for (i in 1:ncol(classeuce1)) {
144 # #poids[i]<-length(classeuce1[,i][x==classes])
145 # for (j in 1:ncol(classeuce2)) {
146 # tablecroise<-table(classeuce1[,i],classeuce2[,j])
147 # tabcolnames<-as.numeric(colnames(tablecroise))
148 # #tabcolnames<-c(tabcolnames[(length(tabcolnames)-1)],tabcolnames[length(tabcolnames)])
149 # tabrownames<-as.numeric(rownames(tablecroise))
150 # #tabrownames<-c(tabrownames[(length(tabrownames)-1)],tabrownames[length(tabrownames)])
151 # for (k in (ncol(tablecroise)-1):ncol(tablecroise)) {
152 # for (l in (nrow(tablecroise)-1):nrow(tablecroise)) {
153 # croise[(tabrownames[l]-1),(tabcolnames[k]-1)]<-tablecroise[l,k]
160 if (classif_mode==0) {
161 croise <- croiseeff( matrix(ncol=tcl,nrow=tcl), classeuce1, classeuce2)
163 croise <- croiseeff( matrix(ncol=tcl,nrow=tcl), classeuce1, classeuce1)
166 if (classif_mode == 0) {ind <- (nbcl * 2)} else {ind <- nbcl}
168 mincl<-round(nrow(classeuce1)/ind)
176 #tableau des chi2 signes
180 # nr <- nrow(classeuce1)
181 # newchicroise <- function(croise, mincl, nr, poids1, poids2) {
182 # chicroise <- croise
183 # chicroise[which(croise < mincl)] <- 0
184 # tocompute <- which(chicroise > 0, arr.ind = TRUE)
185 # for (i in 1:nrow(tocompute)) {
186 # chitable <- matrix(ncol=2,nrow=2)
187 # chitable[1,1] <- croise[tocompute[i,1], tocompute[i,2]]
188 # chitable[1,2] <- poids1[tocompute[i,1]] - chitable[1,1]
189 # chitable[2,1] <- poids2[tocompute[i,2]] - chitable[1,1]
190 # chitable[2,2] <- nr - poids2[tocompute[i,2]] - chitable[1,2]
191 # chitest<-chisq.test(chitable,correct=FALSE)
192 # chicroise[tocompute[i,1], tocompute[i,2]] <- ifelse(chitable[1,1] > chitest$expected[1,1], round(chitest$statistic,digits=7), -round(chitest$statistic,digits=7))
199 dochicroise <- function(croise, mincl) {
201 for (i in 1:nrow(croise)) {
202 for (j in 1:ncol(croise)) {
203 if (croise[i,j]==0) {
205 } else if (croise[i,j]<mincl) {
208 chitable<-matrix(ncol=2,nrow=2)
209 chitable[1,1]<-croise[i,j]
210 chitable[1,2]<-poids1[i]-chitable[1,1]
211 chitable[2,1]<-poids2[j]-chitable[1,1]
212 chitable[2,2]<-nrow(classeuce1)-poids2[j]-chitable[1,2]
213 chitest<-chisq.test(chitable,correct=FALSE)
214 if ((chitable[1,1]-chitest$expected[1,1])<0) {
215 chicroise[i,j]<--round(chitest$statistic,digits=7)
217 chicroise[i,j]<-round(chitest$statistic,digits=7)
226 dochicroisesimple <- function(croise, mincl) {
228 for (i in 1:nrow(croise)) {
229 for (j in 1:ncol(croise)) {
230 if (croise[i,j]==0) {
232 } else if (croise[i,j]<mincl) {
235 chitable<-matrix(ncol=2,nrow=2)
236 chitable[1,1]<-croise[i,j]
237 chitable[1,2]<-poids1[i]-chitable[1,1]
238 chitable[2,1]<-poids1[j]-chitable[1,1]
239 chitable[2,2]<-nrow(classeuce1)-poids1[j]-chitable[1,2]
240 chitest<-chisq.test(chitable,correct=FALSE)
241 if ((chitable[1,1]-chitest$expected[1,1])<0) {
242 chicroise[i,j]<--round(chitest$statistic,digits=7)
244 chicroise[i,j]<-round(chitest$statistic,digits=7)
252 if (classif_mode == 0) {
253 chicroise <- dochicroise(croise, mincl)
255 chicroise <- dochicroisesimple(croise, mincl)
260 #determination des chi2 les plus fort
261 chicroiseori<-chicroise
263 doxy <- function(chicroise) {
266 listxy <- which(chicroise > 3.84, arr.ind = TRUE)
268 val <- chicroise[which(chicroise > 3.84)]
269 ord <- order(val, decreasing = TRUE)
270 listxy <- listxy[ord,]
271 #for (i in 1:nrow(listxy)) {
272 # if ((!listxy[,2][i] %in% listx) & (!listxy[,1][i] %in% listy)) {
273 # listx <- c(listx, listxy[,2][i])
274 # listy <- c(listy, listxy[,1][i])
277 xy <- list(x = listxy[,2], y = listxy[,1])
280 xy <- doxy(chicroise)
288 # maxi[i]<-which.max(chicroise)
289 # chimax[i]<-chicroise[maxi[i]]
290 # chicroise[maxi[i]]<-0
292 # testpres<-function(x,listcoord) {
293 # for (i in 1:length(listcoord)) {
294 # if (x==listcoord[i]) {
302 # c.len=nrow(chicroise)
303 # r.len=ncol(chicroise)
308 # #on garde une valeur par ligne / colonne
309 # for (i in 1:length(maxi)) {
310 # #coordonnées de chi2 max
311 # #coord <- arrayInd(maxi[i], dim(chicroise))
312 # #x.co <- coord[1,2]
313 # #y.co <- coord[1,1]
314 # x.co<-ceiling(maxi[i]/c.len)
315 # y.co<-maxi[i]-(x.co-1)*c.len
318 # #print(arrayInd(maxi[i], dim(chicroise)))
319 # a<-testpres(x.co,listx)
320 # b<-testpres(y.co,listy)
332 #pour ecrire les resultats
333 for (i in 1:length(listx)) {
334 txt<-paste(listx[i]+1,listy[i]+1,sep=' ')
335 txt<-paste(txt,croise[listy[i],listx[i]],sep=' ')
336 txt<-paste(txt,chicroiseori[listy[i],listx[i]],sep=' ')
340 #colonne de la classe
341 #trouver les filles et les meres
342 trouvefillemere<-function(classe,chd) {
343 unique(unlist(chd[chd[,classe%/%2]==classe,]))
347 #----------------------------------------------------------------------
348 findbestcoord <- function(classeuce1, classeuce2) {
352 #fillemere1 <- unique(classeuce1)
353 #if (classif_mode == 0) {
354 # fillemere2 <- unique(classeuce2)
356 # fillemere2 <- fillemere1
360 listcoordok <- list()
363 lf1 <- addallfille(chd1$list_fille)
364 if (classif_mode == 0) {
365 lf2 <- addallfille(chd2$list_fille)
369 lme1 <- chd1$list_mere
370 if (classif_mode == 0) {
371 lme2 <- chd2$list_mere
375 for (first in 1:length(listx)) {
382 #listxp<-listx[first:length(listx)]
383 #listxp<-c(listxp,listx[1:(first-1)])
384 #listyp<-listy[first:length(listy)]
385 #listyp<-c(listyp,listy[1:(first-1)])
386 listxp <- listxp[order(listx, decreasing = TRUE)]
387 listyp <- listyp[order(listx, decreasing = TRUE)]
388 #listxp<-c(listxp[first:length(listx)], listx[1:(first-1)])
389 #listyp<-c(listyp[first:length(listy)], listy[1:(first-1)])
390 for (i in 1:length(listx)) {
391 if( (!(listxp[i]+1) %in% f1) & (!(listyp[i]+1) %in% f2) ) {
395 coordok <- rbind(coordok, c(listyp[i] + 1,listxp[i] + 1))
396 #print(c(listyp[i] + 1,listxp[i] + 1))
397 un1 <- getfillemere(lf2, chd2$list_mere, listxp[i] + 1)
399 f1 <- c(f1, listxp[i] + 1)
400 un2 <- getfillemere(lf1, chd1$list_mere, listyp[i] + 1)
402 f2 <- c(f2, listyp[i] + 1)
406 #if (nrow(coordok) > maxcl) {
408 # listcoordok <- list()
409 listcoordok[[nb]] <- coordok
410 # maxcl <- nrow(coordok)
411 #} else if (nrow(coordok) == maxcl) {
413 # listcoordok[[nb]] <- coordok
416 listcoordok <- unique(listcoordok)
419 if (length(listcoordok) > 1) {
421 for (i in 1:length(listcoordok)) {
424 for (j in 1:nrow(listcoordok[[i]])) {
425 chi<-c(chi,chicroiseori[(listcoordok[[i]][j,1]-1),(listcoordok[[i]][j,2]-1)])
426 uce<-c(uce,croise[(listcoordok[[i]][j,1]-1),(listcoordok[[i]][j,2]-1)])
428 if (maxchi < sum(chi)) {
434 print(suce/nrow(classeuce1))
438 #---------------------------------------------------------------------------------
439 #pour trouver une valeur dans une liste
440 #is.element(elem, list)
442 oldfindbestcoord <- function(listx, listy) {
444 trouvecoordok<-function(first) {
449 listxp<-listx[first:length(listx)]
450 listxp<-c(listxp,listx[1:(first-1)])
451 listyp<-listy[first:length(listy)]
452 listyp<-c(listyp,listy[1:(first-1)])
453 for (i in 1:length(listxp)) {
454 if (!(listxp[i]+1)%in%fillemere1) {
455 if (!(listyp[i]+1)%in%fillemere2) {
456 coordok<-rbind(coordok,c(listyp[i]+1,listxp[i]+1))
457 fillemere1<-c(fillemere1,trouvefillemere(listxp[i]+1,chd2$n1))
458 fillemere2<-c(fillemere2,trouvefillemere(listyp[i]+1,chd1$n1))
464 #fonction pour trouver le nombre maximum de classes
465 findmaxclasse<-function(listx,listy) {
469 for (i in 1:length(listy)) {
470 coordok<-trouvecoordok(i)
471 if (maxcl <= nrow(coordok)) {
473 listcoordok[[nb]]<-coordok
477 listcoordok<-unique(listcoordok)
479 #si plusieurs ensemble avec le meme nombre de classe, on conserve
480 #la liste avec le plus fort chi2
481 if (length(listcoordok)>1) {
484 for (i in 1:length(listcoordok)) {
487 if (nrow(listcoordok[[i]])==maxcl) {
488 for (j in 1:nrow(listcoordok[[i]])) {
489 chi<-c(chi,croise[(listcoordok[[i]][j,1]-1),(listcoordok[[i]][j,2]-1)])
490 uce<-c(uce,chicroiseori[(listcoordok[[i]][j,1]-1),(listcoordok[[i]][j,2]-1)])
492 if (maxchi < sum(chi)) {
500 print((maxchi/nrow(classeuce1)*100))
504 coordok<-findmaxclasse(listx,listy)
507 #findmaxclasse(listx,listy)
508 #coordok<-trouvecoordok(1)
509 #coordok <- oldfindbestcoord(listx, listy)
510 coordok <- findbestcoord(listx, listy)
513 lfilletot<-function(classeuce,x) {
515 for (classe in 1:nrow(coordok)) {
516 listfille<-unique(c(listfille,fille(coordok[classe,x],classeuce)))
521 listfille1<-lfilletot(classeuce1,1)
522 if (classif_mode == 0) {
523 listfille2<-lfilletot(classeuce2,2)
526 #utiliser rownames comme coordonnees dans un tableau de 0
527 Assignclasse<-function(classeuce,x) {
528 nchd<-matrix(0,ncol=ncol(classeuce),nrow=nrow(classeuce))
529 for (classe in 1:nrow(coordok)) {
530 clnb<-coordok[classe,x]
532 nchd[which(classeuce[,colnb]==clnb), colnb:ncol(nchd)] <- classe
536 print('commence assigne new classe')
537 nchd1<-Assignclasse(classeuce1,1)
538 if (classif_mode==0) {
539 nchd2<-Assignclasse(classeuce2,2)
541 print('fini assign new classe')
542 #croisep<-matrix(ncol=nrow(coordok),nrow=nrow(coordok))
543 if (classif_mode==0) {
544 nchd2[which(nchd1[,ncol(nchd1)]==0),] <- 0
545 nchd2[which(nchd1[,ncol(nchd1)]!=nchd2[,ncol(nchd2)]),] <- 0
546 nchd1[which(nchd2[,ncol(nchd2)]==0),] <- 0
550 elim<-which(nchd1[,ncol(nchd1)]==0)
551 keep<-which(nchd1[,ncol(nchd1)]!=0)
552 n1<-nchd1[nchd1[,ncol(nchd1)]!=0,]
553 if (classif_mode==0) {
554 n2<-nchd2[nchd2[,ncol(nchd2)]!=0,]
560 write.csv2(nchd1[,ncol(nchd1)],uceout)
561 res <- list(n1 = nchd1, coord_ok = coordok, cuce1 = classeuce1, cuce2 = classeuce2)