olivier godechot

Une fonction pour simplifier les tableaux sous R



Je vous ai présenté il y a quelques temps les techniques pour avoir un tableau avec des pourcentages en ligne (ou en colonne), des marges et les effectifs. L'écriture était un peu lourde. On peut tout simplifier grâce aux fonctions. En voici une de ma composition qui fait tout en un et encore plus : simplefreq ! (Il suffit de soumettre à R le code ci-dessous pour pouvoir s'en servir).


Description



simplefreq fait soit un tableau de fréquence simple avec effectif et pourcentage, soit un tableau croisé avec pourcentage en ligne ou en colonne, marge, effectifs.

simplefreq calcule aussi le chi2.

Elle offre en outre deux outils d'exploration de tableaux. Le "Mining Chi-square" et le "Mining Odds Ratio". Ces statistiques correspondent pour la modalité ij au Chi2 et à l'Odds Ratio d'un tableau 2*2 avec comme catégories en ligne [i,-i] et en colonne [j,-j] - où -i désigne les modalités non i (ou autres que i). Ceci permet de mesurer la significativité et l'intensité de la liaison entre deux modalités.


Usage



simplefreq (x,y=NULL,margin=1,html=NULL)

Arguments



x : la variable en ligne

y : la variable en colonne

margin : par défaut, elle vaut 1 pour le pourcentage en ligne. Mettre margin=2 pour le pourcentage en colonne.

html : Le nom d'un fichier html dans lequel la fonction copie les tableaux sous un mode joli (directement copiable dans un tableur comme OpenOffice Calc ou Excel). Cet argument nécessite l'installation du package R2HTML.


Exemples



#Tableau simple
z<-simplefreq(he$CHIEN)

#Tableau simple et sortie vers un fichier html
z<-simplefreq(he$CHIEN,html="c:/monfichier.html")

#Tableau croisé avec pourcentage en ligne
z<-simplefreq(he$CSEX,he$CDIP)

#Tableau croisé avec pourcentage en colonne
z<-simplefreq(he$CDIP,he$CSEX,margin=2)

#Tableau croisé avec pourcentage en colonne
# et sortie vers un fichier html
z<-simplefreq(he$CDIP,he$CSEX,margin=2,html="c:/monfichier.html")


Code


Et voici le code de la fonction. Il suffit de le soumettre une fois lorsqu'une session R est lancée. La fonction est alors stockée en mémoire.

simplefreq <- function (x,y=NULL,margin=1,html=NULL) {
if (is.null(y)) {simplefreq.tab<-cbind(data.frame(addmargins(
prop.table(table(x)))),
data.frame(addmargins(table(x)))[2])
colnames(simplefreq.tab)<-c(deparse(substitute(x)),"Percentage","Count")
RESTABLE<-simplefreq.tab

MINCHI2=NULL
MINOR=NULL
CHI2=NULL
}
if (!is.null(y)) {
simplefreq.tab0<-table(x,y)
simplefreq.chi<-chisq.test(simplefreq.tab0,
correct=FALSE)
if (margin==1)
{
simplefreq.tab<-cbind(addmargins(prop.table(
addmargins(simplefreq.tab0,1),1),2),
rowSums(addmargins(simplefreq.tab0,1)))
colnames(simplefreq.tab)<-c(colnames(simplefreq.tab0),"Total","Count")
rownames(simplefreq.tab)<-c(rownames(simplefreq.tab0),"All")
}
if (margin==2)
{
simplefreq.tab<-rbind(addmargins(prop.table(
addmargins(simplefreq.tab0,2),2),1),
t(colSums(addmargins(simplefreq.tab0,2))))
rownames(simplefreq.tab)<-c(rownames(simplefreq.tab0),"Total","Count")
colnames(simplefreq.tab)<-c(colnames(simplefreq.tab0),"All")
}
RESTABLE<-simplefreq.tab
CHI2<-simplefreq.chi

WARNING1 <- "Mining chi-square : what would be the chi-square if we were analyzing a 2*2 table. "
WARNING2 <- "Sign is used for over (+) or under(-) representation."

MINCHI2<-sign(simplefreq.chi$observed-simplefreq.chi$expected)*
(simplefreq.chi$observed-simplefreq.chi$expected)**2/
simplefreq.chi$expected/
((1-prop.table(simplefreq.tab0)/prop.table(
simplefreq.tab0,2))*
(1-prop.table(simplefreq.tab0)/prop.table(
simplefreq.tab0,1)))


WARNING1 <- "Mining odds ratio : what would be the odds ratio if we were analyzing a 2*2 table. "
n11<-simplefreq.tab0
n12<-(n11/prop.table(n11,1))-n11
n21<-(n11/prop.table(n11,2))-n11
n22<-sum(n11)-n12-n21-n11
MINOR<-(n11/n12/(n21/n22))
}
if (!is.null(html))
{
library(R2HTML)
HTML(simplefreq.tab,html)
}
structure(list(simplefreq=RESTABLE,chi2=CHI2,
minor=MINOR,minnchi2=MINCHI2))
}


Tweets (rarely/rarement): @OlivierGodechot

[Webmestre]

[Fil rss]

[V. 0.93]

HOP

A CMS


000

clics / mois.