Condividi tramite



Ottobre 2016

Volume 31 Numero 10

Il presente articolo è stato tradotto automaticamente.

Esecuzione di test - ANOVA con C#

Da James McCaffrey

James McCaffreyAnalisi della varianza (ANOVA) è una tecnica di statistiche classico utilizzato per dedurre se i mezzi (medie) di tre o più gruppi sono tutti uguali, in situazioni in cui si dispone solo di dati di esempio. Si supponga, ad esempio, sono disponibili tre classi di scienza informatica introduttivo diversi in un'università. Ogni classe insegnato da insegnante stesso, ma utilizza un libro diversi, nonché una filosofia di insegnamento diversi. Si desidera sapere se le prestazioni degli studenti sono lo stesso o meno.

È necessario un esame che valuta l'idoneità all'uso di analisi scientifica dei computer su una scala uno-a-15, ma poiché l'esame è molto lunga e costosa, è possibile assegnare l'esame solo sei studenti selezionato in modo casuale in ogni classe. È l'esame di amministrare ed eseguire analisi VARIANZA negli esempi di dedurre se i mezzi per tutte e tre le classi sono le stesse o non.

Se si ha familiarità con VARIANZA, il nome della tecnica può confondere modo moderato poiché l'obiettivo consiste nell'analizzare i mezzi per set di dati. VARIANZA è come se fosse perché dietro le quinte analizza le varianze per eseguire inferenze sulla mezzi.

Un buon metodo per ottenere un'idea delle possibilità di VARIANZA e vedere futuro in questo articolo è di ottenere un quadro il programma demo in Figura 1. La demo imposta hardcoded punteggi per tre gruppi. Si noti che sono presenti solo quattro punteggi in Group1 e i punteggi solo cinque in gruppo 3: è molto comune per le dimensioni di esempio venga fatta poiché possono eliminare oggetti di test o dati possono essere persi o danneggiati.

VARIANZA con il programma Demo c#
Figura 1 VARIANZA con il programma Demo c#

Esistono due passaggi principali di VARIANZA. Nel primo passaggio, un valore di statistica F e una coppia di valori denominati "gradi di libertà al" (df) vengono calcolati utilizzando i dati di esempio. Nel secondo passaggio, i valori di F e df vengono utilizzati per determinare la probabilità che tutti i mezzi di popolazione sono uguali (il valore p). Il primo passaggio è relativamente facile. Il secondo passaggio è molto difficile.

Nella demo, il valore di F è 15.884. In generale, più grande F è meno probabile è che tutti i mezzi di popolazione sono uguali. Spiegherò perché df = (2, 12) a breve. Utilizza F e df, il valore di p è calcolato 0.000425. Si tratta molto piccolo, pertanto si potrebbe concludere che la popolazione sono probabilmente non gli stessi. A questo punto, è possibile eseguire ulteriori test statistici per determinare quali popolazione sono diverse tra loro. Per dati di esempio, viene visualizzata tale Group1 (Media del campione = 4,50) è peggiore Group2 (significa = 9.67) e gruppo 3 (significa = 10.60).

Il programma Demo

Per creare il programma demo, avviato Visual Studio ha fatto clic sul File | Nuovo | Progetto e selezionare l'opzione di applicazione Console c#. Il programma demo dispone di alcuna dipendenza .NET significativi, in modo funzionerà qualsiasi versione di Visual Studio. Dopo che il codice del modello caricato nella finestra Esplora soluzioni, I pulsante destro del mouse sul file Program.cs e rinominato AnovaProgram.cs e Visual Studio rinominare automaticamente classe Program per me è consentito.

Nella parte superiore della finestra dell'editor, eliminato tutto inutili istruzioni using, lasciando solo quella che fa riferimento lo spazio dei nomi principale di sistema. Viene mostrata la struttura generale del programma Figura 2. Il programma demo è troppo lungo nel suo complesso, ma il codice sorgente di dimostrazione completo è disponibile nel download che accompagna questo articolo.

Struttura del programma Demo figura 2

