+++ /dev/null
-#library(ca)
-#library(MASS)
-#source('/home/pierre/workspace/iramuteq/Rscripts/afc.R')
-#data<-read.table('output/corpus_bin.csv',header=TRUE,sep='\t')
-source('/home/pierre/workspace/iramuteq/Rscripts/anacor.R')
-
-CHD<-function(data,x=9){
- dataori=data
- dtable=data
- listcol<-list()
- listmere<-list()
- a<-0
- print('vire colonnes vides en entree')#FIXME : il ne doit pas y avoir de colonnes vides en entree !!
- for (m in 1:length(dtable)) {
- if (sum(dtable[m-a])==0) {
- print('colonne vide')
- dtable<-dtable[,-(m-a)]
- a<-a+1
- }
- }
- for (i in 1:x) {
- clnb<-(i*2)
- listmere[[clnb]]<-i
- listmere[[clnb+1]]<-i
- listcol[[clnb]]<-vector()
- listcol[[clnb+1]]<-vector()
- #extraction du premier facteur de l'afc
- print('afc')
- #afc<-ca(dtable,nd=1)
- #afc<-corresp(dtable,nd=1)
- #afc<-fca(dtable)
- afc<-boostana(dtable,nd=1)
- #coordonnees des colonnes sur le premier facteur
- #coordrow=afc$rowcoord
- #coordrow=as.matrix(afc$rscore)
- #coordrow<-as.matrix(afc$rproj[,1])
- coordrow<-as.matrix(afc$row.scores)
- #row.names(coordrow)<-afc$rownames
- row.names(coordrow)<-rownames(dtable)
- #classement en fonction de la position sur le premier facteur
- #listclasse<-ifelse(coordrow<0,paste('CLASSE',clnb,sep=''),paste('CLASSE',clnb+1,sep=''))
-
- print('deb recherche meilleur partition')
- coordrow<-as.matrix(coordrow[order(coordrow[,1]),])
- #print(rownames(coordrow))
- zeropoint<-which.min(abs(coordrow))
- print(zeropoint)
- g<-length(coordrow[coordrow[,1]<coordrow[zeropoint]])
- d<-length(coordrow[coordrow[,1]>coordrow[zeropoint]])
- prct<-1
- g<-round(g*prct)
- d<-round(d*prct)
- print(g)
- print(d)
- temptable<-as.matrix(coordrow[(zeropoint-g):(zeropoint+d)])
- row.names(temptable)<-rownames(coordrow)[(zeropoint-g):(zeropoint+d)]
- #print(temptable)
- missing<-zeropoint-g
- listchi<-vector()
- chtable<-matrix(0,2,(ncol(dtable)))
- totforme<-chtable[1,]
- for (forme in 1:(ncol(dtable))) {
- totforme[forme]<-sum(dtable[,forme])
- }
- chtable[2,]<-totforme
- for (l in 1:length(temptable)) {
- # print(rownames(temptable)[l])
- linetoswitch=as.matrix(dtable[rownames(temptable)[l],])
- # print(linetoswitch)
- chtable[1,]<-chtable[1,]+linetoswitch
- chtable[2,]<-chtable[2,]-linetoswitch
- valchi<-chisq.test(chtable)$statistic
- if (is.na(valchi)){
- valchi<-0
- }
- listchi<-append(listchi,valchi)
- }
- #listchi<-listchi[!is.na(listchi)]
- maxchi<-which(listchi==max(listchi))
- print(max(listchi))
- print(maxchi)
- maxchi<-maxchi+missing
- #print(listchi)
- #listclasse
- print('liste classe')
- print(coordrow[(maxchi)])
- listclasse<-ifelse(coordrow<=coordrow[(maxchi)],clnb,clnb+1)
-# listclasse<-ifelse(coordrow<0,clnb,clnb+1)
- listchi<-as.matrix(listchi)
- listchi<-cbind(listchi,temptable)
- filename<-paste('graphechi',as.character(i))
- filename<-paste(filename,'.jpeg')
- jpeg(filename)
- plot(listchi[,1]~listchi[,2])
- abline(v=0)
- print(coordrow[zeropoint-g])
- abline(v=coordrow[zeropoint-g])
- abline(v=coordrow[zeropoint+d])
- abline(v=coordrow[(maxchi)])
- dev.off()
-
- #ajout du classement au tableau
- dtable<-transform(dtable,cl1=listclasse)
-
- #calcul de la specificite des colonnes
- t1<-dtable[dtable$cl1==clnb,]
- t2<-dtable[dtable$cl1==clnb+1,]
-
- for (k in 1:(ncol(dtable)-1)) {
- t<-matrix(0,2,2)
- t[1,1]<-sum(t1[,k])
- t[1,2]<-sum(t2[,k])
- t[2,1]<-nrow(t1)-t[1,1]
- t[2,2]<-nrow(t2)-t[1,2]
- chi<-chisq.test(t)
- if (chi$statistic>6){#FIXME : valeur a mettre en option base :2.7
- if (chi$expected[1,1]<t[1,1]){
- listcol[[clnb+1]]<-append(listcol[[clnb+1]],k)
- } else {
- listcol[[clnb]]<-append(listcol[[clnb]],k)
- }
- }
- }
-
- #lignes concernees
- listrownamedtable<-rownames(dtable)
- listrownamedtable<-as.integer(listrownamedtable)
- newcol<-vector(length=nrow(dataori))
- #remplissage de la nouvelle colonne avec les nouvelles classes
- print('remplissage')
- num<-0
- for (ligne in listrownamedtable) {
- num<-num+1
- newcol[ligne]<-as.vector(dtable$cl1[num])[1]
- }
- #recuperation de la classe precedante pour les cases vides
- print('recuperation classes precedentes')
- matori<-as.matrix(dataori)
- if (i!=1) {
- # options(warn=-1)
- for (ligne in 1:length(newcol)) {
- # print(newcol[ligne])
- if (newcol[ligne]==0) { # ce test renvoie un warning
- newcol[ligne]<-matori[ligne,length(matori[1,])]
- }
- }
- # options(warn=0)
- }
- #???????????????????????????????????
- #je ne comprends pas : j'ai vraiment besoin de faire ces deux actions pour ajouter la nouvelle colonne aux donnees ?
- #si je ne le fais pas, ca plante...
- dataori<-cbind(dataori,newcol)
- dataori<-transform(dataori,newcol=newcol)
- #???????????????????????????????????
-
- #liste des noms de colonne
- #colname<-colnames(dataori)
- #nom de la derniere colonne
- #colname<-colname[length(dataori)]
- #la derniere colonne
- colclasse<-as.character(dataori[,ncol(dataori)])
- #print(colclasse)
- #les modalites de la derniere colonne
- classes<-levels(as.factor(colclasse))
- print(classes)
- #determination de la classe la plus grande
- tailleclasse<-paste(NULL,1:length(classes))
- b<-0
- for (classe in classes) {
- b<-b+1
- dtable<-dataori[dataori[length(dataori)]==classe,]
- tailleclasse[b]<-length(dtable[,1])
- }
- tailleclasse<-as.integer(tailleclasse)
- print(tailleclasse)
- plusgrand<-which(tailleclasse==max(tailleclasse))
-
- #???????????????????????????????????
- #Si 2 classes ont des effectifs egaux, on prend la premiere de la liste...
- if (length(plusgrand)>1) {
- plusgrand<-plusgrand[1]
- }
- #????????????????????????????????????
-
- #constuction du prochain tableau a analyser
- print('construction tableau suivant')
- classe<-classes[plusgrand]
- dtable<-dataori[dataori[length(dataori)]==classe,]
- dtable<-dtable[,1:(length(dtable)-i)]
-
-
- listcolelim<-listcol[[as.integer(classe)]]
- mother<-listmere[[as.integer(classe)]]
- while (mother!=1) {
- listcolelim<-append(listcolelim,listcol[[mother]])
- print(listcolelim)
- mother<-listmere[[mother]]
- }
-
- listcolelim<-sort(unique(listcolelim))
- print(listcolelim)
- print('avant')
- print(ncol(dtable))
- if (!is.logical(listcolelim)){
- print('elimination colonne')
- a<-0
- for (col in listcolelim){
- dtable<-dtable[,-(col-a)]
- a<-a+1
- }
- }
- print('apres')
- print(ncol(dtable))
- #elimination des colonnes ne contenant que des 0
- print('vire colonne vide dans boucle')
- a<-0
- for (m in 1:ncol(dtable)) {
- if (sum(dtable[,m-a])==0) {
- dtable<-dtable[,-(m-a)]
- a<-a+1
- }
- }
- #elimination des lignes ne contenant que des 0
-# print('vire ligne vide dans boucle')
-# a<-0
-# for (m in 1:nrow(dtable)) {
-# if (sum(dtable[m-a,])==0) {
-# print('ligne vide')
-# dtable<-dtable[-(m-a),]
-# a<-a+1
-# }
-# }
- }
- dataori[(length(dataori)-x+1):length(dataori)]
-}
-
-#dataout<-CHD(data,9)
-
-#library(cluster)
-#dissmat<-daisy(dataout, metric = 'gower', stand = FALSE)
-#chd<-diana(dissmat,diss=TRUE,)
-
-
-#pour tester le type, passer chaque colonne en matice et faire mode(colonne)
-#for (i in 1:13) {tmp<-as.matrix(data[i]);print(mode(tmp))}