1 #Author: Pierre Ratinaud
2 #Copyright (c) 2008-2009 Pierre Ratinaud
5 fille<-function(classe,classeuce) {
6 listfm<-unique(unlist(classeuce[classeuce[,classe%/%2]==classe,]))
7 listf<-listfm[listfm>=classe]
13 croiseeff <- function(croise, classeuce1, classeuce2) {
16 for (i in 1:ncol(classeuce1)) {
21 for (j in 1:ncol(classeuce2)) {
24 croise[cl1 - 1, clj1 -1] <- length(which(classeuce1[,i] == cl1 & classeuce2[,j] == clj1))
25 croise[cl1 - 1, clj2 -1] <- length(which(classeuce1[,i] == cl1 & classeuce2[,j] == clj2))
26 croise[cl2 - 1, clj1 -1] <- length(which(classeuce1[,i] == cl2 & classeuce2[,j] == clj1))
27 croise[cl2 - 1, clj2 -1] <- length(which(classeuce1[,i] == cl2 & classeuce2[,j] == clj2))
34 #fonction pour la double classification
35 #cette fonction doit etre splitter en 4 ou 5 fonctions
37 Rchdquest<-function(tableuc1,listeuce1,uceout ,nbt = 9, mincl = 2, mode.patate = FALSE, svd.method = 'irlba') {
38 #source('/home/pierre/workspace/iramuteq/Rscripts/CHD.R')
39 if (svd.method == 'irlba') {
43 data1<-read.csv2(tableuc1)#,row.names=1)
44 cn.data1 <- colnames(data1)
45 data1 <- as.matrix(data1)
46 colnames(data1) <- cn.data1
47 rownames(data1) <- 1:nrow(data1)
51 data1<-data1[,-which(sc<=4)]
54 #analyse des tableaux avec la fonction CHD qui doit etre sourcee avant
55 chd1<-CHD(data1, x = nbt, mode.patate = mode.patate, svd.method)
58 #FIXME: le nombre de classe peut etre inferieur
60 tcl <- ((nbt+1) * 2) - 2
63 listuce1<-read.csv2(listeuce1)
66 #Une fonction pour assigner une classe a chaque UCE
67 # AssignClasseToUce<-function(listuce,chd) {
68 # out<-matrix(nrow=nrow(listuce),ncol=ncol(chd))
69 # for (i in 1:nrow(listuce)) {
70 # for (j in 1:ncol(chd)) {
71 # out[i,j]<-chd[(listuce[i,2]+1),j]
77 AssignClasseToUce <- function(listuce, chd) {
78 print('assigne classe -> uce')
81 #Assignation des classes
82 classeuce1<-AssignClasseToUce(listuce1,chd1$n1)
83 classeuce2<-classeuce1
85 #calcul des poids (effectifs)
86 poids1<-vector(mode='integer',length=tcl)
87 # makepoids<-function(classeuce,poids) {
88 # for (classes in 2:(tcl + 1)){
89 # for (i in 1:ncol(classeuce)) {
90 # if (poids[(classes-1)]<length(classeuce[,i][classeuce[,i]==classes])) {
91 # poids[(classes-1)]<-length(classeuce[,i][classeuce[,i]==classes])
97 makepoids <- function(classeuce, poids) {
103 poids[cl1 - 1] <- length(which(classeuce[,i] == cl1))
104 poids[cl2 - 1] <- length(which(classeuce[,i] == cl2))
109 poids1<-makepoids(classeuce1,poids1)
112 # croise=matrix(ncol=tcl,nrow=tcl)
113 # #production du tableau de contingence
114 # for (i in 1:ncol(classeuce1)) {
115 # #poids[i]<-length(classeuce1[,i][x==classes])
116 # for (j in 1:ncol(classeuce2)) {
117 # tablecroise<-table(classeuce1[,i],classeuce2[,j])
118 # tabcolnames<-as.numeric(colnames(tablecroise))
119 # #tabcolnames<-c(tabcolnames[(length(tabcolnames)-1)],tabcolnames[length(tabcolnames)])
120 # tabrownames<-as.numeric(rownames(tablecroise))
121 # #tabrownames<-c(tabrownames[(length(tabrownames)-1)],tabrownames[length(tabrownames)])
122 # for (k in (ncol(tablecroise)-1):ncol(tablecroise)) {
123 # for (l in (nrow(tablecroise)-1):nrow(tablecroise)) {
124 # croise[(tabrownames[l]-1),(tabcolnames[k]-1)]<-tablecroise[l,k]
130 croise <- croiseeff( matrix(ncol=tcl,nrow=tcl), classeuce1, classeuce2)
132 mincl<-round(nrow(classeuce1)/(nbt+1)) #valeur a calculer nbuce/nbt
134 #print('ATTENTION MINCL IMPOSE')
141 #print('ATTENTION : ON IMPOSE LA TAILLE DES CLASSES')
145 #tableau des chi2 signes
147 for (i in 1:nrow(croise)) {
148 for (j in 1:ncol(croise)) {
149 if (croise[i,j]==0) {
151 } else if (croise[i,j]<mincl) {
154 chitable<-matrix(ncol=2,nrow=2)
155 chitable[1,1]<-croise[i,j]
156 chitable[1,2]<-poids1[i]-chitable[1,1]
157 chitable[2,1]<-poids2[j]-chitable[1,1]
158 chitable[2,2]<-nrow(classeuce1)-poids2[j]-chitable[1,2]
159 chitest<-chisq.test(chitable,correct=FALSE)
160 if ((chitable[1,1]-chitest$expected)<0) {
161 chicroise[i,j]<--round(chitest$statistic,digits=7)
163 chicroise[i,j]<-round(chitest$statistic,digits=7)
170 #determination des chi2 les plus fort
171 chicroiseori<-chicroise
172 doxy <- function(chicroise) {
175 listxy <- which(chicroise > 3.84, arr.ind = TRUE)
177 val <- chicroise[which(chicroise > 3.84)]
178 ord <- order(val, decreasing = TRUE)
179 listxy <- listxy[ord,]
180 #for (i in 1:nrow(listxy)) {
181 # if ((!listxy[,2][i] %in% listx) & (!listxy[,1][i] %in% listy)) {
182 # listx <- c(listx, listxy[,2][i])
183 # listy <- c(listy, listxy[,1][i])
186 xy <- list(x = listxy[,2], y = listxy[,1])
189 xy <- doxy(chicroise)
197 # maxi[i]<-which.max(chicroise)
198 # chimax[i]<-chicroise[maxi[i]]
199 # chicroise[maxi[i]]<-0
201 # testpres<-function(x,listcoord) {
202 # for (i in 1:length(listcoord)) {
203 # if (x==listcoord[i]) {
211 # c.len=nrow(chicroise)
212 # r.len=ncol(chicroise)
217 # #on garde une valeur par ligne / colonne
218 # for (i in 1:length(maxi)) {
219 # #coordonnées de chi2 max
220 # x.co<-ceiling(maxi[i]/c.len)
221 # y.co<-maxi[i]-(x.co-1)*c.len
222 # a<-testpres(x.co,listx)
223 # b<-testpres(y.co,listy)
235 #pour ecrire les resultats
236 for (i in 1:length(listx)) {
237 txt<-paste(listx[i]+1,listy[i]+1,sep=' ')
238 txt<-paste(txt,croise[listy[i],listx[i]],sep=' ')
239 txt<-paste(txt,chicroiseori[listy[i],listx[i]],sep=' ')
243 #colonne de la classe
244 #trouver les filles et les meres
245 trouvefillemere<-function(classe,chd) {
246 unique(unlist(chd[chd[,classe%/%2]==classe,]))
249 #pour trouver une valeur dans une liste
250 #is.element(elem, list)
254 trouvecoordok<-function(first) {
259 listxp<-listx[first:length(listx)]
260 listxp<-c(listxp,listx[1:(first-1)])
261 # listxp<-listxp[-first]
262 listyp<-listy[first:length(listy)]
263 listyp<-c(listyp,listy[1:(first-1)])
264 # listyp<-listyp[-first]
265 for (i in 1:length(listxp)) {
266 if (!(listxp[i]+1)%in%fillemere1) {
267 if (!(listyp[i]+1)%in%fillemere2) {
268 coordok<-rbind(coordok,c(listyp[i]+1,listxp[i]+1))
269 fillemere1<-c(fillemere1,trouvefillemere(listxp[i]+1,chd2$n1))
270 fillemere2<-c(fillemere2,trouvefillemere(listyp[i]+1,chd1$n1))
276 #fonction pour trouver le nombre maximum de classes
277 findmaxclasse<-function(listx,listy) {
281 for (i in 1:length(listy)) {
283 coordok<-trouvecoordok(i)
284 if (maxcl <= nrow(coordok)) {
286 listcoordok[[nb]]<-coordok
290 listcoordok<-unique(listcoordok)
291 print('liste coord ok')
292 # print('FIXME FIXME FIXME FIXME FIXME')
294 #si plusieurs ensemble avec le meme nombre de classe, on conserve
295 #la liste avec le plus fort chi2
296 if (length(listcoordok)>1) {
299 for (i in 1:length(listcoordok)) {
302 if (nrow(listcoordok[[i]])==maxcl) {
303 for (j in 1:nrow(listcoordok[[i]])) {
304 chi<-c(chi,croise[(listcoordok[[i]][j,1]-1),(listcoordok[[i]][j,2]-1)])
305 uce<-c(uce,chicroiseori[(listcoordok[[i]][j,1]-1),(listcoordok[[i]][j,2]-1)])
308 if (maxchi < sum(chi)) {
316 print((suce/nrow(classeuce1)*100))
319 #findmaxclasse(listx,listy)
320 #coordok<-trouvecoordok(1)
321 coordok<-findmaxclasse(listx,listy)
324 fille<-function(classe,classeuce) {
325 listfm<-unique(unlist(classeuce[classeuce[,classe%/%2]==classe,]))
326 listf<-listfm[listfm>=classe]
332 lfilletot<-function(classeuce) {
334 for (classe in 1:nrow(coordok)) {
335 listfille<-unique(c(listfille,fille(coordok[classe,1],classeuce)))
340 listfille1<-lfilletot(classeuce1)
341 listfille2<-lfilletot(classeuce2)
344 #utiliser rownames comme coordonnees dans un tableau de 0
345 Assignclasse<-function(classeuce,x) {
346 nchd<-matrix(0,ncol=ncol(classeuce),nrow=nrow(classeuce))
347 for (classe in 1:nrow(coordok)) {
349 clnb<-coordok[classe,x]
351 tochange<-which(classeuce[,colnb]==clnb)
352 for (row in 1:length(tochange)) {
353 nchd[tochange[row],colnb:ncol(nchd)]<-classe
358 print('commence assigne new classe')
359 nchd1<-Assignclasse(classeuce1,1)
360 #nchd1<-Assignnewclasse(classeuce1,1)
361 nchd2<-Assignclasse(classeuce2,2)
362 print('fini assign new classe')
363 croisep<-matrix(ncol=nrow(coordok),nrow=nrow(coordok))
364 for (i in 1:nrow(nchd1)) {
365 if (nchd1[i,ncol(nchd1)]==0) {
366 nchd2[i,]<-nchd2[i,]*0
368 if (nchd1[i,ncol(nchd1)]!=nchd2[i,ncol(nchd2)]) {
369 nchd2[i,]<-nchd2[i,]*0
371 if (nchd2[i,ncol(nchd2)]==0) {
372 nchd1[i,]<-nchd1[i,]*0
376 elim<-which(nchd1[,ncol(nchd1)]==0)
377 keep<-which(nchd1[,ncol(nchd1)]!=0)
378 n1<-nchd1[nchd1[,ncol(nchd1)]!=0,]
379 n2<-nchd2[nchd2[,ncol(nchd2)]!=0,]
383 write.csv2(nchd1[,ncol(nchd1)],uceout)
384 res <- list(n1 = nchd1, coord_ok = coordok, cuce1 = classeuce1, chd = chd1)
387 #n1<-Rchdtxt('/home/pierre/workspace/iramuteq/corpus/agir2sortie01.csv','/home/pierre/workspace/iramuteq/corpus/testuce.csv','/home/pierre/workspace/iramuteq/corpus/testuceout.csv')