Visualizzazione post con etichetta matrix(). Mostra tutti i post
Visualizzazione post con etichetta matrix(). Mostra tutti i post

giovedì 11 agosto 2022

Test di Fisher

Quando si effettuano dei conteggi nei quali le osservazioni sono organizzate in una tabella di due righe per due colonne, si applicano queste regole:
si impiega il test chi-quadrato se le osservazioni sono indipendentisono numerose;
si impiega il test di Fisher se le osservazioni sono indipendenti e sono poche;
si impiega il test di McNemar nel caso di osservazioni non indipendenti (cioè nel caso di dati appaiati).

Quindi bisogna intendersi su cosa significano "numerose" e "poche". Armitage [1] e Snedecor [2] indicano la necessità di impiegare il test di Fisher (detto anche test esatto di Fisher) in alternativa al test chi-quadrato quando:
→ il numero totale di osservazioni è inferiore a 20;
→ il numero totale di osservazioni è compreso tra 20 e 40 e vi sono frequenze attese inferiori a 5.

Le indicazioni che potete trovare su altri test di statistica sono meno vincolanti sui limiti da applicare in termini di numerosità delle osservazioni, mentre concordano tutte nel sottolineare la necessità di applicare il test di Fisher quando in una o più celle vi è un numero ridotto di frequenze attese, le frequenze che dovremmo osservare in teoria e che sono calcolate per ciascuna cella come prodotto delle somme marginali (di riga e di colonna) corrispondenti, diviso per il numero totale dei casi e così ad esempio nella tabella riportata qui sotto:
→ per la cella in alto a sinistra contenente il valore osservato 4 la frequenza attesa sarà (4+16)·(4+1)/(4+16+1+21) = 20·5/42 = 2.38 
 per la cella in basso a destra con il valore osservato 21 la frequenza attesa sarà (21+1)·(21+16)/(4+16+1+21) = 22·37/42 = 19.38 

Il test di Fisher lo applichiamo all'analisi della relazione che potrebbe intercorrere (e che vogliamo verificare) tra il tipo di allattamento, naturale o artificiale, e la presenza in età successiva nel bambino di malocclusione dentariaLa suzione da una tettarella in gomma non è del tutto fisiologica e potrebbe determinare un qualche effetto sulla morfogenesi delle arcate dentarie che è in atto nel lattante. I dati sono tratti da [3] e sono riportati in questa tabella che contiene quindi le frequenze osservate:


Questo script prevede di inserire i dati manualmente. Copiatelo e incollatelo nella Console di R e premete ↵ Invio:

# TEST DI FISHER - 2 righe · 2 colonne
#
cells <- c(4,16,1,21) # genera l'array cells con i valori numerici contenuti nelle celle
rnames <- c("Allattamento_naturale", "Allattamento_artificiale") # genera l'array rnames con i nomi delle righe
cnames <- c("Denti_normali", "Malocclusione") # genera l'array cnames con i nomi delle colonne
mydata <- matrix(cells, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames)) # genera la matrice dei dati
mydata # mostra i dati
fisher.test(mydata) # esegue il test di Fisher
#

