Per una migliore visione, attiva JavaScript

Funzione par.2aov

 ·  🕘 4 min lettura  ·  🤖 Matteo Miotto

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:
  • Tutti i gruppi in cui il campione viene diviso dalle variabili categoriche devono avere una distribuzione normale
  • Le varianze tra i diversi gruppi devono essere omogenee

  • 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à:

    Esempio 1 Verificare quale test si deve utilizzare per valutare se c’è differenza tra i valori di hwy nelle macchine del dataset mpg in base all’anno, al tipo di drive train (drv) e alla loro interazione.
    1
    
    par.2aov(mpg$hwy, mpg$drv, mpg$year, type.of.int = "*")
    
    
    $`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).

    Condividi
    Supporta l'autore con

    Matteo Miotto
    SCRITTO DA
    Matteo Miotto
    Genomic Data Science master student