Oggi guarderemo assieme una delle prime funzioni che ho sviluppato, antecedente a desc_table/kable di cui ho parlato qui. La funzione si chiama par.2aov.
Scopo
Per prima cosa vediamo a cosa serve la funzione: quando in una analisi dati bisogna confrontare vari gruppi suddivisi per 2 variabili categoriche, bisogna scegliere se usare il test parametrico (2-way ANOVA) o il non parametrico (Kruskal-Wallis).Per fare ciò, bisogna analizzare due caratteristiche del campione:
Per testare la prima condizione, bisogna applicare un test sulla normalità (es. Shapiro), mentre la seconda viene verificata con un test di omoschedasticità (es. Bartlett). Entrambe le funzioni sono implementate in r, quindi perchè ho dovuto scriverci una funzione?
Ci sono due motivazioni: la prima è l’avere una miglior visualizzazione dei risultati e il poter avere i risultati dei test in un’unica lista (si vedrà bene poi nella sezione output); la seconda, la più importante, è che questa funzione permette di valutare allo stesso tempo anche l’eventuale effetto dell’interazione tra le due variabili categoriche, suddividendo il campione in n*m sottogruppi e valutando distribuzione e omoschedasticità.
Lancio della funzione e input
La funzione viene lanciata col comando mrt.par.2aov(x, y, z, type.of.int = "+/*").
Come si vede ci sono 3 input: x è il vettore numerico dei valori osservati, y e z sono i vettori dei fattori delle variabili categoriche che distinguono i vari gruppi. Type.of.int è l’input che determina se valutare anche l’interazione tra le due variabili categoriche: + (default) valuta solo le due variabili categoriche distinte, mentre * ne valuta anche l’interazione.
Principali step della funzione
Non c’è molto da dire sugli step della funzione, in quanto sono pochi e elementari. Vengono applicati i test per normalità (Shapiro) e omoschedasticità (Bartlett) e con i risultati vengono creati due dataframe distinti.
Nel caso in cui type.of.int fosse *, viene creato anche un dataframe con i risultati dello Shapiro test applicato ai vari gruppi, in quanto di base lo Shapiro test applicato con tapply ad un dataframe, prende come input una sola variabile categorica.
Output
Questa è la sezione più “interessante”, ovvero quella per cui è stata creata la funzione. Vediamone subito un esempio per capirne l’utilità:
|
|
$`Shapiro categorie`
categoric fattore W pval
1 mpg$drv 4 0.9140492 5.192071e-06
2 mpg$drv f 0.9062250 1.555910e-06
3 mpg$drv r 0.9116438 3.317112e-02
4 mpg$year 1999 0.9095696 8.223978e-07
5 mpg$year 2008 0.9704048 1.090310e-02
$`Shapiro interazione`
mpg$drv mpg$year W pval
1 4 1 0.8027046 1.230175e-06
2 f 1 0.8036883 2.868337e-07
3 r 1 0.8487732 4.113255e-02
4 4 2 0.9308291 3.937911e-03
5 f 2 0.9593676 8.922286e-02
6 r 2 0.9447511 4.825434e-01
$Bartlett
categoric k-squared df pval
1 mpg$drv 0.7067503 2 0.7023137
2 mpg$year 0.1818015 1 0.6698296
3 interaction 3.7215846 5 0.5901552
Come risultato viene fornita una lista con tre dataset: il primo riporta i valori dello Shapiro test eseguito per ogni categoria delle variabili categoriche, il secondo (opzionale in base al tipo di interazione) fornisce il risultato dello Shapiro test per ogni combinazione delle due variabili categoriche, il terzo fornisce i risultati del Bartlett test sia per le categoriche sia per la loro interazione. In questo caso, visti i p-value dello Shapiro test, opterò per eseguire un test di Kruskal-Wallis.
Miglioramenti possibili
Nonostante sia una funzione scritta un po’ di tempo fa, al momento non noto parti in cui possa essere migliorata (ammetto di averla dovuta modificare perchè era presente un errore ora che scrivevo questo post).