# croisements.r
# written by JuG
# August 05 2019
#' Do something
#' @author JuG
#' @description
#' @param numero.variable.dinteret
#' @param D
#' @param qualif
#' @param quantiF
#' @param affichage
#' @details
#' @examples
#'
#'
#' @return
#' @export
croisements<-function(numero.variable.dinteret,D,qualiF,quantiF,affichage=40){
tableaux.croises<-1
if(missing(quantiF)){nul<-0}else{if(length(quantiF)==1) {quantiF=c(quantiF,quantiF)}}
if(missing(qualiF)){nul<-0}else{if(length(qualiF)==1) {qualiF=c(qualiF,qualiF)}}
choix.de.sortie.R.1.LaTeX.2 <-1 # Choisir le format d'affichage des resultats
choix.entre.manuelle1.et.auto.2 <-2 # Choisir la reconnaissance automatique ou specification manuelle de la nature des variables
modalites.maximum <-7 # Modalites maximum des variables qualitatives (en automatique)
## Variable d'INTERET ###
ny<-numero.variable.dinteret
Y<-D[,ny]
if(!require('xtable')){install.packages('xtable')}
library(xtable)
if(!require('epitools')){install.packages('epitools')}
library(epitools)
choix<-choix.entre.manuelle1.et.auto.2
#*******\________Reconnaissance automatique_______/*******#
mod.max<-modalites.maximum
Factor<-VarNumeric<-0
nbvar<-length(D)
for(i in 1:nbvar)# Reconnaissance des facteurs et des numeriques
{ if(is.factor (D[,i])==TRUE){Factor <-c(Factor,i )}
if(is.numeric(D[,i])==TRUE){VarNumeric<-c(VarNumeric,i )}}
Factor <-Factor[2:(length(Factor))]
VarNumeric <-VarNumeric[2:(length(VarNumeric))]
Factinfseuil <-Factsupseuil<-0
if(sum(Factor,na.rm=TRUE)!=0){
for(i in 1:(length(Factor))){
if(nlevels(D[,Factor][,i])<=mod.max){Factinfseuil<-c(Factinfseuil ,Factor[i])}
if(nlevels(D[,Factor][,i])> mod.max){Factsupseuil<-c(Factsupseuil ,Factor[i])}}
Factinfseuil<-Factinfseuil[2:length(Factinfseuil)]
Factsupseuil<-Factsupseuil[2:length(Factsupseuil)]
}
NbNumeric<-length(D[,VarNumeric])
quanti<-quali<-0
for(i in 1:NbNumeric){
if(nlevels(as.factor(D[,VarNumeric][,i]))>mod.max){quanti<-c(quanti,VarNumeric[i])}
if(nlevels(as.factor(D[,VarNumeric][,i]))<=mod.max){quali<-c(quali ,VarNumeric[i])}}
quanti<-quanti[2:(length(quanti))]
quali<-quali[2:(length(quali))]
situation<-0
if(missing(quantiF)) # Distinguons volontairement le cas ou il n'y qu'une seule variable
{nul=0}else{
if(length(quantiF)==1){choix<-1;situation=5;quantitatives<-quantiF}
}
if(missing(qualiF)) # Distinguons volontairement le cas ou il n'y qu'une seule variable
{nul=0}else{
if(length(qualiF)==1){choix<-1;situation=6;qualitatives<-c(qualiF,qualiF)}
}
# Definition de 4 situations possibles:
# 1 : Rien n'est specifie, tout est auto
# 2 : juste quali est specifie
# 3 : juste quanti est specifie
# 4 : quali et quanti sont specifies
# 5 : une seule variable quantitative
# 6 : une seule variable qualitative
if(situation<5){
if(missing(quantiF)& missing(qualiF ) ){choix<-2; situation<-1}
else{
if(missing(quantiF)){choix<-1; qualitativesM <-qualiF ; quantitativesM <--1;situation<-2 }
else{
if(missing(qualiF )){choix<-1; quantitativesM<-quantiF; qualitativesM <--1; situation<-3 }
else{choix<-1;quantitativesM<-quantiF;qualitativesM <-qualiF;situation<-4}
}
}
if(choix==1){qualitatives<-qualitativesM;quantitatives<-quantitativesM}else{
if(choix==2){qualitatives<-quali;quantitatives<-quanti}else{stop("Erreur de choix")} }
autorisation<-rep(0,(length(Factinfseuil)))
for (i in 1:(length(Factinfseuil)))
if((is.na(Factinfseuil[i])==0) &(Factinfseuil[i]!=0)){autorisation[i]<-1}
if(situation==1){
if((sum(autorisation))==(length(autorisation))){qualitatives<-c(qualitatives,Factinfseuil)}
}
}
Affichage.Nombre.variables.quanti<-Affichage.Nombre.variables.quali<-0
if(situation==1){Affichage.Nombre.variables.quali<-(length(qualitatives)-1) ;Affichage.Nombre.variables.quanti<-length(quantitatives)}
if(situation==2){Affichage.Nombre.variables.quali<-(length(qualiF)) ;Affichage.Nombre.variables.quanti<-0}
if(situation==3){Affichage.Nombre.variables.quali<-0 ;Affichage.Nombre.variables.quanti<-length(quantiF)}
if(situation==4){Affichage.Nombre.variables.quali<-(length(qualiF)) ;Affichage.Nombre.variables.quanti<-length(quantiF)}
if(situation==5){Affichage.Nombre.variables.quali<-0 ;Affichage.Nombre.variables.quanti<-1}
if(situation==6){Affichage.Nombre.variables.quali<-1 ;Affichage.Nombre.variables.quanti<-0}
## CROISEMENTS ET TESTS ######
options(width=400)
if(tableaux.croises==1){
if((situation==1)|(situation==2)|(situation==4)|(situation==6)){
################################ VARIABLES QUALITATIVES ########################################
cat(noquote(" _____________________________________________________________\n"))
cat(noquote("/____________________________________________________________/|\n"))
cat(noquote("| ||\n"))
cat(noquote("| ||\n"))
cat(noquote("| ||\n"))
if(Affichage.Nombre.variables.quali>9){Affichage.espace.quali<-" ||"}else{Affichage.espace.quali<-" ||"}
titre<-paste("|"," VARIABLES QUALITATIVES","(",Affichage.Nombre.variables.quali,")",Affichage.espace.quali)
cat(noquote(titre));cat("\n")
cat(noquote("| ||\n"))
cat(noquote("| ||\n"))
cat(noquote("|____________________________________________________________|/\n"))
cat(noquote("\n"));
for(i in 1:(length(qualitatives))) {if(colnames(D[,qualitatives])[i]==colnames(D)[ny]) {numero<-i} else{numero<-0}}
for(i in 1:(length(qualitatives))) {
if(i!=numero){
LTABLE <-length(table(is.na(D[,qualitatives][,i])))
if((LTABLE==1) & (is.na(D[,qualitatives][,i][1])==1)) {VIDE<-1}else{VIDE<-0}
if(VIDE==0){
A <-table(Y,D[,qualitatives][,i]) ### Matrice des effectifs croises
colnames(A) <-c(paste(names(D[,qualitatives])[i],attr(table(D[,qualitatives][i]),"dimnames")[[1]]))
rownames(A) <-c(paste(names(D)[ny],attr(table(Y),"dimnames")$Y))
longueur.A <-sum(nchar(colnames(A)))
mat.separation.A <-cbind(matrix("",ncol=(affichage-longueur.A),nrow=2),c("|","|"),c("","")) ### De quoi faire de l'affichage propre
Nbcolonnes <-length(colnames(A))
Nblignes <-length(rownames(A))
Alig <-A;for(k in 1:Nblignes){Alig[k,]<-round(A[k,]/sum(A[k,]),3)} ### Matrice des effectifs en ligne
colnames(Alig) <-c(paste(attr(table(D[,qualitatives][i]),"dimnames")[[1]],"%lign"))
Acol <-A;for(m in 1:Nbcolonnes){Acol[,m]<-round(A[,m]/sum(A[,m]),3)} ### Matrice des pourcentages en colonne
colnames(Acol) <-c(paste(attr(table(D[,qualitatives][i]),"dimnames")[[1]],"%col"))
Atot <-round(A/sum(A),3);colnames(Atot)<-c(paste(attr(table(D[,qualitatives][i]),"dimnames")[[1]],"%tot")) ### Matrice des pourcentages totaux
colnames(Atot) <-c(paste(attr(table(D[,qualitatives][i]),"dimnames")[[1]],"%tot"))
Vecteur.separation <-noquote(matrix(c("|","|"),nrow=2))
Acomp <-noquote(cbind(A,mat.separation.A,Alig,c(" "),Vecteur.separation,c(" "),Acol,c(" "),Vecteur.separation,c(" "),Atot))
if(length(A)>4){Acomp<-list(Tableau=A,Pourcentages.lignes=Alig,Pourcentages.colonnes=Acol,Pourcentages.total=Atot)} ### Condition pour voir si c'est pas trop long
### Sinon reprendre dans une autre ligne
p <-chisq.test(A)$p.value;p2<-try(fisher.test(A)$p.value,silent = TRUE)
OR <-try(fisher.test(A)$estimate,silent=TRUE)
if(length(A)==4){
if((OR>=try(fisher.test(A)$conf.int[1],silent=TRUE))&(OR<=try(fisher.test(A)$conf.int[2],silent=TRUE)))
{ORCI<-c(try(fisher.test(A)$conf.int[1],silent=TRUE),try(fisher.test(A)$conf.int[2],silent=TRUE))}
if((OR<try(fisher.test(A)$conf.int[1],silent=TRUE))|(OR>try(fisher.test(A)$conf.int[2],silent=TRUE)))
{ORCI<-unname(oddsratio(A)$measure[2,][2:3])}
OR <-round(OR,digits<-3);ORCI<-round(ORCI,digits=3)
conjonction<-"dans ["
}
if(length(A)!=4) {
OR <- "Non_calculable"
ORCI <- vector("character",2) #c("","")
conjonction <- c(" Probleme_taille")
}
### Condition, si la matrice n'est pas carree
### Alors l'OR n'est pas defini.
if(p<0.05 ){ p <-paste(round(p ,2)," ***")} else{p <-round(p,2 )} ### Affichage des etoiles si le test est signif
if(is.numeric(p2)){if(p2<0.05 ){p2 <-paste(round(p2,2)," ***")} else{p2<-round(p2,2)}}else{p2<-"NA"}
if(choix.de.sortie.R.1.LaTeX.2==1){print(Acomp); ### Affichage des resultats des tests
R <-noquote(paste("Test d'homogeneite du Chi-2 ",p))
R3 <-noquote(paste("Rapport de Cotes: ",OR,conjonction,ORCI[1],",",ORCI[2],"]"))
R2 <-noquote(paste("Test d'homogeneite Fisher exact ",p2))
R <-rbind(R,R2,R3)
colnames(R) <-c("")
rownames(R) <-c("","","")
print(noquote(R))
cat(noquote(" \n"));cat(noquote("____________________________________________________________\n"));cat(noquote(" \n"))}
if(choix.de.sortie.R.1.LaTeX.2==2){print(xtable(A,caption=paste("Chi2",round(p,3),"/","Fisher",try(round(p2,3),silent=TRUE))))}
}else{
Affich<-c(names(D[,qualitatives])[i],"--> Vecteur de MANQUANTS")
print("");print("");print("");print("");print("")
print(Affich)
print("__________________________________________________")
print("");print("");print("");print("");print("")
}}}}
################################ VARIABLES QUANTITATIVES ########################################
if(situation==5){quantitatives<-c(quantitatives,quantitatives)}
nam<-names(D[,quantitatives])
Nquant<-length(quantitatives)
nbr.mod.rep<-length(attr(table(Y),"dimnames")$Y)
modalites.rep<-as.numeric(attr(table(Y),"dimnames")$Y)
moyenne <-variance<-mini<-NN<-NAA<-maxi<-mediane<-ecarttype<-quant025<-quant975<-rep(NA,nbr.mod.rep)
if((situation==1)|(situation==3)|(situation==4)|(situation==5)){
# Question d'affichage
cat(noquote(" _____________________________________________________________\n"))
cat(noquote("/____________________________________________________________/|\n"))
cat(noquote("| ||\n"))
cat(noquote("| ||\n"))
cat(noquote("| ||\n"))
if(Affichage.Nombre.variables.quanti>9){Affichage.espace<-" ||"}else{Affichage.espace<-" ||"}
titre<-paste("|"," VARIABLES QUANTITATIVES","(",Affichage.Nombre.variables.quanti,")",Affichage.espace)
cat(noquote(titre));cat(noquote("\n"))
cat(noquote("| ||\n"))
cat(noquote("| ||\n"))
cat(noquote("|____________________________________________________________|/\n"))
cat(noquote("\n"));
borne<-Nquant
if(situation==5){borne=Nquant-1}
for(i in 1:borne)
{
for(j in 1:2)
{
NAA[j] <-sum(is.na( D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[j]]))
NN[j] <-length( D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[j]])-NAA[j]
moyenne[j] <-round(mean( D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[j]],na.rm=TRUE),3) # Calcul des statistiques desriptives appropriees
mediane[j] <-round(median( D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[j]],na.rm=TRUE),3)
variance[j] <-round(var ( D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[j]],na.rm=TRUE),3)
ecarttype[j]<-round(sd ( D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[j]],na.rm=TRUE),3)
mini[j] <-round(min ( D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[j]],na.rm=TRUE),3)
maxi[j] <-round(max ( D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[j]],na.rm=TRUE),3)
quant025[j] <-round(quantile ( D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[j]],na.rm=TRUE,prob=0.025),3)
quant975[j] <-round(quantile ( D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[j]],na.rm=TRUE,prob=0.975),3)}
A<-cbind(NN,round((NN/(sum(NN))),2),NAA,moyenne,variance,ecarttype,mini,maxi,mediane,quant025,quant975)
colnames(A) <-c("N","% ","NA","moyenne","variance","sd","min","max","med","q_2.5%","q_97.5%")
rownames(A) <-c(paste(names(D)[ny],attr(table(Y),"dimnames")$Y))
LT1 <-length(table(is.na(D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[1]]))) # Verifier la condition, l'un des deux vecteurs est nul
LT2 <-length(table(is.na(D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[2]])))
if(((LT2==1)&(is.na(D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[2]][1]==TRUE)))|((LT1==1)&(is.na(D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[1]][1]==TRUE))))
{p<-"MANQUANTS";p2<-"MANQUANTS"}
else{
p <- try(t.test (D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[1]],D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[2]])$p.value,silent=TRUE)
p2 <- try(wilcox.test (D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[1]],D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[2]])$p.value,silent=TRUE)
p.norm.1 <- try(shapiro.test(D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[1]])$p.value,silent=TRUE)
p.norm.2 <- try(shapiro.test(D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[2]])$p.value,silent=TRUE)
p3 <-round(try(var.test (D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[1]],D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[2]])$p.value,silent=TRUE),2)
p4 <-round(try(ansari.test (D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[1]],D[,quantitatives][,i][Y==attr(table(Y),"dimnames")$Y[2]])$p.value,silent=TRUE),2)
if((p.norm.1>0.05) & (p.norm.2>0.05)){normalite<-"Acceptee 2/2"}
if((p.norm.1>0.05) & (p.norm.2<0.05)){normalite<-"Rejetee 1/2"}
if((p.norm.1<0.05) & (p.norm.2>0.05)){normalite<-"Rejetee 1/2"}
if((p.norm.1<0.05) & (p.norm.2<0.05)){normalite<-"Rejetee 0/2"}}
if(p<0.05 ){ p <-paste(round(p,2)," ***")} else{p<-round(p,2)}
if(p2<0.05 ){p2<-paste(round(p2,2)," ***")}else{p2<-round(p2,2)}
if(p3<0.05 ){p3<-paste(round(p3,2)," '''")}else{p3<-round(p3,2)}
if(p4<0.05 ){p4<-paste(round(p4,2)," '''")}else{p4<-round(p4,2)}
if((p!="MANQUANTS")&(p2!="MANQUANTS")) {V0 =noquote(cbind(nam[i]," ",normalite))} # Affichage des resultats
if((p!="MANQUANTS")&(p2!="MANQUANTS")) {V =noquote(rbind(paste("Egalite des moyennes : Test de Student ",p),paste("Comparaison distributions: Test de MW.Wilcoxon",p2)))}else{V=cbind("Prob de manquants",p,"Prob de manquants",p2)} # Affichage des resultats
if((p!="MANQUANTS")&(p2!="MANQUANTS")) {V2 =noquote(rbind(paste("Egalite des variances: Test de Fisher ",p3), paste("Egalite des variances: Test de Ansari ",p4)))}
colnames(V0)=c("Variable","","Normalite echantillons")
rownames(V0)=c("")
V<-noquote(rbind(V,V2))
colnames(V)<-c("")
rownames(V)<-c("","","","")
if(choix.de.sortie.R.1.LaTeX.2==1){print(A);print(V0); print(V);cat(noquote(" \n"));cat(noquote("____________________________________________________________\n"));cat(noquote(" \n"));cat(noquote(" \n"))}
if(choix.de.sortie.R.1.LaTeX.2==2){print(xtable(A,caption=paste(nam[i],"/","t.test",round(p,2),"/","Wilcoxon",round(p2,2))))}
}}
}
options(width=80)
cat("**************************** FINI ************************************************\n")
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.