Menu

Test t in R: t.test() a un campione, a due campioni e appaiato

Esegui test t a un campione, a due campioni e appaiati con t.test() e, cosa che conta davvero, leggi ogni riga dell'output: t, df, p-value, intervallo di confidenza.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Cosa chiede un test t

Ogni test t risponde alla stessa domanda di fondo: questa differenza tra medie è reale, o potrebbe essere solo rumore? I campioni oscillano: misura due volte i tempi di reazione di dieci persone e otterrai due medie diverse anche se non è cambiato nulla. Il test t confronta la differenza che hai osservato con l'oscillazione che ti aspetteresti dal caso, e indica quanto sarebbero sorprendenti i tuoi dati se la vera differenza fosse zero.

Tre varianti, una funzione:

  • A un campione: la media di questo gruppo è diversa da un valore fisso?
  • A due campioni: questi due gruppi indipendenti hanno medie diverse?
  • Appaiato: gli stessi soggetti sono cambiati tra due misurazioni?

A un campione: t.test(x, mu = ...)

Supponi che un processo debba durare in media 5.0 secondi e che tu cronometri dieci esecuzioni:

La media del campione è 5.61, ma uno scarto di 0.61 sopra l'obiettivo è significativo con solo dieci esecuzioni, o rientra nella normale oscillazione? È proprio a questo che risponde l'output.

Leggere l'output riga per riga

Questa è la sezione che conta davvero: l'output di ogni variante di t.test() ha la stessa forma, quindi impara a leggerlo una volta. Esegui il blocco qui sopra e confronta ogni riga:

  • t = 4.26: la statistica test, cioè la differenza osservata (5.61 − 5 = 0.61) divisa per l'errore standard della media (circa 0.143). Dice che la media del campione si trova poco più di quattro errori standard lontano dal valore ipotizzato. Più grande è |t|, più il risultato è sorprendente sotto l'ipotesi nulla.
  • df = 9: i gradi di libertà, qui n − 1. Pochi gradi di libertà significano campioni piccoli, e quindi il test pretende un t più grande prima di lasciarsi convincere.
  • p-value ≈ 0.002: se la vera media fosse davvero 5, la probabilità di estrarre un campione la cui media cade almeno così lontano da 5 (in una delle due direzioni) è circa lo 0.2%. Questo è tutto il suo significato. Non è la probabilità che la vera media sia 5, e un p-value piccolo non dimostra la tua spiegazione preferita: dice solo "difficile dare la colpa al caso". Con la soglia abituale di 0.05, qui rifiuti l'ipotesi nulla.
  • alternative hypothesis: una riformulazione di cosa significherebbe "rifiutare". not equal to 5 conferma che il test era bilaterale.
  • 95 percent confidence interval: 5.29 to 5.93: l'intervallo delle vere medie compatibili con i dati. Nota che 5 è fuori: è lo stesso verdetto di p < 0.05, espresso nelle unità dei dati, e in più ti dice la grandezza plausibile dell'effetto, cosa che il p-value non fa mai.
  • sample estimates: la media osservata, così chi legge vede il dato grezzo sottoposto al test.

Se ti servono i singoli pezzi nel codice: result <- t.test(times, mu = 5), poi result$p.value, result$conf.int, result$estimate.

A due campioni: confrontare gruppi indipendenti

Per due gruppi indipendenti, l'interfaccia a formula si legge come la domanda stessa. ToothGrowth registra la crescita dei denti in porcellini d'India a cui è stata data vitamina C sotto forma di succo d'arancia (OJ) o di acido ascorbico (VC):

Leggilo come "verifica len diviso per supp". Ora l'output mostra due stime (la media di ciascun gruppo, circa 20.7 contro 17.0), e l'intervallo di confidenza riguarda la differenza tra le due. Qui p ≈ 0.061 e l'intervallo va da circa −0.17 a 7.57: include lo zero, quindi al livello 0.05 non puoi escludere "nessuna differenza", anche se un intervallo che arriva fino a +7.6 ti avverte di non dichiarare inesistente la differenza. "Non significativo" vuol dire non dimostrato, non dimostrato assente.

Welch è il default, ed è un bene

Guarda l'intestazione dell'output: Welch Two Sample t-test, con gradi di libertà decimali (circa 55.3). Il classico test t di Student presume che entrambi i gruppi abbiano la stessa varianza; la versione di Welch elimina questa ipotesi e corregge i gradi di libertà per compensare. Quando le varianze sono davvero uguali, Welch dà risposte praticamente identiche; quando non lo sono, il test di Student può essere molto mal calibrato mentre Welch resta onesto. Quindi il default di R è quello sicuro, e raramente c'è motivo di cambiarlo.

Il rituale "prima verifica l'uguaglianza delle varianze, poi scegli il test" è un consiglio superato: usa semplicemente Welch.

