Alcune istruzioni R
per le tabelle di contingenza
Eva Riccomagno, Maria Piera Rogantin
DIMA – Universit`a di Genova
Costruire una tabella di contingenza
1. I dati sono in un dataframe con valori per ogni unit` a speri- mentale (esempio delle dispense)
##Lettura dati
pulse=read.table("C:/DATA/pulse.txt",header=T,row.name=1)
## le variabili ACTIVITY e SEX vengono trasformate in fattori
## e ai livelli vengono assegnate opportune etichette
pulse$ACTIVITY=ordered(pulse$ACTIVITY, levels=c(0,1,2,3), labels=c("no","poca", "media","molta") )
pulse$SEX=factor(pulse$SEX, levels=c(1,2), labels=c("M","F") )
• tabelle “a una via”
frequenze assolute (o conteggi) e relative
tab=table(ACTIVITY)
freq=prop.table(tab) ## distribuzione
cbind(tab,round(freq,4),round(freq*100,2)) ## affianca le due tabelle
• diagrammi a barre della distribuzione di una variabile qua- litativa
barplot(freq,cex.names=2,cex.axis=2) ## cex definisce la dimensione
• tabelle “a due vie” - frequenze assolute e relative
SA=table(SEX,ACTIVITY) ## in riga SEX, in colonna ACTIVITY round(prop.table(SA)*100,2)
AS=table(ACTIVITY,SEX) ## in riga ACTIVITY, in colonna SEX
###### oppure AS=t(SA) la funzione t e‘ la trasposta colnames(AS); rownames(AS)
## vettori contenenti le etichette delle variabili riga e colonna rownames(AS)[1]; rownames(AS)[2]
dim(AS) ## vettore con due elementi dim(AS)[2]
• marginali nelle tabelle “a due vie”
margin.table(SA,1) ## marginale riga assoluto margin.table(SA,2) ## marginale colonna assoluto
• visualizzare la tabella con i marginali
rbind(cbind(SA,margin.table(SA,1)),c(margin.table(SA,2),sum(SA)))
2. I dati sono gi` a in formato di tabella di contingenza
DF_esempio=read.table(text=
" B1 B2 B3 A1 35 10 5 A2 30 150 20
A3 35 90 125",header=T,row.names=1)
#### oppure letto da un file di testo sempre con read.table
questa struttura non ` e una tabella ma un data frame
non si possono applicare funzioni che agiscono su tabelle
margin.table(DF_esempio,1)
Error in margin.table(DF_esempio,1) : ’x’ is not an array
trasformazione del data frame in tabella (matrice)
esempio=as.matrix(DF_esempio)
esempio ` e la struttura su cui fare l’analisi
> margin.table(esempio,1) A1 A2 A3
50 200 250
> prop.table(esempio) B1 B2 B3
A1 0.07 0.02 0.01 A2 0.06 0.30 0.04 A3 0.07 0.18 0.25
• barplot dei conteggi (o della distribuzione) congiunti
par(mfcol=c(2,2)) # i grafici vengono costruiti in ordine per colonna
## par(mfrow=c(2,2)) i grafici vengono costruiti in ordine per riga
## evidenziare la variabile SEX barplot(AS,beside=F,font=2)
barplot(AS,beside=T,font=2)
## evidenziare la variabile ACTIVITY barplot(SA,beside=F,font=2)
barplot(SA,beside=T,font=2) par(mfcol=c(1,1))
• profili riga
row_pr=prop.table(SA,1)
round(row_pr*100,2) # ciascuna riga somma a 100
row_pr[1,] # visualizza il primo profilo riga row_pr[2,] # visualizza il secondo profilo riga
• barplot dei profili riga
barplot(row_pr[1,],ylim=c(0,1),main="Maschi", cex.names=2,cex.axis=2,cex.main=2)
## main = definisce il titolo del grafico
abline(h=0) ## aggiunge una riga orizzontale in corrispondenza d 0 barplot(row_pr[2,],ylim=c(0,1),main="Femmine",
cex.names=2,cex.axis=2,cex.main=2) abline(h=0)
## ylim definisce i limiti dell’asse verticale
## uguali nei due grafici per confrontarli
per avere sulla stessa finestra i due grafici
par(mfrow=c(1,2))
#suddivide la finestra grafica in una riga e due colonne barplot(row_pr[1,],ylim=c(0,1),main="Maschi")
abline(h=0)
barplot(row_pr[2,],ylim=c(0,1),main="Femmine") abline(h=0)
par(mfrow=c(1,1)) #ripristina la finestra grafica
• profili colonna
col_pr=prop.table(SA,2)
round(col_pr*100,2) # ciascuna colonna somma a 100 col_pr[,1]; col_pr[,2]; col_pr[,3]; col_pr[,4]
• barblot dei profili colonna
par(mfrow=c(1,4))
barplot(col_pr[,1],ylim=c(0,1),main=colnames(col_pr)[1]) abline(h=0)
barplot(col_pr[,2],ylim=c(0,1),main=colnames(col_pr)[2]) abline(h=0)
barplot(col_pr[,3],ylim=c(0,1),main=colnames(col_pr)[3]) abline(h=0)
barplot(col_pr[,4],ylim=c(0,1),main=colnames(col_pr)[4]) abline(h=0)
par(mfrow=c(1,1))
oppure - uso del ciclo for
par(mfrow=c(1,4)) for (j in 1:4) {
barplot(col_pr[,j],ylim=c(0,1),main=colnames(col_pr)[j]) abline(h=0)
}
par(mfrow=c(1,1))
• deviazioni dei profili riga dal totale colonna
rel_marg_col=prop.table(margin.table(SA,2))
## costruzione di una tabella/matrice con ciascuna riga
## uguale al marginale colonna
t_rel_marg_col=matrix(rep(rel_marg_col,dim(SA)[1]), byrow=T,ncol=dim(SA)[2]) row_dev=row_pr-t_rel_marg_col
round(row_dev*100,1)
• barplot delle deviazioni dei profili riga dal totale colonna
par(mfrow=c(1,2))
for (i in 1:dim(SA)[1]) {
barplot(row_dev[i,],ylim=c(min(row_dev),max(row_dev)),main=rownames(SA)[i]) abline(h=0)
}
par(mfrow=c(1,1))
• aggiungere un titolo generale nella finestra grafica
par(mfrow=c(1,2),oma=c(0,0,2,0)) for (i in 1:dim(SA)[1])
{
barplot(row_dev[i,],ylim=c(min(row_dev),max(row_dev)),main=rownames(SA)[i]) abline(h=0)
}
mtext("Deviazioni profili riga dal marginale colonna", outer = TRUE,cex=2) par(mfrow=c(1,1))
• profili colonna - attenzione a che cosa cambia
rel_marg_row=prop.table(margin.table(SA,1))
## costruzione di una tabella/matrice con ciascuna colonna
## uguale al marginale riga
t_rel_marg_row=matrix(rep(rel_marg_row,dim(SA)[2]), byrow=F,ncol=dim(SA)[2]) col_dev=col_pr-t_rel_marg_row
round(col_dev*100,1)
par(mfrow=c(1,4),oma=c(0,0,2,0)) for (j in 1:dim(SA)[2])
{
barplot(col_dev[,j],ylim=c(min(col_dev),max(col_dev)),main=colnames(SA)[j]) abline(h=0)
}
## aggiunge testo in alto (oma=c(0,0,2,0) indica la posizione)
mtext("Deviazioni profili riga dal marginale colonna", outer = TRUE,cex=2) par(mfrow=c(1,1))