Novembre 2015

Volume 30 Numero 12

Il presente articolo è stato tradotto automaticamente.

Esecuzione di test - Test T con C#

Da James McCaffrey

James McCaffreyIl test t è uno dei formati più fondamentali di analisi statistica. L'obiettivo consiste nel determinare se i mezzi (medie) di due set di numeri sono uguali quando si dispone solo di esempi di due set. L'idea è meglio illustrato dall'esempio. Si supponga di che esame la capacità matematica del liceo maschi e femmine in un distretto scolastico di grandi dimensioni. Il test di capacità è lungo e costoso in modo che il test non è possibile assegnare a tutti gli studenti. Invece in modo casuale selezionare un campione di 10 maschi e 10 femmine e concedere loro il test di matematica. Dai risultati di esempio è possibile eseguire un test t per dedurre se è uguale al punteggio true medio di tutte le femmine il punteggio true medio di tutti i maschi.

Sono disponibili numerosi strumenti autonomi, tra cui Excel, in cui è possibile eseguire un test t. Ma se si desidera integrare la funzionalità di test t direttamente in un sistema software, utilizzando strumenti autonomi può essere difficili o impossibili e può comportare problemi legali sul copyright o altri. In questo articolo viene illustrato come eseguire un test t utilizzando raw (nessun librerie esterne) del codice c#.

Il modo migliore per farsi un'idea di cosa è il test t e per vedere quale ha inizio in questo articolo è di osservare il programma demo in Figura 1. Il primo set di dati è {88, 77, 78, 85, 90, 82, 88, 98, 90}. Si può immaginare che questi sono i punteggi dei 10 maschi, test in uno dei maschi rilasciato per qualche motivo, lasciando solo nove punteggi.

Demo di Test T utilizzando c#
Figura 1 Demo di Test T utilizzando c#

Il secondo set di dati è {81, 72, 67, 81, 71, 70, 82, 81}. Si può immaginare che questi sono i punteggi dei 10 femmine, test in due delle femmine rilasciato per qualche motivo, lasciando solo otto punteggi. La media del primo set di dati è 86.22 e la media del secondo set di dati è 75.63, che suggerisce che il mezzo di due gruppi non è uguali perché non esiste una differenza di quasi 11 punti. Tuttavia, anche se i punteggi medi complessivo dei due gruppi (tutti maschi e femmine tutti) sono stati infatti gli stessi, perché vengono utilizzati solo gli esempi, la differenza tra le medie di esempio potrebbe essersi verificato per caso.

Utilizzando i set di dati di due campioni, il programma demo calcola una "statistica" (t) con valore 14.937 valore 3.4233 e "gradi di libertà" (spesso abbreviato in df o indicato da nu la lettera minuscola greco, ν). Quindi, utilizzando i valori t e df, probabilità (valore p) viene calcolato un valore, con valore 0.00379. Sono disponibili diversi tipi di test t. Probabilmente il più comune viene chiamato il test t di Student. La demo utilizza una variante migliorata denominata Welch t-test.

Il valore di p è la probabilità che le medie true delle due popolazioni (tutti maschi e femmine) siano effettivamente la stessa, dato i punteggi di esempio e, pertanto, che la differenza di circa 11 punti osservata è stato eseguito per probabilità. In questo caso, il valore di p è molto piccolo, pertanto si potrebbe concludere che le medie di tutti i maschi e femmine tutte true non sono uguali. Nella maggior parte dei problemi, le critico p-valore per il confronto con il valore calcolato di p arbitrariamente è definito come 0,01 o 0,05.

PUT in modo diverso, la media true punteggi per tutti i maschi e femmine sono gli stessi, la probabilità che si vedrà differenze di quasi 11 punti in due medie di esempio di dimensione nove e otto è solo 0.00379, estremamente improbabile.

In questo articolo si presuppone che si dispone di almeno intermedi delle competenze di programmazione, ma non che si conoscono i test t. La demo è codificata tramite c#, ma si dovrebbe essere difficile se si desidera il refactoring del codice in un altro linguaggio, ad esempio Visual Basic .NET o JavaScript.

Le informazioni sulla distribuzione T

T-test è in base alla distribuzione di t. E la distribuzione t è strettamente correlata alla normale (anche denominato gaussiana o a campana) distribuzione. La forma di una distribuzione normale set di dati dipende sia la media e la deviazione standard dei dati. La deviazione standard è un valore che misura le modalità di diffusione, o variabile, i dati sono. Un caso speciale è quando la media (spesso indicata da mu greco, µ) è 0 e la deviazione standard (spesso abbreviato in lingua inglese come sd o indicato da sigma greco, σ, è 1. La distribuzione normale con Media = 0 e sd = 1 viene chiamata la distribuzione normale standard. Il grafico viene visualizzato Figura 2.

La distribuzione normale Standard
Figura 2 la distribuzione normale Standard

In Figura 2, l'equazione che definisce la distribuzione normale standard viene chiamata la funzione di densità di probabilità. La distribuzione t è molto simile alla distribuzione normale. La forma di una distribuzione t dipende da un singolo valore chiamato "gradi di libertà". La distribuzione t con df = 5 è illustrato nella Figura 3.

In Figura 3, l'equazione che definisce la distribuzione t implica la funzione Gamma, indicata dalla lettera greca maiuscola gamma (Γ). Per eseguire un test t, è necessario calcolare e sommare due aree identiche sotto la curva della distribuzione t. Quest'area combinato è il valore di p. Ad esempio, in Figura 3, se il valore di t è 2.0, le aree sotto la curva è necessario combinate sono compresi tra - infinity-2.0 e + 2.0 a + infinity. In questo caso l'area combinata, ovvero il valore di p è 0.101939. Per il programma demo, quando t = 3.4233, l'area combinato è 0.00379.

La distribuzione T
Figura 3, la distribuzione T

È possibile calcolare OK, ma come è possibile l'area sotto la distribuzione t? Esistono diversi approcci a questo problema, ma la tecnica più comune consiste nel calcolare una sola area associata sotto la curva di distribuzione normale standard da utilizzare per calcolare il valore di p. Ad esempio, in Figura 2, se z (l'equivalente di t normale) ha valore-2.0, è possibile calcolare l'area da - infinito-2.0, ovvero 0.02275. Questa area sotto la curva normale può essere quindi utilizzata per calcolare l'area corrispondente in t-distribuzione.

Per riepilogare, per eseguire un test t deve calcolare e quindi sommare due aree (uguale) in una distribuzione t. Quest'area viene chiamata il valore di p. A tale scopo, è possibile calcolare una sola area sotto la distribuzione normale standard e quindi utilizzare tale area per ottenere il valore di p.

Il calcolo dell'Area sotto la distribuzione normale Standard

Esistono diversi modi per calcolare l'area sotto la curva di distribuzione normale standard. Questo è uno dei problemi meno recenti in informatica. Il mio metodo preferito consiste nell'utilizzare cosiddetto algoritmo ACM 209 #. L'associazione per Computing Machinery (ACM) ha pubblicato molti algoritmi fondamentali per il calcolo numerico e statistiche.

Un'implementazione dell'algoritmo 209 # in c# è presentata in Figura 4 come funzione di Gauss. La funzione accetta un valore z, compreso tra - infinito e + infinity e restituisce un'approssimazione molto vicina per l'area sotto la distribuzione normale standard da - infinito a z.

Figura 4 il calcolo dell'Area sotto la distribuzione normale Standard

public static double Gauss(double z)
{
  // input = z-value (-inf to +inf)
  // output = p under Standard Normal curve from -inf to z
  // e.g., if z = 0.0, function returns 0.5000
  // ACM Algorithm #209
  double y; // 209 scratch variable
  double p; // result. called 'z' in 209
  double w; // 209 scratch variable
  if (z == 0.0)
    p = 0.0;
  else
  {
    y = Math.Abs(z) / 2;
    if (y >= 3.0)
    {
      p = 1.0;
    }
    else if (y < 1.0)
    {
      w = y * y;
      p = ((((((((0.000124818987 * w
        - 0.001075204047) * w + 0.005198775019) * w
        - 0.019198292004) * w + 0.059054035642) * w
        - 0.151968751364) * w + 0.319152932694) * w
        - 0.531923007300) * w + 0.797884560593) * y * 2.0;
    }
    else
    {
      y = y - 2.0;
      p = (((((((((((((-0.000045255659 * y
        + 0.000152529290) * y - 0.000019538132) * y
        - 0.000676904986) * y + 0.001390604284) * y
        - 0.000794620820) * y - 0.002034254874) * y
        + 0.006549791214) * y - 0.010557625006) * y
        + 0.011630447319) * y - 0.009279453341) * y
        + 0.005353579108) * y - 0.002141268741) * y
        + 0.000535310849) * y + 0.999936657524;
    }
  }
  if (z > 0.0)
    return (p + 1.0) / 2;
  else
    return (1.0 - p) / 2;
}

Anche un rapido sguardo al codice in Figura 4 deve convincere utilizzando un algoritmo esistente, ad esempio ACM #209, che è molto più facile che codifica la propria implementazione da zero. Un'alternativa all'ACM #209 consiste nell'utilizzare una lieve modifica dell'equazione 7.1.26 da "Per l'uso di funzioni matematiche" Milton Abramowitz e Irene A. Stegun (Dover pubblicazioni, 1965).

Il calcolo dell'Area sotto la distribuzione T

Con un'implementazione della funzione di Gauss a disposizione, l'area sotto la distribuzione t può essere calcolato utilizzando l'algoritmo ACM 395 #. Un'implementazione dell'algoritmo 395 # in c# è presentata in Figura 5 come funzione degli studenti. La funzione accetta un valore di t e il valore df e restituisce l'area combinato da - infinito a t e t + infinito.

Figura 5, il calcolo dell'Area sotto la distribuzione t

public static double Student(double t, double df)
{
  // for large integer df or double df
  // adapted from ACM algorithm 395
  // returns 2-tail p-value
  double n = df; // to sync with ACM parameter name
  double a, b, y;
  t = t * t;
  y = t / n;
  b = y + 1.0;
  if (y > 1.0E-6) y = Math.Log(b);
  a = n - 0.5;
  b = 48.0 * a * a;
  y = a * y;
  y = (((((-0.4 * y - 3.3) * y - 24.0) * y - 85.5) /
    (0.8 * y * y + 100.0 + b) + y + 3.0) / b + 1.0) *
    Math.Sqrt(y);
  return 2.0 * Gauss(-y); // ACM algorithm 209
}

Algoritmo 395 # dispone di due forme. Una forma accetta il parametro df come valore integer e il secondo formato accetta df come un valore di tipo double. Nella maggior parte dei problemi delle statistiche, i gradi di libertà è un valore intero, ma il test t Welch utilizza un valore di tipo double.

Il programma Demo

Per creare il programma demo, ho avviato Visual Studio e creato una nuova applicazione console c# denominata test. La demo non è presenti dipendenze di versione .NET significative, in modo che qualsiasi versione di Visual Studio dovrebbe funzionare. Dopo che il codice del modello caricato nell'editor, eliminato tutti utilizzando istruzioni ad eccezione di riferimento singolo per il livello principale dello spazio dei nomi System. Nella finestra Esplora soluzioni è rinominato il file Program.cs in TTestProgram.cs e Visual Studio rinominare automaticamente class Program per me è consentito.

Il programma demo è un po' troppo lungo per la presentazione nella sua interezza qui, ma è possibile trovare il codice sorgente completo nel download del file che accompagna questo articolo. Il metodo Main inizia con la configurazione e la visualizzazione di due set di dati di esempio:

Console.WriteLine("\nBegin Welch's t-test using C# demo\n");
var x = new double[] { 88, 77, 78, 85, 90, 82, 88, 98, 90 };
var y = new double[] { 81, 72, 67, 81, 71, 70, 82, 81 };
Console.WriteLine("\nThe first data set (x) is:\n");
ShowVector(x, 0);
Console.WriteLine("\nThe second data set (y) is:\n");
ShowVector(y, 0);

Tutto il lavoro viene eseguita in un metodo denominato test:

Console.WriteLine("\nStarting Welch's t-test using C#\n");
TTest(x, y);
Console.WriteLine("\nEnd t-test demo\n");
Console.ReadLine();

La definizione di metodo di test inizia sommando i valori in ogni set di dati:

public static void TTest(double[] x, double[] y)
{
  double sumX = 0.0;
  double sumY = 0.0;
  for (int i = 0; i < x.Length; ++i)
    sumX += x[i];
  for (int i = 0; i < y.Length; ++i)
    sumY += y[i];
...

Successivamente, le somme vengono utilizzate per calcolare i due modi di esempio:

int n1 = x.Length;
int n2 = y.Length;
double meanX = sumX / n1;
double meanY = sumY / n2;

Successivamente, vengono utilizzati due metodi per calcolare le due variazioni di esempio:

double sumXminusMeanSquared = 0.0; // Calculate variances
double sumYminusMeanSquared = 0.0;
for (int i = 0; i < n1; ++i)
  sumXminusMeanSquared += (x[i] - meanX) * (x[i] - meanX);
for (int i = 0; i < n2; ++i)
  sumYminusMeanSquared += (y[i] - meanY) * (y[i] - meanY);
double varX = sumXminusMeanSquared / (n1 - 1);
double varY = sumYminusMeanSquared / (n2 - 1);

La varianza di un set di dati è il quadrato della deviazione standard, pertanto la deviazione standard è la radice quadrata della varianza e il test t funziona con varianze. Successivamente, viene calcolata la statistica t:

double top = (meanX - meanY);
double bot = Math.Sqrt((varX / n1) + (varY / n2));
double t = top / bot;

In parole, la statistica t è la differenza tra due valori medi di esempio, diviso la radice quadrata della somma delle variazioni diviso per le dimensioni di esempio associato. Successivamente, viene calcolato i gradi di libertà:

double num = ((varX / n1) + (varY / n2)) *
  ((varX / n1) + (varY / n2));
double denomLeft = ((varX / n1) * (varX / n1)) / (n1 - 1);
double denomRight = ((varY / n2) * (varY / n2)) / (n2 - 1);
double denom = denomLeft + denomRight;
double df = num / denom;

Il calcolo dei gradi di libertà per il test t Welch è piuttosto difficile e l'equazione non è affatto ovvia. Fortunatamente, non sarà necessario modificare questo calcolo. Metodo di test si conclude il calcolo del valore di p e visualizzando tutti i valori calcolati:

...
  double p = Student(t, df); // Cumulative two-tail density
  Console.WriteLine("mean of x = " + meanX.ToString("F2"));
  Console.WriteLine("mean of y = " + meanY.ToString("F2"));
  Console.WriteLine("t = " + t.ToString("F4"));
  Console.WriteLine("df = " + df.ToString("F3"));
  Console.WriteLine("p-value = " + p.ToString("F5"));
  Explain();
}

Il metodo definito dal programma denominato esplicativo Visualizza le informazioni che spiegano l'interpretazione del valore p, come illustrato nella Figura 1.

Alcuni commenti

Esistono infatti diversi tipi di problemi di statistiche che implicano il test t. Il tipo di problema descritto in questo articolo è detta un test t non in quanto non esiste alcuna connessione concettuale tra i valori dei dati in ogni set di dati di esempio. Un altro tipo di test t viene chiamato un test di esempio associato, che può essere utilizzato quando si dispone di alcune specie di prima e dopo i dati, ad esempio un punteggio di test prima di alcuni istruzione seguita da un punteggio di test dopo l'istruzione. In questo caso, ogni coppia di punteggi è concettualmente correlato.

Il test di t Welch presentato in questo articolo è superiore ai più comuni test t di Student nella maggior parte degli scenari. Il test t di Student in genere richiede un numero uguale di punti dati in ognuno dei due set di dati di esempio e richiede che le variazioni dei due esempi siano uguali. Test t Welch possibile lavorare con dimensioni campione diversi ed è affidabile anche quando gli scostamenti di esempio sono diversi.

Il tipo di test t descritte in questo articolo viene chiamato un test a due code. È più o meno un sinonimo di un problema di cui l'obiettivo consiste nel determinare se due metodi di gruppo sono uguali. In situazioni in cui l'obiettivo consiste nel determinare se la media di un gruppo è superiore alla media del secondo gruppo, è possibile utilizzare un test di t una coda. Quando si esegue un test di t una coda, il valore di p due code dividere per 2.

Dovrebbe essere molto conservativa nell'interpretazione dei risultati di un test t. È molto meglio rispetto a una conclusione simile a "basata su un valore di p calcolato test t di 0,008 concludo che è improbabile che la popolazione true di maschi e femmine sono gli stessi", "il valore di p 0.008 indica la media dei voti di maschi è maggiore di quelli di femmine".

In alternativa al test t è denominata test Mann-Whitney U. Entrambe le tecniche dedurre se due popolazioni sono uguali o non basate su esempi, ma il test U Mann-Whitney presupposti meno statistici, con la conseguente conclusioni più conservative (hanno meno probabilità di concludere i mezzi in esame sono diversi).

Il test t è limitato a situazioni in cui sono presenti due gruppi. Per problemi di esaminare i mezzi per tre dei più gruppi, si utilizzerà un'analisi denominata test F.


Ripristino di emergenza. James McCaffreylavora per Microsoft Research a Redmond, Washington. Ha lavorato su numerosi prodotti Microsoft, inclusi Internet Explorer e Bing. Dr. È possibile contattarlo McCaffreyjammc@microsoft.com.

Grazie al seguente esperto tecnico presso Microsoft Research per la revisione dell'articolo: Kirk Olynyk