Appaiato: prima e dopo

Quando entrambe le misurazioni provengono dagli stessi soggetti, i gruppi non sono indipendenti, e trattarli come tali butta via la potenza del test. Ecco i punteggi di otto persone prima e dopo un corso di formazione:

paired = TRUE verifica la media delle differenze all'interno di ogni persona (qui in media 2.75 punti, p ≈ 0.001). Perché l'appaiamento cambia tutto: le persone differiscono tra loro molto più di quanto il corso abbia cambiato ciascuna, e una variabilità tra soggetti che va da 65 a 80 sommergerebbe un miglioramento di 2 o 3 punti in un test non appaiato. Calcolare le differenze toglie di mezzo il punto di partenza di ogni persona, e resta solo il cambiamento. La regola: se i dati hanno una struttura naturale di "stessa unità misurata due volte", appaiali. (E non usare mai paired = TRUE quando i gruppi sono davvero indipendenti: l'appaiamento sarebbe finzione.)

Test unilaterali: maneggiare con cura

Di default il test è bilaterale: considera come prova una differenza in entrambe le direzioni. Se, prima di vedere i dati, la tua ipotesi aveva senso solo in una direzione, puoi dichiararlo:

Il p-value si dimezza rispetto al test bilaterale, ed è proprio per questo che esiste la tentazione: passare al test unilaterale dopo aver sbirciato i dati è p-hacking. Usa alternative = "greater" o "less" solo con una direzione davvero stabilita in anticipo; nel dubbio, resta sul bilaterale.

Ipotesi e piano B

Il test t presume che le osservazioni siano indipendenti e che le medie campionarie abbiano una distribuzione approssimativamente normale, cosa vera quando i dati stessi sono più o meno normali oppure i campioni sono abbastanza grandi (il teorema del limite centrale fa il lavoro pesante; con n ≈ 30+ per gruppo, una moderata non normalità non è un problema). Controlla la forma con un rapido istogramma o un boxplot. L'indipendenza, però, nessun test la può salvare: dipende da come sono stati raccolti i dati.

Per campioni piccoli con dati chiaramente asimmetrici o valori anomali estremi, l'alternativa non parametrica standard è una riga: wilcox.test(len ~ supp, data = ToothGrowth), che confronta le distribuzioni tramite i ranghi invece che le medie.

Cosa ti porti a casa

  • t.test(x, mu = ) per un campione, t.test(y ~ group, data = ) per due, paired = TRUE per prima e dopo.
  • Il p-value dice "quanto sono sorprendenti questi dati se la vera differenza fosse zero", niente di più; l'intervallo di confidenza ti dice la grandezza plausibile dell'effetto in unità reali.
  • Il default di R a due campioni è il test di Welch (gradi di libertà decimali): tienilo.
  • L'appaiamento elimina il rumore tra soggetti; usalo ogni volta che le stesse unità vengono misurate due volte.
  • Alternative unilaterali solo con una direzione decisa in anticipo; wilcox.test() è il piano B basato sui ranghi.

Prossimo passo: confrontare le medie di tre o più gruppi insieme, cioè l'ANOVA con aov().

Domande frequenti

Come si esegue un test t in R?

Con t.test(). Un campione rispetto a un valore fisso: t.test(x, mu = 5). Due gruppi indipendenti: t.test(value ~ group, data = df). Misurazioni prima e dopo sugli stessi soggetti: t.test(after, before, paired = TRUE).

Come si interpreta il p-value di un test t in R?

È la probabilità di osservare una differenza grande almeno quanto la tua se la vera differenza fosse zero. Un p-value piccolo (per convenzione sotto 0.05) significa che è difficile spiegare i dati come rumore, quindi rifiuti l'ipotesi nulla. Non è la probabilità che l'ipotesi nulla sia vera e non dice nulla su quanto la differenza sia grande o importante: per questo leggi l'intervallo di confidenza.

Perché R usa il test t di Welch come default?

Il t.test() a due campioni di R usa di default la versione di Welch, che non presume che i due gruppi abbiano varianze uguali: ecco perché i gradi di libertà escono con i decimali. Welch si comporta quasi come il classico test di Student quando le varianze sono uguali ed è più sicuro quando non lo sono, quindi il default è la scelta giusta. Usa var.equal = TRUE solo se un esercizio richiede esplicitamente il classico test con varianza aggregata.

Quando si usa un test t appaiato in R?

Quando le due serie di misurazioni formano coppie naturali: lo stesso soggetto misurato prima e dopo, lo stesso oggetto valutato con due metodi. t.test(after, before, paired = TRUE) verifica la media delle differenze all'interno delle coppie, il che elimina la variabilità tra soggetti e di solito dà molta più potenza rispetto a trattare i gruppi come indipendenti.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA