X-Git-Url: http://iramuteq.org/git?p=iramuteq;a=blobdiff_plain;f=tabchi2.py;h=422b44735d1facb7f79f9156cf3068cfea561c47;hp=6a8cf550460d44717147356c65b3f72c52978625;hb=fd5ed5e9fe3c56891bcd819e6b66a173f44e2124;hpb=22cd27b2bbe9ab1ffa7ef06fa764b5147ae17dad diff --git a/tabchi2.py b/tabchi2.py index 6a8cf55..422b447 100755 --- a/tabchi2.py +++ b/tabchi2.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- #Author: Pierre Ratinaud #Copyright (c) 2010 Pierre Ratinaud -#Lisense: GNU/GPL +#License: GNU/GPL import HTML import os @@ -16,6 +16,7 @@ import wx.lib.sized_controls as sc from time import sleep from functions import exec_rcode, check_Rresult from dialog import ChiDialog, PrefChi +from analysematrix import AnalyseMatrix def make_res(line) : if float(line[5]) <= 0.05 and line[6] != 'warning': @@ -45,11 +46,21 @@ def make_title(res, text) : return ['
%s
retour
' % (i, val[-1], text[i], i) for i, val in enumerate(res)] - +chioption = { 'valobs' : True, + 'valtheo' : True, + 'resi' : False, + 'contrib' : True, + 'pourcent' : False, + 'pourcentl' : True, + 'pourcentc' : True, + 'graph' : True, + 'bw' : False, + } class MakeChi2(): - def __init__(self, parent, select1, select2, chioption): + def __init__(self, parent, select1, select2, chioption, tableau): + self.tableau = tableau self.OutFrame=tempfile.mktemp(dir=parent.TEMPDIR) print self.OutFrame self.parent=parent @@ -59,7 +70,7 @@ class MakeChi2(): self.TextCroise=[] for i in select1 : for j in select2 : - self.TextCroise.append(parent.tableau.colnames[i] + ' / ' + parent.tableau.colnames[j]) + self.TextCroise.append(self.tableau.colnames[i] + ' / ' + self.tableau.colnames[j]) rchioption = {} for val in chioption : if chioption[val]: @@ -88,11 +99,11 @@ class MakeChi2(): bw <- %s """ % (rchioption['valobs'], rchioption['valtheo'], rchioption['contrib'], rchioption['resi'], rchioption['pourcent'], rchioption['pourcentl'], rchioption['pourcentc'], rchioption['graph'], rchioption['bw']) txt+=""" - datadm <- ReadData("%s", encoding="%s", header = TRUE, sep = "%s",quote = '%s', na.strings = "%s",rownames= 1) + datadm <- read.csv2("%s", encoding="%s", header = TRUE, row.names = 1, sep='\\t', quote = '"', na.string = '') listres<-list() listcol<-list() cont<-1 - """%(ffr(parent.tableau.parametre['csvfile']),self.parent.encode, parent.tableau.parametre['colsep'], parent.tableau.parametre['txtsep'], self.parent.nastrings) + """%(ffr(self.tableau.parametres['csvfile']), self.tableau.parametres['syscoding']) if len(select1)==1: strsel1=str(select1).replace(',','') else: @@ -148,9 +159,7 @@ class MakeChi2(): chi$prl <- round((chi$observed/sr)*100,2) chi$prc <- t(round((t(chi$observed)/sc)*100,2)) } - fileout<-paste('histo',%i,sep='') - fileout<-paste(fileout,'_',sep='') - fileout<-paste(fileout,count,sep='') + fileout<-paste('histo_',count,sep='') fileout<-paste(fileout,'.png',sep='') count<-count+1 fileout<-file.path("%s",fileout) @@ -258,7 +267,7 @@ class MakeChi2(): li<-matrix('fin_analyse',1,maxcol) frameout<-rbind(frameout,li) write.csv2(frameout,file="%s") - """%(parent.FreqNum,ffr(parent.TEMPDIR),ffr(self.OutFrame)) + """ % (ffr(parent.TEMPDIR),ffr(self.OutFrame)) tmpfile=tempfile.mktemp(dir=self.TEMPDIR) print tmpfile tmpscript=open(tmpfile,'w') @@ -350,77 +359,381 @@ class MakeChi2(): txt = '


\n'.join(['

'.join([tab[i] for tab in allhtml]) for i,val in enumerate(res)]) txt = header + pretxt + txt + '\n' - fileout=os.path.join(self.TEMPDIR,'resultats-chi2_%s.html'%str(self.parent.FreqNum)) - file=open(fileout,'w') - file.write(txt) - file.close() + fileout=os.path.join(self.parametres['pathout'],'resultats-chi2.html') + with open(fileout, 'w') as f : + f.write(txt) ListFile.append(fileout) return ListFile -class ChiSquare(): - def __init__(self,parent): - chioption = { 'valobs' : True, - 'valtheo' : True, - 'resi' : False, - 'contrib' : True, - 'pourcent' : False, - 'pourcentl' : True, - 'pourcentc' : True, - 'graph' : True, - 'bw' : False, - } - dlg = ChiDialog(parent, -1, u"Chi2", chioption, size=(400, 350), +class ChiSquare(AnalyseMatrix): + def doparametres(self, dlg = None): + if dlg is None : + return + dial = ChiDialog(self.parent, -1, u"Chi2", chioption, self.tableau, size=(400, 350), style = wx.DEFAULT_DIALOG_STYLE ) - dlg.CenterOnParent() - val = dlg.ShowModal() - if val==wx.ID_OK : - self.dlg=wx.ProgressDialog("Traitements", - "Veuillez patienter...", - maximum = 4, - parent=parent, - style = wx.PD_APP_MODAL|wx.PD_AUTO_HIDE|wx.PD_ELAPSED_TIME - ) - self.dlg.Center() + dial.CenterOnParent() + val = dial.ShowModal() + if val==wx.ID_OK : + dlg.Center() self.count = 1 - keepGoing = self.dlg.Update(self.count) + keepGoing = dlg.Update(self.count) - ColSel1 = dlg.list_box_1.GetSelections() - ColSel2 = dlg.list_box_2.GetSelections() - if dlg.chiopt : - chioption['valobs'] = dlg.dial.check1.GetValue() - chioption['valtheo'] = dlg.dial.check2.GetValue() - chioption['resi'] = dlg.dial.check3.GetValue() - chioption['contrib'] = dlg.dial.check4.GetValue() - chioption['pourcent'] = dlg.dial.check5.GetValue() - chioption['pourcentl'] = dlg.dial.check6.GetValue() - chioption['pourcentc'] = dlg.dial.check7.GetValue() - chioption['graph'] = dlg.dial.check8.GetValue() - chioption['bw'] = dlg.dial.checkbw.GetValue() - dlg.dial.Destroy() + self.colsel1 = dial.list_box_1.GetSelections() + self.colsel2 = dial.list_box_2.GetSelections() + if dial.chiopt : + chioption['valobs'] = dial.dial.check1.GetValue() + chioption['valtheo'] = dial.dial.check2.GetValue() + chioption['resi'] = dial.dial.check3.GetValue() + chioption['contrib'] = dial.dial.check4.GetValue() + chioption['pourcent'] = dial.dial.check5.GetValue() + chioption['pourcentl'] = dial.dial.check6.GetValue() + chioption['pourcentc'] = dial.dial.check7.GetValue() + chioption['graph'] = dial.dial.check8.GetValue() + chioption['bw'] = dial.dial.checkbw.GetValue() + dial.dial.Destroy() + dial.Destroy() + self.parametres.update(chioption) + self.chioption = chioption + else : + if dial.chiopt : + dial.dial.Destroy() + dial.Destroy() + self.parametres = None - self.count += 1 - keepGoing = self.dlg.Update(self.count,u"Analyse dans R...") - analyse=MakeChi2(parent,ColSel1,ColSel2, chioption) + def doanalyse(self): + + + #self.dlg=wx.ProgressDialog("Traitements", + # "Veuillez patienter...", + # maximum = 4, + # parent=parent, + # style = wx.PD_APP_MODAL|wx.PD_AUTO_HIDE|wx.PD_ELAPSED_TIME + # ) + + - self.count += 1 - keepGoing = self.dlg.Update(self.count,u"Ecriture des résultats") + self.count += 1 + keepGoing = self.dlg.Update(self.count,u"Analyse dans R...") + #analyse=MakeChi2(self.parent, self.colsel1, self.colsel2, self.chioption, self.tableau) + #self.tableau = tableau + self.OutFrame=tempfile.mktemp(dir=self.parent.TEMPDIR) + print self.OutFrame + #self.parent=parent + self.encode=self.parent.encode + self.TEMPDIR=self.parent.TEMPDIR + self.RPath=self.parent.PathPath.get('PATHS','rpath') + self.TextCroise=[] + for i in self.colsel1 : + for j in self.colsel2 : + self.TextCroise.append(self.tableau.colnames[i] + ' / ' + self.tableau.colnames[j]) + rchioption = {} + for val in self.chioption : + if self.chioption[val]: + rchioption[val] = 'TRUE' + else : + rchioption[val] = 'FALSE' + txt=""" + source("%s") + """%self.parent.RscriptsPath['Rfunct'] +# if parent.tableau.: rownames=1 +# else : rownames='NULL' +# if parent.g_header : header = 'TRUE' +# else : header = 'FALSE' + txt += """ + source("%s") + """ % ffr(self.parent.RscriptsPath['Rgraph']) + txt += """ + doobs <- %s + doexp <- %s + docontrib <- %s + doresi <- %s + dopr <- %s + doprl <- %s + doprc <- %s + dograph <- %s + bw <- %s + """ % (rchioption['valobs'], rchioption['valtheo'], rchioption['contrib'], rchioption['resi'], rchioption['pourcent'], rchioption['pourcentl'], rchioption['pourcentc'], rchioption['graph'], rchioption['bw']) + txt+=""" + datadm <- read.csv2("%s", encoding="%s", header = TRUE, row.names = 1, sep='\\t', quote = '"', na.string = '') + listres<-list() + listcol<-list() + cont<-1 + """%(ffr(self.tableau.parametres['csvfile']), self.tableau.parametres['syscoding']) + if len(self.colsel1)==1: + strsel1=str(self.colsel1).replace(',','') + else: + strsel1=str(self.colsel1) + if len(self.colsel2)==1: + strsel2=str(self.colsel2).replace(',','') + else: + strsel2=str(self.colsel2) + txt+=""" + for (i in c%s) {""" % strsel1 + txt+=""" + for (j in c%s) {""" % strsel2 + txt+=""" + tab<-table(datadm[,i+1],datadm[,j+1]) + if (min(dim(tab)) != 1) { + chi<-chisq.test(tab) + CS<-colSums(tab) + RS<-rowSums(tab) + GT<-sum(tab) + chi$contrib<-(tab-chi$expected)/sqrt(chi$expected * ((1 - RS/GT) %%*%% t(1 - CS/GT))) + listres[[cont]]<-chi + listcol[[cont]]<-ncol(tab) + cont<-cont+1 + } else { + chi <- list(observed = tab, residuals = tab, contrib = tab, statistic = 0, p.value = 1, expected = tab, message = 'pas de calcul') + listres[[cont]] <- chi + listcol[[cont]]<-ncol(tab) + cont <- cont + 1 + } + } + } + maxcol<-max(unlist(listcol))+1 + if (maxcol<7) {maxcol<-7} + frameout<-matrix('*',1,maxcol) + count<-0 + for (chi in listres) { + if (min(chi$expected)<5) { + att<-"warning" + } else { + att<-"" + } + if ('message' %%in%% attributes(chi)$names) { + att <- "Ce chi2 n\'a pas été calculé" + nom_colresi<-colnames(chi$observed) + chi$prl <- chi$expected + chi$prc <- chi$expected + st <- sum(chi$observed) + } else { + nom_colresi<-colnames(chi$observed) + st <- sum(chi$observed) + sc <- colSums(chi$observed) + sr <- rowSums(chi$observed) + chi$prl <- round((chi$observed/sr)*100,2) + chi$prc <- t(round((t(chi$observed)/sc)*100,2)) + } + fileout<-paste('histo_',count,sep='') + fileout<-paste(fileout,'.png',sep='') + count<-count+1 + fileout<-file.path("%s",fileout) + if (max(nchar(colnames(chi$observed)))>15) { + leg <- 1:length(colnames(chi$observed)) + } else { + leg <- colnames(chi$observed) + } + if (dograph) { + width<-ncol(chi$observed)*100 + if (width < 350) {width <- 350} + open_file_graph(fileout,width = width, height = 300) + par(mar=c(0,0,0,0)) + layout(matrix(c(1,2),1,2, byrow=TRUE),widths=c(3,1)) + par(mar=c(2,2,1,0)) + par(cex=0.8) + if (!bw) colors <- rainbow(length(rownames(chi$observed))) + else colors <- gray.colors(length(rownames(chi$observed))) + barplot(chi$prl,names.arg = leg, beside=TRUE,border=NA, col=colors) + par(mar=c(0,0,0,0)) + par(cex=0.8) + plot(0, axes = FALSE, pch = '') + legend(x = 'center' , rownames(chi$observed), fill = colors) + dev.off() + } + chi$prl <- cbind(chi$prl, total = rowSums(chi$prl)) + chi$prc <- rbind(chi$prc, total = colSums(chi$prc)) + chi$observed<-rbind(chi$observed,total=colSums(chi$observed)) + chi$observed<-cbind(chi$observed,total=rowSums(chi$observed)) + chi$pr <- round((chi$observed/st)*100,2) + chi$expected<-rbind(chi$expected,total=colSums(chi$expected)) + chi$expected<-cbind(chi$expected,total=rowSums(chi$expected)) + chi$expected<-round(chi$expected,digits=2) + chi$residuals<-round(chi$residuals,digits=2) + chi$contrib<-round(chi$contrib, digits=2) + nom_col<-colnames(chi$observed) + + if (ncol(chi$observed)\n + \n + \n +

Test du Chi2

\n +
+
+ Légende :
+ p <= 0.05
+ p <= 0.05 mais il y a des valeurs théoriques < 5
+ p > 0.05 +


+ """%self.parent.SysEncoding + + + pretxt = '
\n'.join(links)+'


\n' + txt = '


\n'.join(['

'.join([tab[i] for tab in allhtml]) for i,val in enumerate(res)]) + txt = header + pretxt + txt + '\n' + + fileout=os.path.join(self.parametres['pathout'],'resultats-chi2.html') + with open(fileout, 'w') as f : + f.write(txt) + ListFile.append(fileout) + return ListFile \ No newline at end of file