Alcune istruzioni R
per le tabelle di contingenza
Eva Riccomagno, Maria Piera Rogantin
DIMA – Universit`a di Genova
(esempio delle dispense)
pulse=read.table("C:/DATA/pulse.txt",header=T,row.name=1)
##Lettura dati
• (ai livelli delle variabili ACTIVITY e SEX sono state 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))
• diagrammi a barre della distribuzione di una var. qualitativa
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 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)))
• 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))
• Leggere e usare i dati 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)
> prop.table(DF_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
> margin.table(DF_esempio,1)
Error in margin.table(DF_esempio,1) : ’x’ is not an array
> esempio=as.matrix(DF_esempio)
> margin.table(esempio,1) A1 A2 A3
50 200 250
oppure
es1=matrix(c(35,10,5,30,150,20,35,90,125),byrow=T,ncol=3)
colnames(es1)=c("B1","B2","B3");rownames(es1)=c("A1","A2","A3")