using System;
namespace Anova
{
  class AnovaProgram
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Begin ANOVA using C# demo");
      // Set up sample data
      // Use data to calculate F and df
      // Use F and df to calculate p-value
      Console.WriteLine("End ANOVA demo");
    }
    static double Fstat(double[][] data, out int[] df) { . . }
    static double LogGamma(double z) { . . }
    static double BetaIncCf(double a, double b, double x) { . . }
    static double BetaInc(double a, double b, double x) { . . }
    static double PF(double a, double b, double x) { . . }
    static double QF(double a, double b, double x) { . . }
    static void ShowData(double[][] data, string[] colNames) { . . }
  }
}

Metodo statico Fstat calcola e restituisce una statistica F in base ai dati archiviati in un oggetto matrice di matrici. Il metodo inoltre calcola e restituisce due valori di gradi di libertà in un parametro out di matrice. Funzione ShowData è solo una piccola funzione di supporto per visualizzare i mezzi di esempio.

I cinque metodi restanti vengono utilizzati per calcolare il valore di p. Metodo QF è il principale metodo. Chiama metodo PF, che a sua volta chiama il metodo BetaInc, che a sua volta chiama i metodi BetaIncCf e LogGamma.

Dopo alcuni messaggi WriteLine preliminare, il metodo Main imposta e visualizza i dati di esempio:

double[][] data = new double[3][]; // 3 groups
data[0] = new double[] { 3, 4, 6, 5 };
data[1] = new double[] { 8, 12, 9, 11, 10, 8 };
data[2] = new double[] { 13, 9, 11, 8, 12 };
string[] colNames = new string[] {  "Group1", "Group2", "Group3" };
ShowData(data, colNames);

In uno scenario non demo, i dati verrebbero probabilmente archiviati in un file di testo e scrivere una funzione di supporto per la lettura e caricare i dati in una matrice di matrici.

La statistica F e df vengono calcolate come segue:

int[] df = null;
double F = Fstat(data, out df);

Per la VARIANZA, df per un set di dati è una coppia di valori. Il primo valore è K - 1 dove K è il numero di gruppi, e il secondo valore è N - K dove N è il numero totale di valori di esempio. Per i dati di esempio, df = (K-1, N-K) = (3-1, 15-3) = (2, 12).

Il valore di p è calcolato e visualizzato simile al seguente:

double pValue = QF(df[0], df[1], F);
Console.Write("p-value = ");

In breve, quando si esegue un'analisi di VARIANZA, le istruzioni di chiamata sono molto semplici. Ma è molto lavoro che va in dietro le quinte.

Calcolare la statistica F

Il calcolo del valore di una statistica F dispone di diversi passaggi secondari. Si supponga che i valori dei dati di esempio sono quelle demo:

Group1: 3.00, 4.00, 6.00, 5.00
Group2: 8.00, 12.00, 9.00, 11.00, 10.00, 8.00
Group3: 13.00, 9.00, 11.00, 8.00, 12.00

Il primo passaggio secondario consiste nel calcolare i mezzi per ogni gruppo e la media complessiva di tutti i valori di esempio. Per i dati demo:

means[0] = (3.0 + 4.0 + 6.0 + 5.0) / 4 = 4.50
means[1] = (8.0 + 12.0 + 9.0 + 11.0 + 10.0 + 8.0) / 6 = 9.67
means[2] = (13.0 + 9.0 + 11.0 + 8.0 + 12.0) / 5 = 10.60
gMean = (3.0 + 4.0 + . . . + 12.0) / 15 = 8.60

La definizione di metodo Fstat inizia con:

static double Fstat(double[][] data, out int[] df)
{
  int K = data.Length; // Number groups
  int[] n = new int[K]; // Number items each group
  int N = 0; // total number data points
  for (int i = 0; i < K; ++i) {
    n[i] = data[i].Length;
    N += data[i].Length;
  }
...

A questo punto, n matrice locale è il numero di valori in ogni gruppo, K è il numero di gruppi e N è il numero totale di valori in tutti i gruppi. Successivamente, i mezzi di gruppo vengono calcolati in una matrice denominata mezzi, e viene calcolata la media totale complessivo in gMean variabile:

double[] means = new double[K];
double gMean = 0.0;
for (int i = 0; i < K; ++i) {
  for (int j = 0; j < data[i].Length; ++j) {
    means[i] += data[i][j];
    gMean += data[i][j];
  }
  means[i] /= n[i];
}
gMean /= N;

Il passo successivo consiste nel calcolare la "somma dei quadrati tra i gruppi" (SSb) e "quadratico medio tra i gruppi" (MSb). SSb è la somma ponderata dei quadrati delle differenze tra ogni Media di gruppo e la media globale. MSb = SSb / (K-1) dove K è il numero di gruppi. Per i dati demo:

SSb = (4 * (4.50 - 8.60)^2) +
 (6 * (9.67 - 8.60)^2) +
 (5 * (10.60 - 8.60)^2) = 94.07
MSb = 94.07 / (3-1) = 47.03

Il codice che calcola SSb e il byte più significativo è:

double SSb = 0.0;
for (int i = 0; i < K; ++i)
  SSb += n[i] * (means[i] - gMean) * (means[i] - gMean);
double MSb = SSb / (K - 1);

Il passo successivo consiste nel calcolare la "somma dei quadrati all'interno di gruppi" (SSw) e "quadratico medio all'interno di gruppi (MSw). SSw è la somma dei quadrati delle differenze tra ogni valore di esempio e la media di gruppo. MSw = SSw / (N-K). Per i dati demo:

SSw = (3.0 - 4.50)^2 + . . + (8.0 - 9.67)^2 +
 . . + (12.0 - 10.60)^2 = 35.53
MSw = 35.53 / (15-3) = 2.96

Il codice per il calcolo SSw e MSw è:

double SSw = 0.0;
for (int i = 0; i < K; ++i)
  for (int j = 0; j < data[i].Length; ++j)
    SSw += (data[i][j] - means[i]) * (data[i][j] - means[i]);
double MSw = SSw / (N - K);

Il passaggio secondario finale consiste nel calcolare i due valori di gradi di libertà e la statistica F. I due valori di gradi di libertà sono K - 1 e N - K. E F = MSb / MSw. Per i dati demo:

df = (K-1, N-K) = (3-1, 15-3) = (2, 12)
F = 47.03 / 2.96 = 15.88.

Il codice demo che calcola i gradi di libertà e F è:

...
  df = new int[2];
  df[0] = K - 1;
  df[1] = N - K;
  double F = MSb / MSw;
  return F;
} // Fstat

Penso che si convenga calcolando una statistica F e df valori da un set di dati è relativamente semplice e meccanico quando si conoscono le equazioni matematiche.

Il calcolo del valore di p

Conversione di una statistica F e df valori in un p-valore che indica la probabilità che tutti i mezzi di popolazione sono uguali in base ai dati di esempio che producono F e df è semplice in linea di principio, ma estremamente difficile in pratica. Spiegherò come brevemente possibile, escludendo un'enorme quantità di dettagli che richiederebbero una quantità enorme di spiegazione aggiuntiva. Esaminiamo il grafico in Figura 3.

Il calcolo del valore p da una statistica F e df valori
Figura 3 il calcolo del valore p da una statistica F e df valori

Ogni possibile coppia di valori di gradi di libertà determina un grafico denominato distribuzione F. La forma di una distribuzione F può variare notevolmente in base ai valori di gradi di libertà. Il grafico in Figura 3 illustra una distribuzione F per df = (4, 12). Ho utilizzato df = (4, 12) anziché il df = (2, 12) dai dati demo perché la forma dei gradi di libertà = (2, 12) distribuzione F è atipica molto.

L'area totale in qualsiasi distribuzione F è 1.0. Se si conosce il valore della statistica F, il valore di p è l'area sotto la distribuzione F da F a infinito positivo. In qualche modo confusione, l'area sotto la distribuzione F da zero per la statistica F viene spesso definito PF e l'area sotto la distribuzione F da statistica F all'infinito positivo (che rappresenta il valore di p) viene spesso definito QF. Poiché l'area totale sotto la distribuzione è 1 e PF + QF = 1. Si scopre che è un po' più semplice calcolare PF rispetto QF, pertanto, per trovare il valore di p (QF), in genere calcolare PF quindi che sottrarre da 1 a ottenere QF.

Il calcolo delle cartelle pubbliche NON è difficile brutally ma, per fortuna, sono noto che le equazioni di stima magic per decenni. Le equazioni matematiche e centinaia di altri utenti, sono disponibili in un riferimento famoso, "Per l'uso di funzioni matematiche" Abramowitz M. e si Stegun. Il libro viene spesso definito semplicemente "A & S" tra i programmatori scientifici. Ogni equazione a & S è un numero ID.

Nella demo, metodo PF è semplicemente un wrapper per metodo BetaInc:

static double PF(double a, double b, double x)
{
  double z = (a * x) / (a * x + b);
  return BetaInc(a / 2, b / 2, z);
}

Il nome del metodo BetaInc è l'acronimo di "Beta incompleta". Metodo BetaInc utilizza equazioni a & S 6.6.2 e 26.5.8. Tali equazioni chiamano una funzione LogGamma e una funzione BetaIncCf. La funzione LogGamma è estremamente difficile per descrivere e implementare. In breve, la funzione Gamma matematica estende la nozione di fattoriale in numeri con valori reali. Analogamente fattoriali, i valori della funzione Gamma possono diventare astronomically di grandi dimensioni, pertanto per gestirli è comune per calcolare il log della Gamma mantenere i valori più piccoli.

Il calcolo LogGamma è troppo complessa ed esistono diversi algoritmi che è possibile utilizzare. Il programma demo utilizza un algoritmo, l'approssimazione Lanczos con (g = 5, n = 7). Il riferimento a & S è possono calcolare LogGamma da diversi algoritmi, ma l'approssimazione Lanczos, che non era noto quando è stata pubblicata a & S, offre risultati più accurati.

Il nome del metodo BetaIncCf è l'acronimo di "Beta incompleto calcolato da frazione" Continua "." Il programma demo utilizza equazione a & S 26.5.8 per metodo BetaIncCf.

Conclusioni

Un test ANOVA presuppone matematiche: che gli elementi di dati di gruppo sono matematicamente indipendenti. che vengono distribuiti i set di dati della popolazione normalmente (come la distribuzione di Gauss); e che i set di dati della popolazione uguale varianza.

Esistono diversi modi per verificare questi presupposti, ma è difficile interpretazione dei risultati. Il problema è che è molto improbabile che i dati reali esattamente normale ed sono esattamente uguale varianza, sebbene VARIANZA funziona comunque quando i dati sono alquanto non normal o ha varianze non uguale. La conclusione è che è molto difficile ottenere presupposti VARIANZA pertanto dovrebbe essere molto conservativo per l'interpretazione dei risultati.

VARIANZA è strettamente correlata al test t. Il test t determina se si intende il popolamento di esattamente due gruppi sono uguali, in situazioni in cui si dispone solo i dati di esempio. Pertanto, se si dispone di tre gruppi, come la demo, anziché mediante ANOVA, è possibile presumibilmente eseguire tre t-test, il confronto dei gruppi 1 e 2, i gruppi di 1 e 3 e 2 e 3. Tuttavia, questo approccio non è consigliato perché introduce cosiddetta un errore di tipo 1 (un falso positivo).

Il tipo di VARIANZA descritta in questo articolo viene denominato VARIANZA unidirezionale (o un fattore). Una tecnica diversa, denominata VARIANZA bidirezionale, viene utilizzata quando vi sono due fattori.

VARIANZA è basata sul valore calcolato di una statistica F da un set di dati. Esistono altri test statistici che utilizzano una statistica F. Ad esempio, è possibile utilizzare una statistica F per dedurre se le varianze di due gruppi di dati sono uguali.


Ripristino di emergenza. James McCaffrey lavora per Microsoft Research a Redmond, Washington.  Ha lavorato di diversi prodotti Microsoft, inclusi Internet Explorer e Bing. Dr. È possibile contattarlo McCaffrey jammc@microsoft.com.

Grazie per i seguenti esperti tecnici Microsoft che ha esaminato in questo articolo: Kirk Olynk e Chris Lee