Nelle prime tre righe sono generati con la funzione c():
il vettore che contiene i quattro dati (che come si vede devono essere inseriti in sequenza leggendoli da sinistra a destra e dall'alto in basso) che sono salvati nell'oggetto cells;
il vettore che contiene i nomi delle righe, salvato nell'oggetto rnames;
il vettore che contiene i nomi delle colonne, salvato nell'oggetto cnames.

I tre vettori sono combinati a formare la matrice dei dati mediante la funzione matrix() che impiega gli argomenti che indicano:
l'oggetto/vettore contenente i dati (cells);
il numero di righe (nrow=2) e il numero di colonne (ncol=2) della matrice che sarà pertanto di due righe per due colonne;
la modalità di riempimento della matrice, che deve essere riempita per righe (byrow=TRUE) quindi da sinistra a destra e dall'alto in basso;
i nomi da assegnare alle righe e alle colonne (dimnames=list(rnames, cnames)).

La matrice dei dati così costruita viene salvata nell'oggetto mydata, che viene infine mostrato per un controllo finale.

Come si vede la parte principale del lavoro consiste nella corretta immissione e strutturazione dei dati, mentre il calcolo vero e proprio del test viene effettuato in modo molto semplice, con la funzione fisher.test() [4].

Questi sono i risultati:

> mydata # mostra i dati 

                         Denti_normali Malocclusione
Allattamento_naturale                4            16
Allattamento_artificiale             1            21
> fisher.test(mydata) # esegue il test di Fisher

        Fisher's Exact Test for Count Data

data:  mydata
p-value = 0.1745
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
   0.4440411 270.1636947
sample estimates:
odds ratio 
  5.059936 

Considerando significativi i valori inferiori al tradizionale valore soglia p=0.05 il test di Fisher fornisce nel nostro caso come risultato un valore di p=0.1745 che non è significativo: pertanto la conclusione è che non abbiamo evidenza statistica del fatto che i due tipi di allattamento comportino differenze nella prevalenza di malocclusione.

La funzione fisher.test() fornisce una analisi aggiuntiva della tabella calcolando anche l'odds ratio. In questo caso un risultato significativamente diverso da 1 deporrebbe per una associazione tra tipo di allattamento e tipo di occlusione dentaria. E un risultato diverso da 1 si avrebbe se i limiti di confidenza dell'odds ratio trovato, che è uguale a 5.059936, non includessero il valore 1. Dato che lo includono (vanno infatti da 0.4440411 a 270.1636947) il risultato non è significativo, conferma la mancanza di associazione tra i fattori presenti nella tabella e conferma anche il valore di p ottenuto con il test di Fisher. Per il tema odds ratio si rimanda ai test di statistica: si trova tra gli altri in Marubini [5], Campbell [6] e Ingelfinger [7].

Abbiamo qui una tipica applicazione del buonsenso in statistica: con un numero totale di osservazioni superiore a 40 (sono in totale 42 osservazioni) avremmo dovuto a rigore applicare il test chi-quadrato, ma è stato applicato il test di Fisher in quanto è stato dato maggior peso al fatto che vi sono celle con un numero ridotto di osservazioni. A conferma di ciò potete eseguire il test chi-quadrato digitando

chisq.test(mydata)

con questo risultato:

> chisq.test(mydata)

        Pearson's Chi-squared test with Yates' continuity correction

data:  mydata
X-squared = 1.1398, df = 1, p-value = 0.2857

Messaggio di avvertimento:
In chisq.test(mydata) : Chi-squared approximation may be incorrect

Il test chi-quadrato riporta una differenza non significativa (p=0.2857) ma un messaggio avverte che l'impiego del test chi-quadrato in questo caso non è appropriato. La ragione? Se digitate

chisq.test(mydata)$expected

ottenete la tabella delle frequenze attese

> chisq.test(mydata)$expected
                         Denti_normali Malocclusione
Allattamento_naturale         2.380952      17.61905
Allattamento_artificiale      2.619048      19.38095
Messaggio di avvertimento:
In chisq.test(mydata) : Chi-squared approximation may be incorrect

nella quale notate sulla sinistra due valori inferiori a 5. Il messaggio "Chi-squared approximation may be incorrect" viene fornito dalla funzione chisq.test() in quanto anche in R la regola "frequenze attese inferiori a 5" rappresenta il razionale per l'impiego del test di Fisher e prevale sul numero delle osservazioni.

In alternativa potete procedere come segue.

Copiate le tre righe riportate qui sotto, incollatele in un editor di file di testo aggiungendo un ↵ Invio al termine dell'ultima riga, e salvate il tutto in C:\Rdati\ sotto forma di un file di testo denominato chi_Fisher.csv (di default i file di testo sono salvati con l'estensione .txt ma noi qui salviamo il file con l'estensione .csv) [8].

Allattamento;Denti_normali;Malocclusione
Allattamento_naturale;4;16
Allattamento_artificiale;1;21

Impiegate quest'altro script che prevede di eseguire il test di Fisher sui dati letti dal file chi_Fisher.csv precedentemente salvato. Copiatelo e incollatelo nella Console di R e premete ↵ Invio:

# TEST DI FISHER - 2 righe · 2 colonne 
#
mydata <- read.table("C:/Rdati/chi_Fisher.csv", header=TRUE, sep=";", row.names="Allattamento") # importa i dati
mydata # mostra i dati
fisher.test(mydata) # esegue il test di Fisher
#

Come vedete lo script è più compatto del precedente, le uniche cose da notare sono gli argomenti della funzione read.table():
"C:/Rdati/chi_Fisher.csv" che specifica nome e posizione del file dal quale importare i dati;
header=TRUE che indica che nella prima riga del file sono contenuti i nomi delle variabili;
sep=";" che specifica il separatore di campo impiegato nel file;
row.names="Allattamento" che indica che i nomi delle righe sono contenuti nel campo “Allattamento”.

Salvate entrambi gli script. Se preferite intervenire sullo script per adattarlo di volta in volta ai nuovi dati, potete impiegare il primo dei due. Se volete evitare di mettere mano ogni volta allo script e preferite intervenire sul file di dati, potete impiegare il secondo.


----------

[1] Armitage P. Statistica medica. Giangiacomo Feltrinelli Editore, MIlano, 1979, p.140.

[2] Snedecor GW, Cochran WG. Statistical Methods. The Iowa State University Press, 1980, ISBN 0-8138-1560-6, p. 127.

[3] Armitage P. Statistica medica. Giangiacomo Feltrinelli Editore, MIlano, 1979, pp. 138-140.

[4] Digitate help(fisher.test) nella Console di R per la documentazione della funzione fisher.test().

[5] Bossi A, Cortinovis I, Duca PG, Marubini E. Introduzione alla statistica medica. La Nuova Italia Scientifica, Roma, 1994, ISBN 88-430-0284-8, pp. 282-285.

[6] Campbell MJ, Machin D. Medical Statistics. A Commonsense Approach. John Wiley & Sons, New York, 1993, ISBN 0-471-93764-9, pp. 121-123 e 154-156.

[7] Ingelfinger JA, Mosteller F, Thibodeau LA, Ware JH. Biostatistica in medicina. Macmillan Publishing Co., Inc.; New York, 1983, ISBN 88-7078-065.1, pp. 30-33.

[8] Per eventuali approfondimenti sul formato .csv (comma separated value) che è il formato dati raccomandato per R vedere la sezione Gestione dei dati nella pagina Indice.

giovedì 14 febbraio 2019

Regressione lineare semplice non parametrica

La caratteristica saliente dei metodi di regressione lineare non parametrica è costituita dalla loro robustezza. Questo significa che si tratta di metodi che risentono poco della eventuale presenza di dati apparentemente anomali, ma che non possono essere esclusi a priori dal calcolo della regressione.

Essendo n il numero delle coppie di dati/punti esistono n · (n - 1) / 2 modi di connettere due punti qualsiasi con una retta, cioè esistono n · (n - 1) / 2 possibili coefficienti angolari [1]. Nel caso più semplice il coefficiente angolare b della retta di regressione è la mediana di questi valori e l'intercetta a è la mediana degli n valori possibili calcolati mediante il coefficiente angolare trovato. Questi sono concettualmente i principi alla base della regressione lineare non parametrica, con possibili varianti da metodo a metodo.

Qui vediamo, confrontati con la regressione lineare semplice parametrica (regressione lineare ordinaria), tre modelli di regressione lineare non parametrica:
→ la regressione lineare di Thiel-Sen;
→ la regressione lineare di Siegel;
→ la regressione quantilica.

Da notare che questi tre modelli di regressione lineare non parametrica assumono la x come variabile indipendente analogamente alla regressione lineare ordinaria.

Le funzioni necessarie per il calcolo delle tre regressioni lineari non parametriche sono incluse in due pacchetti aggiuntivi, mblm e quantreg, che devono essere scaricati dal CRAN. Trovate come al solito la documentazione dei pacchetti e in particolare il loro manuale di riferimento sul repository della documentazione [2].

Copiate questo script, incollatelo nella Console di R e premete ↵ Invio:

# REGRESSIONE LINEARE ORDINARIA E NON PARAMETRICA DI THEIL-SEN, DI SIEGEL, QUANTILICA
#
library(mblm) # carica il pacchetto per le regressioni di Theil-Sen e Siegel
library(quantreg) # carica il pacchetto per la regressione quantilica
#
var_x <- c(18, 46, 104, 72, 24, 63, 23, 58, 36, 82, 94) # variabile in ascisse
var_y <- c(21, 42, 109, 64, 102, 78, 19, 66, 42, 89, 91) # variabile in ordinate
#
regpar_yx <- lm(var_y ~ var_x) # regressione lineare ordinaria x variabile indipendente
a_yx <- regpar_yx$coefficients[1] # intercetta a
b_yx <- regpar_yx$coefficients[2] # coefficiente angolare b
#
reg_TS <- mblm(var_y ~ var_x, repeated=FALSE) # regressione lineare di Theil-Sen
a_TS <- reg_TS$coefficients[1] # intercetta a
b_TS <- reg_TS$coefficients[2] # coefficiente angolare b
#
reg_S = mblm(var_y ~ var_x, repeated=TRUE) # regressione lineare di Siegel
a_S <- reg_S$coefficients[1] # intercetta a
b_S <- reg_S$coefficients[2] # coefficiente angolare b
#
reg_q <- rq(var_y ~ var_x, tau=0.5) # regressione lineare quantilica
a_q <- reg_q$coefficients[1] # intercetta a
b_q <- reg_q$coefficients[2] # coefficiente angolare b
#
# traccia il grafico dei dati con le rette di regressione e aggiunge una legenda
#
windows() # apre una nuova finestra
plot(var_x, var_y, xlim = c(0,120), ylim = c(0,120), pch=1, xlab="Variabile x", ylab="Variabile y", main="Regressioni ordinaria, Theil-Sen, Siegel, quantilica", cex.main = 0.9) # grafico dei dati
abline(a_yx, b_yx, col="blue", lty=4) # retta regressione ordinaria
abline(a_TS, b_TS, col="red", lty=4) # retta regressione di Theil-Sen
abline(a_S, b_S, col="green", lty=1) # retta regressione di Siegel
abline(a_q, b_q, col="orange", lty=1) # retta regressione quantilica
legend(60, 30, legend=c("Regressione ordinaria", "Regressione di Theil-Sen", "Regressione di Siegel", "Regressione quantilica"), col=c("blue", "red", "green", "orange"), lty=c(4,4,1,1), cex=0.8) # aggiunge al grafico la legenda
#
# crea una tabella con intercetta e coefficiente angolare delle quattro rette di regressione
#
cells <- c(a_yx,b_yx,a_TS,b_TS,a_S,b_S,a_q,b_q) # genera l'array cells con i valori numerici di a e di b
rnames <- c("Regressione ordinaria", "Regressione di Theil-Sen", "Regressione di Siegel", "Regressione quantilica") # genera l'array rnames con i nomi delle righe
cnames <- c("Intercetta a", "Coefficiente angolare b") # genera l'array cnames con i nomi delle colonne
tabris <- matrix(cells, nrow=4, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames)) # costruisce la tabella con i risultati a partire dagli array cells, rnames, cnames
tabris # mostra la tabella con i risultati
#

Questo è il grafico di dispersione (xy) dei dati, con le rette calcolate:


I risultati delle quattro equazioni

y = a + b · x

sono così riportati nella Console di R:

> tabris # mostra la tabella con i risultati
                         Intercetta a Coefficiente angolare b
Regressione ordinaria       24.078677               0.7389267
Regressione di Theil-Sen     6.529412               0.9852941
Regressione di Siegel        5.873402               1.0042750
Regressione quantilica       2.581395               1.0232558

Le cose da notare sono:
→ è evidente la presenza di un dato che si discosta in modo importante da tutti gli altri;
→ i risultati dei tre metodi non parametrici sono simili tra loro;
→ i risultati delle regressione ordinaria (parametrica) si discostano da quelli delle regressioni non parametriche.

Per verificare quanto il dato, chiaramente anomalo, influenzi le regressioni, eseguiamo nuovamente lo script, sostituendo la terza e la quarta riga con queste due, nelle quali è stato eliminato il dato, il quinto, quello con le coordinate (x,y) uguali a (24, 102):

var_x <- c(18, 46, 104, 72, 63, 23, 58, 36, 82, 94) # variabile in ascisse
var_y <- c(21, 42, 109, 64, 78, 19, 66, 42, 89, 91) # variabile in ordinate

Ora i grafici delle rette sono praticamente sovrapposti (e difficilmente distinguibili tra loro)


mentre i risultati sono diventati i seguenti:

> tabris # mostra la tabella con i risultati
                         Intercetta a Coefficiente angolare b
Regressione ordinaria        1.337096                1.019512
Regressione di Theil-Sen     2.729167                1.020833
Regressione di Siegel        2.654334                1.022497
Regressione quantilica       2.581395                1.023256

Come si vede dal confronto con i risultati precedenti, con l'eliminazione del dato anomalo i risultati della regressione ordinaria sono cambiati: e questa fornisce ora risultati sovrapponibili a quelli dei tre metodi non parametrici. Poco sono cambiati, rispetti ai precedenti, i risultati della regressione di Thiel-Sen e di Siegel, mentre la regressione quantilica ha addirittura fornito identici valori nei due casi, un fatto molto interessante. I metodi non parametrici confermano la loro robustezza, mentre viene documentato quanto un singolo dato anomalo possa influire sulla regressione lineare ordinaria.


----------

[1] Per 100 coppie di dati il numero dei coefficienti angolari (sui quali calcolare la mediana) è uguale quindi a 4 950. Con 500 dati passiamo a 124 740. Con 1 000 dati passiamo a 499 500. 

[2] Available CRAN Packages By Name.
https://cran.r-project.org/web/packages/available_packages_by_name.html

lunedì 10 dicembre 2018

Grafici a barre (barplot) [2]

Dopo la prima parte dedicata ai grafici a barre (bar plot o barplot[1] continuiamo ora estendendo la rappresentazione a un numero maggiore di dati con l'esempio tratto da Marubini [2] relativo al grado di protezione rilevato per cinque differenti vaccini contro l'influenza. Questi sono i dati espressi in percentuale:

Esito
Vaccino_1
Vaccino_2
Vaccino_3
Vaccino_4
Vaccino_5
Influenza_si
18.1
21.0
9.1
18.3
20.0
Influenza_no
81.9
79.0
90.8
81.7
80.0

Questo script permette di generare un classico grafico a barre affiancate. Copiatelo e incollatelo nella Console di R e premete ↵ Invio:

# GRAFICO A BARRE PER L'EFFICACIA DI 5 VACCINI
#
cells <- c(18.1,21,9.1,18.3,20,81.9,79,90.9,81.7,80) # genera l'array cells con i valori di percentuale
rnames <- c("Influenza_si", "Influenza_no") # genera l'array rnames con i nomi delle righe
cnames <- c("Vaccino_1", "Vaccino_2", "Vaccino_3", "Vaccino_4", "Vaccino_5") # genera l'array cnames con i nomi delle colonne
mydata <- matrix(cells, nrow=2, ncol=5, byrow=TRUE, dimnames=list(rnames, cnames)) # genera la matrice dati
#
mydata # mostra la matrice dati
t(mydata) # mostra la matrice dati trasposta
#
windows() # apre una nuova finestra
barplot(t(mydata), beside=TRUE, legend=TRUE, ylim=c(0,150), col=c("red","orange", "yellow", "green", "skyblue"), ylab="Frequenze osservate", xlab="Esiti delle vaccinazioni", main="Valutazione dell’efficacia di 5 vaccini influenzali") # traccia il grafico a barre verticali
#

Lo script segue lo schema già visto, nelle prime tre righe sono generati con la funzione c():
il vettore che contiene i dieci dati (che come si vede devono essere inseriti in sequenza leggendoli dalla tabella da sinistra a destra e dall'alto in basso) che sono salvati nell'oggetto cells;
il vettore che contiene i nomi delle righe, salvato nell'oggetto rnames;
il vettore che contiene i nomi delle colonne, salvato nell'oggetto cnames.

I tre vettori sono combinati a formare la matrice dei dati mediante la funzione matrix() che impiega gli argomenti che indicano:
l'oggetto/vettore contenente i dati (cells);
il numero di righe (nrow) e il numero di colonne (ncol) della matrice;
la modalità di riempimento della matrice, che deve essere riempita per righe (byrow=TRUE) quindi da sinistra a destra e dall'alto in basso;
i nomi da assegnare alle righe e alle colonne (dimnames=list(rnames, cnames)).

A questo punto per fare il punto della situazione sono mostrate sia la matrice dati mydata sia la sua matrice trasposta t(mydata) [3]:

> mydata # mostra la matrice dati 
             Vaccino_1 Vaccino_2 Vaccino_3 Vaccino_4 Vaccino_5
Influenza_si      18.1        21       9.1      18.3        20
Influenza_no      81.9        79      90.9      81.7        80
> t(mydata) # mostra la matrice dati trasposta 
          Influenza_si Influenza_no
Vaccino_1         18.1         81.9
Vaccino_2         21.0         79.0
Vaccino_3          9.1         90.9
Vaccino_4         18.3         81.7
Vaccino_5         20.0         80.0

Viene quindi aperta una nuova finestra con la funzione windows() (utile se per caso avete già un'altra finestra grafica aperta) e viene generato un primo grafico a barre con la funzione barplot() [4] impiegando questi argomenti:
per i dati viene impiegata la matrice dati trasposta t(mydata);
l'argomento beside=TRUE specifica che le barre sono affiancate e non sovrapposte in pila;
con l'argomento legend=TRUE viene generata una legenda;
con l'argomento ylim=c(0,150) sono impostati il valore minimo e il valore massimo per l'asse delle y;
→ con l'argomento col è impostato il colore delle barre.


Ora copiate e incollate nella Console di R queste due righe di codice e premete ↵ Invio:

#
windows() # apre una nuova finestra
barplot(mydata, beside=FALSE, legend=TRUE, ylim=c(0,150), col=c("red", "green"), density = 40, angle = 45, ylab="Frequenze osservate", xlab="Vaccino infuenzale", main="Valutazione dell’efficacia di 5 vaccini influenzali") # traccia il grafico a barre verticali
#

Con lo script dopo avere aperto una nuova finestra grafica con windows() viene realizzato un nuovo grafico a barre impiegando la funzione barplot() con queste variazioni rispetto al precedente:
per i dati viene impiegata la matrice mydata;
l'argomento beside=FALSE specifica che le barre sono sovrapposte in pila;
con l'argomento col=c("yellow", "green") viene fornito l'array contenente i colori da applicare;
→ con gli argomenti density = 40, angle = 45 sono specificati la densità e l'angolo delle linee colorate che andranno a riempire le barre.

Il risultato è ora questo grafico con le barre sovrapposte in pila (attenzione al fatto che ogni nuova finestra grafica si sovrappone alla precedente, spostatela per visualizzarle entrambe):


Nota: questo esempio illustra un caso classico nel quale l'impiego delle barre impilate non solo è corretto, ma consente di rendere meglio delle barre affiancate l'informazione contenuta nei risultati.

Finora i grafici a barre sono stati generati specificando per ciascuna barra il numero dei casi. Ma se i dati sono numerosi è possibile impiegare la funzione table() che genera tabelle di contingenza che riportano i dati dei conteggi effettuati per noi da R [5].

Per farlo è necessario il pacchetto DAAG [6]. Il pacchetto contiene tra gli altri il set di dati ais sul quale effettuiamo il conteggio e la rappresentazione sotto forma di grafico a barre prima del numero degli atleti per sport praticato e poi del numero degli atleti per sesso e per sport praticato.

Ora copiate e incollate nella Console di R queste righe di codice e premete ↵ Invio:

# GRAFICI A BARRE DA UNA TABELLA DI CONTINGENZA
#
library(DAAG) # carica il pacchetto e il set di dati ais
#
# grafico a barre per sport praticato
#
tab <- table(ais$sport) # tabula i dati per sport
windows() # apre una nuova finestra
barplot(t(tab), beside=TRUE, legend=TRUE, cex.names = 0.8, las = 2, xlab= "Sport praticato", ylab = "Numero degli atleti", main = "Numero degli atleti per sport praticato", col = "green") # grafico a barre
#
# grafico a barre per sport praticato e per sesso
#
tab <- table(ais$sport, ais$sex) # tabula i dati per sport e per sesso
windows() # apre una nuova finestra
barplot(t(tab), beside=TRUE, legend=TRUE, cex.names = 0.8, las = 2, xlab= "Sport praticato", ylab = "Numero degli atleti", main = "Numero degli atleti per sport praticato e per sesso", col = c("green", "yellow")) # grafico a barre
#

Questo è il grafico a barre con il numero degli atleti per sport praticato


e questo è il grafico a barre con il numero degli atleti per sport praticato ulteriormente suddiviso per sesso dell'atleta


In entrambi i casi viene impiegata la matrice trasposta t(tab) ma le cose più interessanti sono:
→ l'espressione table(ais$sport) impiegata per tabulare i dati in base alla variabile sport (lo sport praticato dall'atleta);
→ l'espressione table(ais$sport, ais$sex) impiegata per tabulare i dati in base alla variabile sport e suddividerli ulteriormente in base alla variabile sex (il sesso dell'atleta);
→ l'argomento cex.names = 0.8 che rimpicciolisce le etichette che riportano lo sport corrispondente a ciascuna della barre;
→ l'argomento las = 2 che le ruota verticalmente.

Conclusione: in questo e nel post precedente [1] abbiamo finora impiegato per la realizzazione dei grafici a barre le sole funzioni contenute nella installazione base di R, che sono abbastanza limitate. Per rappresentazioni più complesse e molto più articolate è sicuramente utile ricorrere alle funzioni contenute nel pacchetto ggplot2 [7].


----------

[1] Vedere il post Grafici a barre (barplot) [1].


[3] Digitate help(t) nella Console di R per la documentazione della funzione t().

[4] Digitate help(barplot) nella Console di R per la documentazione della funzione barplot().

[5] Digitate help(table) nella Console di R per la documentazione della funzione table().

[6] Vedere il post Il set di dati ais nel quale trovate anche come caricare i dati della tabella senza installare il pacchetto DAAG